Tôi đang gặp độ trễ fsync khoảng năm giây trên kho dữ liệu NFS trong ESXi, được kích hoạt bởi một số máy ảo nhất định. Tôi nghi ngờ điều này có thể do VM sử dụng NCQ / TCQ, vì điều này không xảy ra với các ổ đĩa IDE ảo.
Điều này có thể được sao chép bằng fsync-test (của Ted Ts'o) và ioping . Ví dụ: sử dụng hệ thống trực tiếp Grml với đĩa 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 ...]
Đó là 5 giây, không phải mili giây. Điều này thậm chí còn tạo độ trễ IO trên một VM khác đang chạy trên cùng một máy chủ và kho dữ liệu :
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
Khi tôi chuyển VM đầu tiên sang bộ nhớ cục bộ, nó trông hoàn toàn bình thường:
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 ...]
Những điều tôi đã thử không có sự khác biệt:
- Đã thử nghiệm một số bản dựng ESXi: 381591, 348481, 260247
- Đã thử nghiệm trên các phần cứng khác nhau, các hộp Intel và AMD khác nhau
- Đã thử nghiệm với các máy chủ NFS khác nhau, tất cả đều cho thấy cùng một hành vi:
- OpenIndiana b147 (Đồng bộ hóa ZFS luôn luôn hoặc bị tắt: không có sự khác biệt)
- OpenIndiana b148 (Đồng bộ hóa ZFS luôn luôn hoặc bị tắt: không có sự khác biệt)
- Linux 2.6.32 (đồng bộ hóa hoặc không đồng bộ: không có sự khác biệt)
- Sẽ không có gì khác biệt nếu máy chủ NFS ở trên cùng một máy (như một thiết bị lưu trữ ảo) hoặc trên một máy chủ khác
Hệ điều hành khách đã thử nghiệm, hiển thị sự cố:
- Windows 7 64 Bit (sử dụng CrystalDiskMark, độ trễ tăng đột biến xảy ra chủ yếu trong giai đoạn chuẩn bị)
- Linux 2.6.32 (fsync-test + ioping)
- Linux 2.6,38 (fsync-test + ioping)
Tôi không thể tái tạo vấn đề này trên máy ảo Linux 2.6,18.
Một cách giải quyết khác là sử dụng các đĩa IDE ảo (so với SCSI / SAS), nhưng điều đó làm hạn chế hiệu năng và số lượng ổ đĩa trên mỗi VM.
Cập nhật 2011-06-30:
Sự tăng đột biến dường như xảy ra thường xuyên hơn nếu ứng dụng ghi thành nhiều khối nhỏ trước fsync. Ví dụ: fsync-test thực hiện điều này (đầu ra strace):
pwrite(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 1048576, 0) = 1048576
fsync(3) = 0
ioping làm điều này trong khi chuẩn bị các tập tin:
[lots of pwrites]
pwrite(3, "********************************"..., 4096, 1036288) = 4096
pwrite(3, "********************************"..., 4096, 1040384) = 4096
pwrite(3, "********************************"..., 4096, 1044480) = 4096
fsync(3) = 0
Giai đoạn thiết lập ioping hầu như luôn bị treo, trong khi fsync-test đôi khi hoạt động tốt. Có ai đó có khả năng cập nhật fsync-test để viết nhiều khối nhỏ không? Kỹ năng C của tôi hút;)
Cập nhật 2011/07/02:
Vấn đề này không xảy ra với iSCSI. Tôi đã thử điều này với máy chủ OpenSTiana COMSTAR iSCSI. Nhưng iSCSI không cung cấp cho bạn quyền truy cập dễ dàng vào các tệp VMDK để bạn có thể di chuyển chúng giữa các máy chủ với ảnh chụp nhanh và rsync.
Cập nhật 2011 / 07-06:
Đây là một phần của một bản ghi wireshark, được chụp bởi một VM thứ ba trên cùng một vSwitch. Tất cả điều này xảy ra trên cùng một máy chủ, không có mạng vật lý liên quan.
Tôi đã bắt đầu ioping khoảng thời gian 20. Không có gói nào được gửi cho đến khi hết năm giây:
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
Cập nhật lần 2 năm 2011 / 07-06:
Dường như có một số ảnh hưởng từ kích thước cửa sổ TCP. Tôi không thể tái tạo vấn đề này bằng FreeNAS (dựa trên FreeBSD) dưới dạng máy chủ NFS. Các ảnh chụp của wireshark cho thấy các cập nhật cửa sổ TCP lên 29127 byte theo chu kỳ. Tôi không thấy chúng với OpenIndiana, mặc định sử dụng kích thước cửa sổ lớn hơn.
Tôi không còn có thể tái tạo vấn đề này nếu tôi đặt các tùy chọn sau trong OpenIndiana và khởi động lại máy chủ NFS:
ndd -set /dev/tcp tcp_recv_hiwat 8192 # default is 128000
ndd -set /dev/tcp tcp_max_buf 1048575 # default is 1048576
Nhưng điều này giết chết hiệu suất: Viết từ / dev / zero vào một tệp có dd_resTHER đi từ 170MB / s đến 80MB / s.
Cập nhật 2011/07/07:
Tôi đã tải lên bản chụp tcpdump này (có thể được phân tích bằng wireshark). Trong trường hợp này 192.168.250.2 là máy chủ NFS (OpenIndiana b148) và 192.168.250.10 là máy chủ ESXi.
Những điều tôi đã thử nghiệm trong lần chụp này:
Bắt đầu "ioping -w 5 -i 0.2." tại thời điểm 30, 5 giây treo trong thiết lập, hoàn thành tại thời điểm 40.
Bắt đầu "ioping -w 5 -i 0.2." tại thời điểm 60, 5 giây treo trong thiết lập, hoàn thành tại thời điểm 70.
Bắt đầu "fsync-test" tại thời điểm 90, với đầu ra sau, dừng tại thời điểm 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
Cập nhật lần 2 năm 2011/07/07:
Đã thử nghiệm một VM máy chủ NFS khác, lần này NexentaStor 3.0.5 phiên bản cộng đồng: Hiển thị các vấn đề tương tự.
Cập nhật 2011-07-31:
Tôi cũng có thể tái tạo vấn đề này trên ESXi build 4.1.0.433742 mới.