Estou com latências fsync de cerca de cinco segundos nos datastores NFS no ESXi, acionados por determinadas VMs. Suspeito que isso possa ser causado por VMs usando NCQ / TCQ, pois isso não acontece com as unidades IDE virtuais.
Isso pode ser reproduzido usando o fsync-tester (de Ted Ts'o) e o ioping . Por exemplo, usando um sistema ao vivo Grml com um disco de 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 ...]
Isso são 5 segundos, não milissegundos. Isso até cria latências de E / S em uma VM diferente em execução no mesmo host e armazenamento de dados :
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 movo a primeira VM para o armazenamento local, parece perfeitamente 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 ...]
As coisas que tentei que não fizeram diferença:
- Testou várias compilações ESXi: 381591, 348481, 260247
- Testado em diferentes hardwares, diferentes caixas Intel e AMD
- Testado com diferentes servidores NFS, todos mostram o mesmo comportamento:
- OpenIndiana b147 (sincronização ZFS sempre ou desativada: sem diferença)
- OpenIndiana b148 (sincronização ZFS sempre ou desativada: sem diferença)
- Linux 2.6.32 (sincronização ou assíncrona: sem diferença)
- Não faz diferença se o servidor NFS estiver na mesma máquina (como um dispositivo de armazenamento virtual) ou em um host diferente
SO convidado testado, mostrando problemas:
- Windows 7 de 64 bits (usando o CrystalDiskMark, os picos de latência ocorrem principalmente durante a fase de preparação)
- Linux 2.6.32 (fsync-tester + ioping)
- Linux 2.6.38 (fsync-tester + ioping)
Não foi possível reproduzir esse problema nas VMs do Linux 2.6.18.
Outra solução alternativa é usar discos IDE virtuais (vs SCSI / SAS), mas isso limita o desempenho e o número de unidades por VM.
Atualização 2011-06-30:
Os picos de latência parecem ocorrer com mais frequência se o aplicativo gravar em vários pequenos blocos antes do fsync. Por exemplo, o fsync-tester faz isso (saída strace):
pwrite(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 1048576, 0) = 1048576
fsync(3) = 0
O ioping faz isso enquanto prepara o arquivo:
[lots of pwrites]
pwrite(3, "********************************"..., 4096, 1036288) = 4096
pwrite(3, "********************************"..., 4096, 1040384) = 4096
pwrite(3, "********************************"..., 4096, 1044480) = 4096
fsync(3) = 0
A fase de configuração do ioping quase sempre trava, enquanto o fsync-tester às vezes funciona bem. Alguém é capaz de atualizar o fsync-tester para gravar vários pequenos blocos? Minhas habilidades C sugam;)
Atualização 2011-07-02:
Esse problema não ocorre com o iSCSI. Eu tentei isso com o servidor iSCSI OpenIndiana COMSTAR. Mas o iSCSI não oferece acesso fácil aos arquivos VMDK, para que você possa movê-los entre hosts com snapshots e rsync.
Atualização 2011-07-06:
Isso faz parte de uma captura do wireshark, capturada por uma terceira VM no mesmo vSwitch. Tudo isso acontece no mesmo host, sem rede física envolvida.
Comecei a mexer por volta do tempo 20. Não havia pacotes enviados até o atraso de cinco segundos terminar:
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
2a atualização 2011-07-06:
Parece haver alguma influência dos tamanhos das janelas TCP. Não consegui reproduzir esse problema usando o FreeNAS (baseado no FreeBSD) como servidor NFS. As capturas do wireshark mostraram atualizações da janela TCP para 29127 bytes em intervalos regulares. Eu não os vi com o OpenIndiana, que usa tamanhos de janela maiores por padrão.
Não consigo mais reproduzir esse problema se eu definir as seguintes opções no OpenIndiana e reiniciar o servidor NFS:
ndd -set /dev/tcp tcp_recv_hiwat 8192 # default is 128000
ndd -set /dev/tcp tcp_max_buf 1048575 # default is 1048576
Mas isso prejudica o desempenho: gravar de / dev / zero em um arquivo com dd_rescue vai de 170 MB / s para 80 MB / s.
Atualização 2011-07-07:
Fiz upload desta captura do tcpdump (pode ser analisada com o wireshark). Nesse caso, 192.168.250.2 é o servidor NFS (OpenIndiana b148) e 192.168.250.10 é o host ESXi.
Coisas que testei durante esta captura:
Iniciado "ioping -w 5 -i 0.2." no tempo 30, 5 segundos travado na configuração, concluído no tempo 40.
Iniciado "ioping -w 5 -i 0.2." no tempo 60, 5 segundos travar na configuração, concluída no tempo 70.
Iniciado "fsync-tester" no horário 90, com a seguinte saída, interrompido no horário 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ª atualização 2011-07-07:
Testou outra VM do servidor NFS, desta vez na comunidade NexentaStor 3.0.5: mostra os mesmos problemas.
Atualização 2011-07-31:
Também posso reproduzir esse problema no novo ESXi build 4.1.0.433742.