ฉันพบ fsync latencies ประมาณห้าวินาทีใน NFS datastores ใน ESXi ซึ่งถูกทริกเกอร์โดย VMs บางตัว ฉันสงสัยว่าอาจเกิดจาก VM ที่ใช้ NCQ / TCQ เนื่องจากสิ่งนี้ไม่ได้เกิดขึ้นกับไดรฟ์ IDE เสมือน
นี้สามารถทำซ้ำโดยใช้fsync-ทดสอบ (โดยเท็ด Ts'o) และioping ตัวอย่างเช่นการใช้ระบบถ่ายทอดสด Grml กับดิสก์ 8GB:
Linux 2.6.33-grml64:
root@dynip211 /mnt/sda # ./fsync-tester
fsync time: 5.0391
fsync time: 5.0438
fsync time: 5.0300
fsync time: 0.0231
fsync time: 0.0243
fsync time: 5.0382
fsync time: 5.0400
[... goes on like this ...]
นั่นคือ 5 วินาทีไม่ใช่มิลลิวินาที นี่คือการสร้าง IO-latencies บน VM ที่แตกต่างกันที่ทำงานบนโฮสต์และที่เก็บข้อมูลเดียวกัน :
root@grml /mnt/sda/ioping-0.5 # ./ioping -i 0.3 -p 20 .
4096 bytes from . (reiserfs /dev/sda): request=1 time=7.2 ms
4096 bytes from . (reiserfs /dev/sda): request=2 time=0.9 ms
4096 bytes from . (reiserfs /dev/sda): request=3 time=0.9 ms
4096 bytes from . (reiserfs /dev/sda): request=4 time=0.9 ms
4096 bytes from . (reiserfs /dev/sda): request=5 time=4809.0 ms
4096 bytes from . (reiserfs /dev/sda): request=6 time=1.0 ms
4096 bytes from . (reiserfs /dev/sda): request=7 time=1.2 ms
4096 bytes from . (reiserfs /dev/sda): request=8 time=1.1 ms
4096 bytes from . (reiserfs /dev/sda): request=9 time=1.3 ms
4096 bytes from . (reiserfs /dev/sda): request=10 time=1.2 ms
4096 bytes from . (reiserfs /dev/sda): request=11 time=1.0 ms
4096 bytes from . (reiserfs /dev/sda): request=12 time=4950.0 ms
เมื่อฉันย้าย VM แรกไปยังที่จัดเก็บในตัวเครื่องมันดูปกติดี:
root@dynip211 /mnt/sda # ./fsync-tester
fsync time: 0.0191
fsync time: 0.0201
fsync time: 0.0203
fsync time: 0.0206
fsync time: 0.0192
fsync time: 0.0231
fsync time: 0.0201
[... tried that for one hour: no spike ...]
สิ่งที่ฉันพยายามทำนั้นไม่ได้ทำให้แตกต่าง:
- ทดสอบ ESXi Builds หลายรายการ: 381591, 348481, 260247
- ทดสอบกับฮาร์ดแวร์ที่แตกต่างกันกล่อง Intel และ AMD ที่แตกต่างกัน
- ทดสอบกับเซิร์ฟเวอร์ NFS ที่แตกต่างกันทั้งหมดแสดงพฤติกรรมเดียวกัน:
- OpenIndiana b147 (ซิงค์ ZFS ทุกครั้งหรือปิดใช้งาน: ไม่มีความแตกต่าง)
- OpenIndiana b148 (ซิงค์ ZFS ทุกครั้งหรือปิดใช้งาน: ไม่มีความแตกต่าง)
- Linux 2.6.32 (ซิงค์หรือ async: ไม่แตกต่างกัน)
- ไม่สร้างความแตกต่างหากเซิร์ฟเวอร์ NFS อยู่บนเครื่องเดียวกัน (เป็นอุปกรณ์จัดเก็บข้อมูลเสมือน) หรือบนโฮสต์อื่น
Guest OS ทดสอบแล้วแสดงปัญหา:
- Windows 7 64 บิต (โดยใช้ CrystalDiskMark ความล่าช้าจะเกิดขึ้นในระหว่างการเตรียมการ)
- Linux 2.6.32 (fsync-tester + ioping)
- Linux 2.6.38 (fsync-tester + ioping)
ฉันไม่สามารถทำซ้ำปัญหานี้บน Linux 2.6.18 VMs
วิธีแก้ปัญหาอื่นคือการใช้ดิสก์ IDE เสมือน (vs SCSI / SAS) แต่นั่นเป็นการ จำกัด ประสิทธิภาพและจำนวนไดรฟ์ต่อ VM
อัปเดต 2011-06-30:
หน่วงเวลาในการแฝงดูเหมือนจะเกิดขึ้นบ่อยครั้งหากแอปพลิเคชันเขียนในบล็อกเล็ก ๆ หลาย ๆ อันก่อน fsync ตัวอย่างเช่น fsync-tester ทำสิ่งนี้ (เอาต์พุตแบบสเตรซ):
pwrite(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 1048576, 0) = 1048576
fsync(3) = 0
ioping ทำสิ่งนี้ขณะเตรียมไฟล์:
[lots of pwrites]
pwrite(3, "********************************"..., 4096, 1036288) = 4096
pwrite(3, "********************************"..., 4096, 1040384) = 4096
pwrite(3, "********************************"..., 4096, 1044480) = 4096
fsync(3) = 0
ขั้นตอนการตั้งค่าของ ioping เกือบตลอดเวลาในขณะที่ fsync-tester ทำงานได้ดีในบางครั้ง มีใครบางคนที่สามารถอัพเดท fsync-tester เพื่อเขียนบล็อคเล็ก ๆ หลาย ๆ อันได้หรือไม่? ทักษะ C ของฉันดูด;)
อัปเดต 2011-07-02:
ปัญหานี้ไม่ได้เกิดขึ้นกับ iSCSI ฉันลองสิ่งนี้กับเซิร์ฟเวอร์ OpenIndiana COMSTAR iSCSI แต่ iSCSI ไม่ให้คุณเข้าถึงไฟล์ VMDK ได้ง่ายดังนั้นคุณสามารถย้ายไฟล์เหล่านี้ระหว่างโฮสต์ด้วยสแนปชอตและ rsync
อัปเดต 2011-07-06:
นี่เป็นส่วนหนึ่งของการจับภาพแบบ wireshark ซึ่งถูกจับโดย VM ตัวที่สามบน vSwitch เดียวกัน ทั้งหมดนี้เกิดขึ้นในโฮสต์เดียวกันไม่มีเครือข่ายทางกายภาพที่เกี่ยวข้อง
ฉันเริ่มทำ ioping ประมาณเวลา 20 ไม่มีการส่งแพ็กเก็ตจนกว่าการหน่วงเวลาห้าวินาทีจะจบลง:
No. Time Source Destination Protocol Info
1082 16.164096 192.168.250.10 192.168.250.20 NFS V3 WRITE Call (Reply In 1085), FH:0x3eb56466 Offset:0 Len:84 FILE_SYNC
1083 16.164112 192.168.250.10 192.168.250.20 NFS V3 WRITE Call (Reply In 1086), FH:0x3eb56f66 Offset:0 Len:84 FILE_SYNC
1084 16.166060 192.168.250.20 192.168.250.10 TCP nfs > iclcnet-locate [ACK] Seq=445 Ack=1057 Win=32806 Len=0 TSV=432016 TSER=769110
1085 16.167678 192.168.250.20 192.168.250.10 NFS V3 WRITE Reply (Call In 1082) Len:84 FILE_SYNC
1086 16.168280 192.168.250.20 192.168.250.10 NFS V3 WRITE Reply (Call In 1083) Len:84 FILE_SYNC
1087 16.168417 192.168.250.10 192.168.250.20 TCP iclcnet-locate > nfs [ACK] Seq=1057 Ack=773 Win=4163 Len=0 TSV=769110 TSER=432016
1088 23.163028 192.168.250.10 192.168.250.20 NFS V3 GETATTR Call (Reply In 1089), FH:0x0bb04963
1089 23.164541 192.168.250.20 192.168.250.10 NFS V3 GETATTR Reply (Call In 1088) Directory mode:0777 uid:0 gid:0
1090 23.274252 192.168.250.10 192.168.250.20 TCP iclcnet-locate > nfs [ACK] Seq=1185 Ack=889 Win=4163 Len=0 TSV=769821 TSER=432716
1091 24.924188 192.168.250.10 192.168.250.20 RPC Continuation
1092 24.924210 192.168.250.10 192.168.250.20 RPC Continuation
1093 24.924216 192.168.250.10 192.168.250.20 RPC Continuation
1094 24.924225 192.168.250.10 192.168.250.20 RPC Continuation
1095 24.924555 192.168.250.20 192.168.250.10 TCP nfs > iclcnet_svinfo [ACK] Seq=6893 Ack=1118613 Win=32625 Len=0 TSV=432892 TSER=769986
1096 24.924626 192.168.250.10 192.168.250.20 RPC Continuation
1097 24.924635 192.168.250.10 192.168.250.20 RPC Continuation
1098 24.924643 192.168.250.10 192.168.250.20 RPC Continuation
1099 24.924649 192.168.250.10 192.168.250.20 RPC Continuation
1100 24.924653 192.168.250.10 192.168.250.20 RPC Continuation
ปรับปรุงครั้งที่ 2 2011-07-06:
ดูเหมือนว่าจะมีอิทธิพลบางอย่างจากขนาดหน้าต่าง TCP ฉันไม่สามารถทำซ้ำปัญหานี้โดยใช้ FreeNAS (ตาม FreeBSD) เป็นเซิร์ฟเวอร์ NFS การจับภาพ wireshark แสดงการอัพเดทหน้าต่าง TCP เป็น 29127 ไบต์ในช่วงเวลาปกติ ฉันไม่เห็นพวกเขาด้วย OpenIndiana ซึ่งใช้ขนาดหน้าต่างที่ใหญ่กว่าเป็นค่าเริ่มต้น
ฉันไม่สามารถสร้างปัญหานี้ได้อีกต่อไปหากฉันตั้งค่าตัวเลือกต่อไปนี้ใน OpenIndiana และรีสตาร์ทเซิร์ฟเวอร์ NFS:
ndd -set /dev/tcp tcp_recv_hiwat 8192 # default is 128000
ndd -set /dev/tcp tcp_max_buf 1048575 # default is 1048576
แต่สิ่งนี้ทำให้ประสิทธิภาพการทำงานลดลง: การเขียนจาก / dev / ศูนย์ไปยังไฟล์ที่มี dd_rescue เริ่มจาก 170MB / s ถึง 80MB / s
อัปเดต 2011-07-07:
ฉันได้อัปโหลดการจับภาพ tcpdumpนี้(สามารถวิเคราะห์ด้วย wireshark) ในกรณีนี้ 192.168.250.2 เป็นเซิร์ฟเวอร์ NFS (OpenIndiana b148) และ 192.168.250.10 เป็นโฮสต์ ESXi
สิ่งที่ฉันทดสอบระหว่างการจับภาพนี้:
เริ่มต้น "ioping -w 5 -i 0.2." ในเวลา 30, 5 วินาทีในการตั้งค่าแขวนเสร็จในเวลา 40
เริ่มต้น "ioping -w 5 -i 0.2." ในเวลา 60, 5 วินาทีในการตั้งค่าแขวนเสร็จในเวลา 70
เริ่ม "fsync-tester" ในเวลา 90 ด้วยผลลัพธ์ต่อไปนี้หยุดที่เวลา 120:
fsync time: 0.0248
fsync time: 5.0197
fsync time: 5.0287
fsync time: 5.0242
fsync time: 5.0225
fsync time: 0.0209
ปรับปรุงครั้งที่ 2 2011-07-07:
ทดสอบ VM เซิร์ฟเวอร์ NFS อื่นแล้วคราวนี้ NexentaStor 3.0.5 community edition: แสดงปัญหาเดียวกัน
อัปเดต 2011-07-31:
ฉันยังสามารถจำลองปัญหานี้ได้ใน ESXi บิลด์ใหม่ 4.1.0.433742