NFS ประสิทธิภาพการเขียนไม่ดี


20

ฉันมีสองเครื่องเชื่อมต่อกับ 10Gbit Ethernet ให้หนึ่งในนั้นคือเซิร์ฟเวอร์ NFS และอีกอันจะเป็นไคลเอนต์ NFs

การทดสอบความเร็วของเครือข่ายผ่าน TCP ด้วยการiperfแสดงปริมาณข้อมูลที่ ~ 9.8 Gbit / s ในทั้งสองทิศทางดังนั้นเครือข่ายจึงใช้ได้

ทดสอบประสิทธิภาพดิสก์ของเซิร์ฟเวอร์ NFS:

dd if=/dev/zero of=/mnt/test/rnd2 count=1000000

ผลลัพธ์คือ ~ 150 MBytes / s ดังนั้นดิสก์จึงทำงานได้ดีสำหรับการเขียน

เซิร์ฟเวอร์/etc/exportsคือ:

/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)

ไคลเอนต์เมาท์การแชร์นี้เป็นภายในเครื่อง/mnt/testด้วยตัวเลือกต่อไปนี้:

node02:~ # mount | grep nfs
192.168.1.101:/mnt/test on /mnt/test type nfs4 (rw,relatime,sync,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.102,local_lock=none,addr=192.168.1.101)

หากฉันพยายามดาวน์โหลดไฟล์ขนาดใหญ่ (~ 5Gb) บนเครื่องไคลเอ็นต์จากการแชร์ NFS ฉันจะได้รับประสิทธิภาพการทำงานที่ ~ 130-140 MBytes / s ซึ่งใกล้เคียงกับประสิทธิภาพของดิสก์ในเครื่องของเซิร์ฟเวอร์ดังนั้นจึงเป็นที่น่าพอใจ

แต่เมื่อฉันลองอัปโหลดไฟล์ขนาดใหญ่ไปยังการแบ่งปัน NFS การอัปโหลดเริ่มต้นที่ ~ 1.5 Mbytes / s ค่อยๆเพิ่มขึ้นถึง 18-20 Mbytes / s และหยุดเพิ่มขึ้น บางครั้งการแชร์ "แฮงค์" เป็นเวลาสองสามนาทีก่อนที่การอัปโหลดจะเริ่มขึ้นจริงนั่นคือการรับส่งข้อมูลระหว่างโฮสต์จะใกล้เคียงกับศูนย์และหากฉันดำเนินการls /mnt/testก็จะไม่กลับมาในช่วงหนึ่งหรือสองนาที จากนั้นlsคำสั่งจะส่งคืนและอัปโหลดเริ่มต้นที่ความเร็วเริ่มต้น 1.5Mbit / s

เมื่อความเร็วในการอัพโหลดถึงค่าสูงสุด (18-20 Mbytes / s) ฉันจะเรียกใช้iptraf-ngและมันจะแสดงปริมาณการรับส่งข้อมูล ~ 190 Mbit / s บนอินเทอร์เฟซเครือข่ายดังนั้นเครือข่ายจึงไม่ใช่คอขวดเช่นเดียวกับ HDD ของเซิร์ฟเวอร์

สิ่งที่ฉันพยายาม:

1. ตั้งค่าเซิร์ฟเวอร์ NFS บนโฮสต์ที่สามซึ่งเชื่อมต่อกับ 100Mbit Ethernet NIC เท่านั้น ผลลัพธ์เป็นแบบอะนาล็อก: DL แสดงประสิทธิภาพที่ดีและการใช้เครือข่ายเกือบเต็ม 100Mbit การอัปโหลดไม่ทำงานเร็วกว่าร้อยกิโลไบต์ต่อวินาทีทำให้การใช้เครือข่ายต่ำมาก (2.5 Mbit / s ตามiptraf-ng)

2. ฉันพยายามปรับพารามิเตอร์ NFS:

  • sync หรือ async

  • noatime

  • ไม่ hard

  • rsizeและwsizeสูงสุดในตัวอย่างของฉันดังนั้นฉันพยายามลดลงในหลายขั้นตอนจนถึง 8192

3. ฉันพยายามสลับเครื่องไคลเอนต์และเซิร์ฟเวอร์ (ตั้งค่าเซิร์ฟเวอร์ NFS บนไคลเอนต์เก่าและในทางกลับกัน) ยิ่งไปกว่านั้นมีเซิร์ฟเวอร์อีกหกตัวที่มีการกำหนดค่าเดียวกันดังนั้นฉันจึงลองเชื่อมต่อเข้าด้วยกันในรูปแบบที่แตกต่างกัน ผลลัพธ์เดียวกัน

4. MTU = 9000, MTU = 9000 และ 802.3ad การรวมลิงก์, การรวมลิงก์กับ MTU = 1500

5. การปรับ sysctl:

node01:~ # cat /etc/sysctl.conf 
net.core.wmem_max=16777216
net.core.rmem_max=16777216
net.ipv4.tcp_rmem= 10240 873800 16777216
net.ipv4.tcp_wmem= 10240 873800 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.core.netdev_max_backlog = 5000

ผลลัพธ์เดียวกัน

6. เมาท์จาก localhost:

node01:~ # cat /etc/exports
/mnt/test *(rw,no_root_squash,insecure,sync,no_subtree_check)
node01:~ # mount -t nfs -o sync localhost:/mnt/test /mnt/testmount/

และที่นี่ฉันก็ได้ผลเหมือนกัน: ดาวน์โหลดจาก/mnt/testmount/เร็วอัปโหลดไป/mnt/testmount/ช้ามากไม่เร็วกว่า 22 MBytes / s และมีความล่าช้าเล็กน้อยก่อนที่จะเริ่มการถ่ายโอนจริง ๆ มันหมายความว่า stack network ทำงานได้อย่างไร้ที่ติและปัญหาอยู่ใน NFS หรือไม่?

ทั้งหมดนี้ไม่ได้ช่วยผลที่ได้ไม่แตกต่างอย่างมากจากการกำหนดค่าเริ่มต้น echo 3 > /proc/sys/vm/drop_cachesถูกดำเนินการก่อนการทดสอบทั้งหมด

MTU ของ NICS ทั้งหมดที่โฮสต์ทั้งหมด 3 แห่งคือ 1500 ไม่มีการปรับจูนเครือข่ายที่ไม่ได้มาตรฐาน สวิตช์อีเธอร์เน็ตคือ Dell MXL 10 / 40Gbe

ระบบปฏิบัติการคือ CentOS 7

node01:/mnt/test # uname -a
Linux node01 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

การตั้งค่าใดที่ฉันขาดหายไป วิธีทำให้ NFS เขียนได้อย่างรวดเร็วและไม่มีการหยุดทำงาน?


1
คุณมีกรณีทดสอบที่ค่อนข้างดี แต่ฉันลองติดตั้งบนเซิร์ฟเวอร์และเขียนจากที่นั่นด้วยวิธีนี้คุณสามารถรู้ได้ว่าสแต็ก NFS หรือสแต็กเครือข่ายเป็นความผิด ลองเปลี่ยนเซิร์ฟเวอร์และไคลเอนต์ (ส่งออกจากไคลเอนต์เมาท์บนเซิร์ฟเวอร์) และใช้ไคลเอ็นต์อื่นโดยสิ้นเชิง การบีบอัดกระบวนการเซิร์ฟเวอร์ / ไคลเอ็นต์ไม่ได้เปิดเผยอะไรเลย?
Dalibor Karlović

@ DaliborKarlovićฉันลองทั้งหมดยกเว้น strace และเพิ่มข้อมูลให้กับคำถาม เมานต์จาก localhost ทำงานได้ช้าดังนั้นระบบเครือข่ายสแต็กและสวิตช์จึงไม่ผิด ฉันใช้ kernel-space NFS และOperation not permittedพยายามเชื่อม strace กับกระบวนการ NFS
Sergey

ฉันถือว่านี่หมายความว่าคุณสามารถแยกแยะเครือข่ายสแต็คออกได้อย่างสมบูรณ์ คุณควรจะสามารถ strace กระบวนการใด ๆ ในฐานะผู้ใช้รูทหากไม่โดนบั๊กที่แน่นอน
Dalibor Karlović

@ DaliborKarlovićแน่นอนฉันพยายาม strace เป็นราก ฉันสามารถแนบกับกระบวนการ userspace ใด ๆ แต่ไม่สามารถ kernelspace แต่ฉันจะได้รับข้อมูลอะไรจากมัน? ฉันคิดว่ามันจะสร้างผลงานออกมาหลายแสนบรรทัดถ้าฉันแนบไปกับ NFS และเริ่มอัพโหลด ฉันควรให้ความสนใจกับค่าส่งคืนที่ไม่ใช่ศูนย์หรือไม่
Sergey

คุณพูดถูกฉันไม่ได้คิดว่ามันเป็นกระบวนการที่ไม่ใช่ของผู้ใช้ ฉันคาดหวังว่าจะเห็นสิ่งที่ทำในขณะที่ "แฮงค์" ในตอนเริ่มต้นของการถ่ายโอนมันอาจเป็นเรื่องเล็กน้อยเช่นการค้นหา DNS แบบย้อนกลับที่กำหนดค่าผิด
Dalibor Karlović

คำตอบ:


3

คุณใช้ตัวเลือกการซิงค์ในคำสั่งส่งออกของคุณ ซึ่งหมายความว่าเซิร์ฟเวอร์ยืนยันการดำเนินการเขียนเท่านั้นหลังจากเขียนลงดิสก์จริง ให้คุณมีดิสก์หมุน (เช่นไม่มี SSD) นี้ต้องการโดยเฉลี่ยอย่างน้อย 1/2 การปฏิวัติของดิสก์ต่อการดำเนินการเขียนซึ่งเป็นสาเหตุของการชะลอตัว

เมื่อใช้การตั้งค่า async เซิร์ฟเวอร์จะรับทราบการดำเนินการเขียนไปยังไคลเอ็นต์ทันทีเมื่อถูกประมวลผล แต่ยังไม่ได้เขียนลงดิสก์ นี่เป็นสิ่งที่ไม่น่าเชื่อถือมากขึ้นอีกเล็กน้อยเช่นในกรณีที่ไฟฟ้าขัดข้องเมื่อลูกค้าได้รับ ack สำหรับการดำเนินการที่ไม่ได้เกิดขึ้น อย่างไรก็ตามมันให้ประสิทธิภาพการเขียนเพิ่มขึ้นอย่างมาก

(แก้ไข) ฉันเพิ่งเห็นว่าคุณทดสอบตัวเลือก async vs sync แล้ว อย่างไรก็ตามฉันเกือบจะแน่ใจว่านี่เป็นสาเหตุของปัญหาประสิทธิภาพการทำงานลดลงของคุณ - ฉันเคยมีสิ่งบ่งชี้เดียวกันกับการตั้งค่า idencitcal บางทีคุณอาจทดสอบอีกครั้ง คุณให้ตัวเลือก async ที่คำสั่งส่งออกของเซิร์ฟเวอร์และในการดำเนินการเมานต์ที่ไคลเอ็นต์ในเวลาเดียวกันหรือไม่?


+1 คำอธิบายที่เป็นไปได้มากที่สุดคือการปิดใช้งานการซิงค์ไม่ถูกต้อง
David Schwartz

2

อาจเป็นปัญหาที่เกี่ยวข้องกับขนาดแพ็คเก็ตและเวลาแฝง ลองทำสิ่งต่อไปนี้:

รายงานผลลัพธ์ของคุณกลับมา


ฉันลองเฟรมจัมโบ้ด้วย MTU = 9000 แต่ผลลัพธ์ก็เหมือนกัน ฉันยังลองใช้การรวมลิงค์กับ 802.3ad อีกครั้งไม่มีการเปลี่ยนแปลง ดังนั้นฉันจึงย้อนกลับการตั้งค่าทั้งหมดเหล่านี้เพื่อให้ใกล้เคียงกับสถานะเริ่มต้นมากที่สุด นอกจากนี้ฉันพยายามปรับแต่งnet.core.*และnet.ipv4.*sysctls แต่ฉันอาจทำการทดลองน้อยเกินไป ตกลงฉันจะทำการทดสอบเพิ่มเติมและจะรายงาน
Sergey

ฉันลองอีกครั้งเพื่อปรับ sysctls บนเซิร์ฟเวอร์และไคลเอนต์ แต่นั่นก็ไม่ได้ช่วย
Sergey

คุณเคยลองกับ UDP เป็นโปรโตคอลการขนส่งหรือไม่?
shodanshok

ฉันได้ลอง UDP (proto = udp ในตัวเลือกการเมานท์) แต่มันทำงานได้ช้ากว่า TCP 1-2 เมกะไบต์ / วินาที ผลลัพธ์คือการเมาต์เดียวกันจากโลคัลโฮสต์และจากรีโมตโฮสต์
Sergey

2

http://veerapen.blogspot.com/2011/09/tuning-redhat-enterprise-linux-rhel-54.html

การกำหนดค่าตัวกำหนดตารางเวลา Linux บนระบบที่มี RAID ฮาร์ดแวร์และการเปลี่ยนค่าเริ่มต้นจาก [cfq] เป็น [noop] ช่วยให้การปรับปรุง I / O

ใช้คำสั่ง nfsstat เพื่อคำนวณเปอร์เซ็นต์ของการอ่าน / เขียน ตั้งค่าอัตราส่วนแคชคอนโทรลเลอร์ RAID ให้ตรงกัน

สำหรับภาระงานจำนวนมากคุณจะต้องเพิ่มจำนวนเธรดเซิร์ฟเวอร์ NFS

กำหนดค่าเธรด nfs ให้เขียนโดยไม่ชักช้ากับดิสก์โดยใช้ตัวเลือก no_delay

บอกเคอร์เนล Linux ให้ล้างข้อมูลให้เร็วที่สุดเพื่อให้การเขียนนั้นถูกเก็บไว้ให้มีขนาดเล็กที่สุดเท่าที่จะทำได้ ในเคอร์เนล Linux ความถี่ของการเขียนเพจที่สกปรกสามารถควบคุมได้โดยพารามิเตอร์สองตัว

สำหรับการเขียนดิสก์ที่เร็วขึ้นให้ใช้ตัวเลือก filesystem data = journal และป้องกันการอัพเดตเวลาในการเข้าถึงไฟล์ซึ่งในตัวมันเองจะส่งผลให้ข้อมูลเพิ่มเติมถูกเขียนลงดิสก์ โหมดนี้จะเร็วที่สุดเมื่อข้อมูลจำเป็นต้องอ่านและเขียนลงดิสก์ในเวลาเดียวกันซึ่งมีประสิทธิภาพสูงกว่าโหมดอื่น ๆ ทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.