Je rencontre des latences fsync d'environ cinq secondes sur les datastores NFS dans ESXi, déclenchées par certaines machines virtuelles. Je soupçonne que cela pourrait être causé par des ordinateurs virtuels utilisant NCQ / TCQ, car cela ne se produit pas avec les lecteurs IDE virtuels.
Ceci peut être reproduit en utilisant fsync-tester (par Ted Ts'o) et ioping . Par exemple, en utilisant un système live Grml avec un disque de 8 Go:
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 ...]
C'est 5 secondes, pas millisecondes. Cela crée même des latences d'E / S sur une machine virtuelle différente s'exécutant sur le même hôte et le même magasin de données :
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
Lorsque je déplace la première machine virtuelle vers un stockage local, cela semble parfaitement normal:
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 ...]
Les choses que j'ai essayées ne font aucune différence:
- Testé plusieurs éditions ESXi: 381591, 348481, 260247
- Testé sur différents matériels, différents boîtiers Intel et AMD
- Testé avec différents serveurs NFS, tous présentent le même comportement:
- OpenIndiana b147 (synchronisation ZFS toujours ou désactivée: aucune différence)
- OpenIndiana b148 (synchronisation ZFS toujours ou désactivée: aucune différence)
- Linux 2.6.32 (sync ou async: pas de différence)
- Cela ne fait aucune différence si le serveur NFS est sur le même ordinateur (en tant que dispositif de stockage virtuel) ou sur un hôte différent
OS invité testé, présentant des problèmes:
- Windows 7 64 bits (avec CrystalDiskMark, les pointes de latence se produisent principalement pendant la phase de préparation)
- Linux 2.6.32 (testeur fsync + lecture)
- Linux 2.6.38 (testeur fsync + lecture)
Je ne pouvais pas reproduire ce problème sur les machines virtuelles Linux 2.6.18.
Une autre solution consiste à utiliser des disques IDE virtuels (vs SCSI / SAS), mais cela limite les performances et le nombre de lecteurs par machine virtuelle.
Mise à jour du 30/06/2011:
Les pointes de latence semblent se produire plus souvent si l'application écrit dans plusieurs petits blocs avant fsync. Par exemple, fsync-tester fait ceci (strace output):
pwrite(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 1048576, 0) = 1048576
fsync(3) = 0
ioping fait ceci pendant la préparation du fichier:
[lots of pwrites]
pwrite(3, "********************************"..., 4096, 1036288) = 4096
pwrite(3, "********************************"..., 4096, 1040384) = 4096
pwrite(3, "********************************"..., 4096, 1044480) = 4096
fsync(3) = 0
La phase d’installation de ioping est presque toujours suspendue, alors que fsync-tester fonctionne parfois très bien. Est-ce que quelqu'un est capable de mettre à jour fsync-tester pour écrire plusieurs petits blocs? Mes compétences C sucer;)
Mise à jour 2011-07-02:
Ce problème ne se produit pas avec iSCSI. J'ai essayé cela avec le serveur OpenIndiana COMSTAR iSCSI. Mais iSCSI ne vous donne pas un accès facile aux fichiers VMDK, vous pouvez donc les déplacer entre les hôtes avec des instantanés et rsync.
Mise à jour 2011-07-06:
Cela fait partie d'une capture wirehark, capturée par une troisième machine virtuelle sur le même vSwitch. Tout cela se passe sur le même hôte, aucun réseau physique impliqué.
J'ai commencé à lire vers 20 heures. Aucun paquet n'a été envoyé avant la fin du délai de cinq secondes:
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ème mise à jour 2011-07-06:
Il semble y avoir une certaine influence de la taille des fenêtres TCP. Je ne pouvais pas reproduire ce problème en utilisant FreeNAS (basé sur FreeBSD) en tant que serveur NFS. Les captures wirehark ont montré des mises à jour de la fenêtre TCP à 29127 octets à intervalles réguliers. Je ne les ai pas vus avec OpenIndiana, qui utilise par défaut des fenêtres plus grandes.
Je ne peux plus reproduire ce problème si je définis les options suivantes dans OpenIndiana et si je redémarre le serveur NFS:
ndd -set /dev/tcp tcp_recv_hiwat 8192 # default is 128000
ndd -set /dev/tcp tcp_max_buf 1048575 # default is 1048576
Mais cela tue les performances: l’écriture de / dev / zero dans un fichier avec dd_rescue passe de 170 Mo / s à 80 Mo / s.
Mise à jour 2011-07-07:
J'ai téléchargé cette capture tcpdump (peut être analysée avec Wireshark). Dans ce cas, 192.168.250.2 est le serveur NFS (OpenIndiana b148) et 192.168.250.10 est l'hôte ESXi.
Choses que j'ai testées lors de cette capture:
A commencé "ioping -w 5 -i 0.2." à l’heure 30, l’installation dure 5 secondes et se termine à l’heure 40.
A commencé "ioping -w 5 -i 0.2." à l’heure 60, l’installation dure 5 secondes et se termine à l’heure 70.
Démarrage de "fsync-tester" à l’heure 90, avec la sortie suivante, arrêté à l’heure 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ème mise à jour 2011-07-07:
Tester une autre machine virtuelle de serveur NFS, cette fois-ci dans l’édition de la communauté NexentaStor 3.0.5: présente les mêmes problèmes.
Mise à jour du 31/07/2011:
Je peux également reproduire ce problème sur la nouvelle version d'ESXi 4.1.0.433742.