Bazı VM'ler tarafından tetiklenen, ESXi'deki NFS veri depolarında yaklaşık beş saniyelik fsync gecikmeleri yaşıyorum . Sanal IDE sürücülerinde olmadığından, NCQ / TCQ kullanan VM'lerin neden olabileceğinden şüpheleniyorum.
Bu, fsync-tester (Ted Ts'o) ve ioping kullanılarak çoğaltılabilir . Örneğin, 8GB diskli bir Grml canlı sistemi kullanmak:
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 ...]
Bu 5 saniye, milisaniye değil. Bu, aynı ana bilgisayarda ve veri deposunda çalışan farklı bir VM'de IO-gecikmeleri yaratıyor :
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
İlk VM'yi yerel depolamaya taşıdığımda tamamen normal görünüyor:
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 ...]
Denedim şeyler hiçbir fark yaratmadı:
- Birkaç ESXi Yapılışı test edildi: 381591, 348481, 260247
- Farklı donanım, farklı Intel ve AMD kutuları üzerinde test edilmiştir
- Farklı NFS sunucuları ile test edilmiş, hepsi aynı davranışı gösterir:
- OpenIndiana b147 (ZFS senkronizasyonu her zaman veya devre dışı: fark yok)
- OpenIndiana b148 (ZFS senkronizasyonu her zaman veya devre dışı: fark yok)
- Linux 2.6.32 (senkronizasyon veya zaman uyumsuz: fark yok)
- NFS sunucusu aynı makinede (sanal depolama aygıtı olarak) veya farklı bir ana bilgisayarda bulunuyorsa, bu fark yaratmaz
Konuk işletim sistemi test edildi ve sorunları gösterdi:
- Windows 7 64 Bit (CrystalDiskMark kullanarak, gecikme artışları çoğunlukla hazırlık aşamasında gerçekleşir)
- Linux 2.6.32 (fsync-tester + ioping)
- Linux 2.6.38 (fsync-tester + ioping)
Linux 2.6.18 VM'lerinde bu sorunu tekrar oluşturamadım.
Diğer bir geçici çözüm, sanal IDE disklerini (vs SCSI / SAS) kullanmaktır, ancak bu, performansı ve VM başına sürücü sayısını sınırlamaktadır.
2011-06-30 Güncellemesi:
Gecikme ani yükselmeleri, uygulama fsync'ten önce çok sayıda küçük blokta yazıyorsa daha sık görülür. Örneğin, fsync-tester bunu yapar (strace çıkışı):
pwrite(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 1048576, 0) = 1048576
fsync(3) = 0
ioping dosyayı hazırlarken bunu yapar:
[lots of pwrites]
pwrite(3, "********************************"..., 4096, 1036288) = 4096
pwrite(3, "********************************"..., 4096, 1040384) = 4096
pwrite(3, "********************************"..., 4096, 1044480) = 4096
fsync(3) = 0
İoping kurulum aşaması neredeyse her zaman askıda kalırken, fsync-tester bazen iyi çalışıyor. Birisi birden çok küçük blok yazmak için fsync-tester yazılımını güncelleme yeteneğine sahip mi? C becerilerim emmek;)
2011-07-02 Güncellemesi:
Bu sorun iSCSI ile oluşmaz. Bunu OpenIndiana COMSTAR iSCSI sunucusuyla denedim. Ancak iSCSI size VMDK dosyalarına kolay erişim sağlamaz, böylece bunları anlık görüntüleri ve rsync özellikli ana bilgisayarlar arasında taşıyabilirsiniz.
2011-07-06 Güncellemesi:
Bu, aynı vSwitch'teki üçüncü bir VM tarafından yakalanan bir wireshark yakalamanın bir parçasıdır. Tüm bunlar aynı ana bilgisayar üzerinde gerçekleşir, fiziksel bir ağ yoktur.
20. zamanın iyiyosunu başladım. Beş saniyelik gecikme sona erene kadar gönderilen hiçbir paket yoktu:
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. Güncelleme 2011-07-06:
TCP pencere boyutlarından bazı etkilerin olduğu görülüyor. Bir NFS sunucusu olarak FreeNAS (FreeBSD'ye dayanarak) kullanarak bu sorunu tekrar oluşturamadım. Wireshark yakalamaları, düzenli aralıklarla TCP penceresi güncellemelerinin 29127 bayta ulaştığını gösterdi. Onları varsayılan olarak daha büyük pencere boyutları kullanan OpenIndiana ile görmedim.
OpenIndiana'da aşağıdaki seçenekleri ayarladıysam ve NFS sunucusunu yeniden başlattıysam, bu sorunu artık oluşturamıyorum:
ndd -set /dev/tcp tcp_recv_hiwat 8192 # default is 128000
ndd -set /dev/tcp tcp_max_buf 1048575 # default is 1048576
Ancak bu performansı düşürür: / dev / zero'dan dd_rescue olan bir dosyaya yazma işlemi 170 MB / sn'den 80 MB / sn'ye çıkar.
2011-07-07 Güncellemesi:
Bu tcpdump yakalamasını yükledim (wireshark ile analiz edilebilir). Bu durumda 192.168.250.2 NFS sunucusudur (OpenIndiana b148) ve 192.168.250.10 ESXi ana bilgisayarıdır.
Bu çekim sırasında test ettiklerim:
"İoping -w 5 -i 0.2" ile başladı saat 30 da, 5 saniye kurulumda, 40 saatte tamamlandı.
"İoping -w 5 -i 0.2" ile başladı saat 60, saatte 5 saniye, kurulum 70'de tamamlandı.
"Fsync-tester" 90. saatte başladı, şu çıkış 120 ile durdu:
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. Güncelleme 2011-07-07:
Başka bir NFS sunucusu VM'si test edildi, bu sefer NexentaStor 3.0.5 topluluk baskısı: Aynı sorunları gösteriyor.
2011-07-31 Güncellemesi:
Bu sorunu yeni ESXi 4.1.0.433742 sürümünde de yeniden oluşturabilirim.