Występują opóźnienia około Fsync wynoszące około pięciu sekund w magazynach danych NFS w ESXi, uruchamiane przez niektóre maszyny wirtualne. Podejrzewam, że może to być spowodowane przez maszyny wirtualne korzystające z NCQ / TCQ, ponieważ nie dzieje się tak w przypadku wirtualnych napędów IDE.
Można to odtworzyć za pomocą fsync-testera (Ted Ts'o) i ioping . Na przykład za pomocą systemu Grml Live z dyskiem 8 GB:
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 ...]
To 5 sekund, a nie milisekund. Powoduje to nawet tworzenie opóźnień we / wy na innej maszynie wirtualnej działającej na tym samym hoście i magazynie danych :
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
Kiedy przenoszę pierwszą maszynę wirtualną do lokalnego magazynu, wygląda ona zupełnie normalnie:
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 ...]
Rzeczy, których próbowałem, nie miały znaczenia:
- Testowano kilka kompilacji ESXi: 381591, 348481, 260247
- Testowany na innym sprzęcie, różnych urządzeniach Intel i AMD
- Testowane na różnych serwerach NFS wszystkie wykazują takie samo zachowanie:
- OpenIndiana b147 (synchronizacja ZFS zawsze lub wyłączona: bez różnicy)
- OpenIndiana b148 (synchronizacja ZFS zawsze lub wyłączona: bez różnicy)
- Linux 2.6.32 (synchronizacja lub asynchronizacja: bez różnicy)
- Nie ma znaczenia, czy serwer NFS znajduje się na tej samej maszynie (jako wirtualne urządzenie pamięci masowej), czy na innym hoście
Testowany system operacyjny gościa, wykazujący problemy:
- Windows 7 64 Bit (przy użyciu CrystalDiskMark, skoki opóźnień występują głównie podczas fazy przygotowywania)
- Linux 2.6.32 (fsync-tester + ioping)
- Linux 2.6.38 (fsync-tester + ioping)
Nie mogłem odtworzyć tego problemu na maszynach wirtualnych z systemem Linux 2.6.18.
Innym obejściem jest użycie wirtualnych dysków IDE (w porównaniu z SCSI / SAS), ale ogranicza to wydajność i liczbę dysków na maszynę wirtualną.
Aktualizacja 30.06.2011:
Skoki opóźnień wydają się występować częściej, jeśli aplikacja zapisuje wiele małych bloków przed fsync. Na przykład robi to fsync-tester (wyjście strace):
pwrite(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 1048576, 0) = 1048576
fsync(3) = 0
ioping robi to podczas przygotowywania pliku:
[lots of pwrites]
pwrite(3, "********************************"..., 4096, 1036288) = 4096
pwrite(3, "********************************"..., 4096, 1040384) = 4096
pwrite(3, "********************************"..., 4096, 1044480) = 4096
fsync(3) = 0
Faza konfiguracji Ioping prawie zawsze się zawiesza, podczas gdy fsync-tester czasami działa dobrze. Czy ktoś jest w stanie zaktualizować fsync-tester, aby napisał wiele małych bloków? Moje umiejętności C są do kitu;)
Aktualizacja 2011-07-02:
Ten problem nie występuje w przypadku iSCSI. Próbowałem tego na serwerze iSCSI OpenIndiana COMSTAR. Ale iSCSI nie zapewnia łatwego dostępu do plików VMDK, więc możesz przenosić je między hostami za pomocą migawek i rsync.
Aktualizacja 2011-07-06:
Jest to część przechwytywania wireshark, przechwyconego przez trzecią maszynę wirtualną na tym samym przełączniku vSwitch. Wszystko to dzieje się na tym samym hoście, bez fizycznej sieci.
Zacząłem iopować około 20. czasu. Żadne pakiety nie zostały wysłane, dopóki minęło pięć sekund:
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. aktualizacja 2011-07-06:
Wygląda na to, że wpływ na rozmiary okien TCP ma pewien wpływ. Nie mogłem odtworzyć tego problemu za pomocą FreeNAS (opartego na FreeBSD) jako serwera NFS. Przechwyty wireshark pokazały aktualizacje okna TCP do 29127 bajtów w regularnych odstępach czasu. Nie widziałem ich z OpenIndiana, która domyślnie używa większych rozmiarów okien.
Nie mogę już odtworzyć tego problemu, jeśli ustawię następujące opcje w OpenIndiana i zrestartuję serwer NFS:
ndd -set /dev/tcp tcp_recv_hiwat 8192 # default is 128000
ndd -set /dev/tcp tcp_max_buf 1048575 # default is 1048576
Ale to zabija wydajność: Zapis z / dev / zero do pliku z dd_rescue zmienia się z 170 MB / s do 80 MB / s.
Aktualizacja 2011-07-07:
Przesłałem to przechwytywanie tcpdump (może być analizowane za pomocą wireshark). W tym przypadku 192.168.250.2 to serwer NFS (OpenIndiana b148), a 192.168.250.10 to host ESXi.
Rzeczy, które przetestowałem podczas tego przechwytywania:
Rozpoczęto „ioping -w 5 -i 0.2.” w czasie 30, 5 sekund zawiesi się w konfiguracji, ukończone w czasie 40.
Rozpoczęto „ioping -w 5 -i 0.2.” w czasie 60, 5 sekund zawiesi się w konfiguracji, ukończone w czasie 70.
Uruchomiono „fsync-tester” w czasie 90, z następującym wyjściem, zatrzymano w czasie 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. aktualizacja 2011-07-07:
Przetestowano inną maszynę wirtualną serwera NFS, tym razem wydanie społeczności NexentaStor 3.0.5: Pokazuje te same problemy.
Aktualizacja 2011-07-31:
Mogę również odtworzyć ten problem na nowej wersji ESXi 4.1.0.433742.