ESXiのNFSデータストアで、特定のVMによってトリガーされるfsyncレイテンシが約5秒になっています。これは仮想IDEドライブでは発生しないため、NCQ/TCQを使用するVMが原因である可能性があります。
これは fsync-tester (Ted Ts'oによる)および ioping を使用して再現できます。たとえば、8 GBのディスクでGrmlライブシステムを使用する場合:
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 ...]
つまり、ミリ秒ではなく5秒です。 これは、別のVMが同じホストおよびデータストアで実行されている場合にIOレイテンシを作成することです:
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
最初のVM=をローカルストレージに移動すると、完全に正常に見えます。
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 ...]
私が試したことで違いはありませんでした:
ゲストOSをテストし、問題を示しています:
Linux 2.6.18 VMではこの問題を再現できませんでした。
もう1つの回避策は、仮想IDEディスク(vs SCSI/SAS))を使用することですが、これはパフォーマンスとVMあたりのドライブ数を制限しています。
2011年6月30日更新:
アプリケーションがfsyncの前に複数の小さなブロックに書き込む場合、レイテンシのスパイクがより頻繁に発生するようです。たとえば、fsync-testerはこれを実行します(strace出力)。
pwrite(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 1048576, 0) = 1048576
fsync(3) = 0
iopingは、ファイルの準備中にこれを行います。
[lots of pwrites]
pwrite(3, "********************************"..., 4096, 1036288) = 4096
pwrite(3, "********************************"..., 4096, 1040384) = 4096
pwrite(3, "********************************"..., 4096, 1044480) = 4096
fsync(3) = 0
Iopingのセットアップフェーズはほとんどの場合ハングしますが、fsync-testerは正常に動作することがあります。誰かがfsync-testerを更新して複数の小さなブロックを書き込むことができますか?私のCスキルは吸う;)
更新2011-07-02:
この問題はiSCSIでは発生しません。 OpenIndiana COMSTAR iSCSIサーバーでこれを試しました。ただし、iSCSIではVMDKファイルに簡単にアクセスできないため、スナップショットとrsyncを使用してホスト間でファイルを移動できます。
2011年7月6日更新:
これは、同じvSwitch上の3番目のVM=によってキャプチャされた、wiresharkキャプチャの一部です。これはすべて同じホスト上で行われ、物理ネットワークは関与しません。
私は時間20あたりにiopingを開始しました。5秒の遅延が終了するまで、パケットは送信されませんでした。
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回目の更新2011-07-06:
TCPウィンドウサイズからの影響があるようです。FreeNAS(FreeBSDベース)をNFSサーバーとして使用してこの問題を再現できませんでした。wiresharkのキャプチャはTCPウィンドウが定期的に29127バイトに更新されるOpenIndianaでは、デフォルトでより大きいウィンドウサイズを使用するため、ウィンドウが表示されませんでした。
OpenIndianaで以下のオプションを設定してNFSサーバーを再起動すると、この問題を再現できなくなります。
ndd -set /dev/tcp tcp_recv_hiwat 8192 # default is 128000
ndd -set /dev/tcp tcp_max_buf 1048575 # default is 1048576
しかし、これによりパフォーマンスが低下します。/dev/zeroからdd_rescueを使用してファイルに書き込むと、170MB /秒から80MB /秒になります。
2011年7月7日更新:
これをアップロードしました tcpdump capture (wiresharkで分析できます)。この場合、192.168.250.2はNFSサーバー(OpenIndiana b148)で、192.168.250.10はESXiホストです。
このキャプチャ中にテストしたもの:
「ioping -w 5 -i 0.2」を開始しました。時間30に、セットアップで5秒間ハングし、時間40に完了しました。
「ioping -w 5 -i 0.2」を開始しました。時間60で、セットアップで5秒間ハングし、時間70で完了しました。
時間f90に「fsync-tester」を開始し、次の出力で時間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回目の更新2011-07-07:
別のNFSサーバーVMをテストしました。今回はNexentaStor 3.0.5コミュニティエディション:同じ問題を示しています。
2011年7月31日更新:
新しいESXiビルド4.1.0.433742でもこの問題を再現できます。
この問題はESXi 5で修正されたようです。ビルド469512をテストして成功しました。
ありがとう、nfsstatはよさそうです。キャプチャを確認しました。決定的なものは何も見つかりませんでしたが、興味深いものを見つけました。私はtcp.time_delta> 5でフィルタリングしました。every delayインスタンスで見つかったのは、RPC呼び出しの正確な開始です。すべての新しいRPC呼び出しが低速であったわけではありませんが、RPC呼び出しの正確な開始時にすべてのスローダウンが発生しました。また、キャプチャから、192.168.250.10にはすべての遅延が含まれているように見えます。 192.168.250.2はすべての要求に即座に応答します。
調査結果:
大きな書き込み呼び出しは300個の個別のパケットに分割される可能性がありますTCP=パケットであり、最初のパケットのみが遅延しますが、残りはすべて通過します。遅延が中央で発生することはありません。よくわかりません。ウィンドウサイズが接続のbeginningにどのように影響するか。
次のステップ:TCPウィンドウではなく、NFSVC_MAXBLKSIZEなどのNFSオプションを調整し始めます。また、2.6.38は機能しないのに2.6.18は機能しますが、サポートはわかっています。その期間中にVMXnet3ドライバー用に追加されました。ホストで使用しているNICドライバーは何ですか?TCPオフロードyes/no?約95秒のマークがあります500を超えるTCP単一のNFS書き込み呼び出しのパケット。TCPを担当していて、大きなPDUを分割すると、ブロックされる可能性があります。
2週間前にもまったく同じ問題がありました。 ESX41 U1およびNetapp FAS3170 + NFSデータストア。 RHEL5 VMが2〜4秒間ハングし、Virtual Centerパフォーマンスコンソールから非常に高いスパイクが見られました。
ネットワーク担当者に構成を確認してもらい、問題はCiscoスイッチにありました。Cisco側ではなく、Netapp側のEtherchannelに構成された2つのイーサネットリンクがあります。彼はシスコで静的なEthechannelを作成し、現在は正常に機能しています。この種の問題を特定するには、ファイラーとスイッチの間以外のすべてのポートをシャットダウンします。 1つのポートだけを残して、状況を確認します。
2番目に行うことは、switcjとファイラーでフロー制御を削除することでした。これは、ポーズフレームを送信すると思われるためです。
ESXi4.1U1とCentOS VMを使用して同じ問題が発生しているように見えます。ホストはDell R610、ストレージはEMC2 Isilonクラスターです。
たまたまVLANSを使用していましたか?ストレージのVMkernelポートでVLANを使用すると、VMHostのすべてのストレージトラフィックで4000-5000msが「ハング」することがわかりました。ただし、VMkernelポートをVLANなので、タグなしのパケットを受信します。問題は発生しません。
以下の簡単な設定で、ネットワークで問題が発生します。
1)サーバーまたはワークステーションにESXi 4.1U1をインストールします(どちらも試したときに問題が発生しました)
2)VLANにVMkernelポートを追加します。
3)NFSデータストアを追加します(鉱山は同じVLAN上にあります。つまり、Isilonはタグ付きパケットを受信します)
4)2つのCentOS 5.5 VMをインストールし、1つはiopingを使用します。
5)VMをシングルユーザーモードで起動します(つまり、ネットワークなし、最小サービス)
6)1台のマシンでiopingを実行して、仮想ディスクに書き込みます
7)他のマシンでddなどを実行して、100 MBのデータを/ tmpなどに書き込みます。
多くの場合、両方のVMが4〜5秒間フリーズします。
他の誰かが同様のことを見ていないかどうか、本当に興味を持ってください。
DNSはどのように見えますか? /etc/resolv.conf
は正しいですか?デフォルトのタイムアウトは5秒です。
man resolv.conf
から
timeout:n
sets the amount of time the resolver will wait for a
response from a remote name server before retrying the
query via a different name server. Measured in seconds,
the default is RES_TIMEOUT (currently 5, see <resolv.h>).
timeout:3
を/etc/resolv.conf
に追加して、fsyncテストを再度実行してください。
ここでストローを掴んでいますが、これらのサーバーではどのNICを使用していますか?スタックオーバーフローのシステム管理者は、Intel NICに切り替えたときに消えたBroadcom NICで、奇妙なネットワークの問題を抱えていました: http://blog.serverfault.com/post/broadcom-die-mutha/
ここに別の推測があります... IPv6はEXSホストで有効になっていますか?はいの場合は、オフにしてみますか?私の経験から、ネットワーク全体がIPv6(RADV、DHCP6、DNS、リバースDNS)用に正しく構成されていない場合、一部のサービスで問題になる可能性があります。また、NFSサーバーでオフになっていることを確認してください。