Sto riscontrando latenze fsync di circa cinque secondi sui datastore NFS in ESXi, attivate da alcune macchine virtuali. Sospetto che ciò potrebbe essere causato dalle macchine virtuali che utilizzano NCQ / TCQ, poiché ciò non accade con le unità IDE virtuali.
Questo può essere riprodotto usando fsync-tester (di Ted Ts'o) e ioping . Ad esempio utilizzando un sistema live Grml con un disco da 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 ...]
Sono 5 secondi, non millisecondi. Questo sta persino creando latenze di I / O su una macchina virtuale diversa in esecuzione sullo stesso host e archivio dati :
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
Quando sposto la prima macchina virtuale nella memoria locale, appare perfettamente normale:
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 ...]
Le cose che ho provato non hanno fatto differenza:
- Testato diverse build ESXi: 381591, 348481, 260247
- Testato su hardware diverso, diverse scatole Intel e AMD
- Testato con diversi server NFS, mostrano tutti lo stesso comportamento:
- OpenIndiana b147 (sincronizzazione ZFS sempre o disabilitata: nessuna differenza)
- OpenIndiana b148 (sincronizzazione ZFS sempre o disabilitata: nessuna differenza)
- Linux 2.6.32 (sincronizzazione o asincrono: nessuna differenza)
- Non fa differenza se il server NFS si trova sulla stessa macchina (come dispositivo di archiviazione virtuale) o su un host diverso
Sistema operativo guest testato, che mostra problemi:
- Windows 7 64 bit (utilizzando CrystalDiskMark, i picchi di latenza si verificano principalmente durante la fase di preparazione)
- Linux 2.6.32 (fsync-tester + ioping)
- Linux 2.6.38 (fsync-tester + ioping)
Non sono riuscito a riprodurre questo problema su VM Linux 2.6.18.
Un'altra soluzione alternativa consiste nell'utilizzare i dischi IDE virtuali (rispetto a SCSI / SAS), ma ciò sta limitando le prestazioni e il numero di unità per VM.
Aggiornamento 30/06/2011:
I picchi di latenza sembrano verificarsi più spesso se l'applicazione scrive in più piccoli blocchi prima di fsync. Ad esempio fsync-tester fa questo (output di strace):
pwrite(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 1048576, 0) = 1048576
fsync(3) = 0
ioping fa questo mentre prepara il file:
[lots of pwrites]
pwrite(3, "********************************"..., 4096, 1036288) = 4096
pwrite(3, "********************************"..., 4096, 1040384) = 4096
pwrite(3, "********************************"..., 4096, 1044480) = 4096
fsync(3) = 0
La fase di installazione di ioping si blocca quasi sempre, mentre a volte fsync-tester funziona bene. Qualcuno è in grado di aggiornare fsync-tester per scrivere più piccoli blocchi? Le mie abilità in C fanno schifo;)
Aggiornamento 02/07/2011:
Questo problema non si verifica con iSCSI. Ho provato questo con il server iSCSI OpenSTiana COMSTAR. Ma iSCSI non ti dà un facile accesso ai file VMDK, quindi puoi spostarli tra host con snapshot e rsync.
Aggiornamento 06/07/2011:
Questo fa parte di un'acquisizione di WireShark, acquisita da una terza VM sullo stesso vSwitch. Tutto ciò accade sullo stesso host, nessuna rete fisica coinvolta.
Ho iniziato a fare il giro intorno al tempo 20. Non c'erano pacchetti inviati fino al termine del ritardo di cinque secondi:
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 ° aggiornamento 2011-07-06:
Sembra esserci una certa influenza dalle dimensioni della finestra TCP. Non sono riuscito a riprodurre questo problema usando FreeNAS (basato su FreeBSD) come server NFS. Le acquisizioni di WireShark hanno mostrato ad intervalli regolari aggiornamenti della finestra TCP a 29127 byte. Non li ho visti con OpenIndiana, che per impostazione predefinita utilizza finestre di dimensioni maggiori.
Non riesco più a riprodurre questo problema se imposto le seguenti opzioni in OpenIndiana e riavvio il server NFS:
ndd -set /dev/tcp tcp_recv_hiwat 8192 # default is 128000
ndd -set /dev/tcp tcp_max_buf 1048575 # default is 1048576
Ma questo uccide le prestazioni: scrivere da / dev / zero in un file con dd_rescue va da 170 MB / sa 80 MB / s.
Aggiornamento 07/07/2011:
Ho caricato questa acquisizione di tcpdump (può essere analizzata con WireShark). In questo caso 192.168.250.2 è il server NFS (OpenIndiana b148) e 192.168.250.10 è l'host ESXi.
Cose che ho testato durante questa acquisizione:
Iniziato "ioping -w 5 -i 0.2." al momento 30, 5 secondi di blocco nell'installazione, completato al momento 40.
Iniziato "ioping -w 5 -i 0.2." al momento 60, 5 secondi di blocco nell'installazione, completato al momento 70.
Avviato "fsync-tester" al momento 90, con la seguente uscita, arrestato al momento 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 ° aggiornamento 2011-07-07:
Testato un'altra macchina virtuale del server NFS, questa volta edizione della community NexentaStor 3.0.5: mostra gli stessi problemi.
Aggiornamento 2011-07-31:
Posso anche riprodurre questo problema sul nuovo build ESXi 4.1.0.433742.