MTUミスマッチ:プロダクション環境における「静かなる殺し屋」
先週、私の管理する8台のESXiホストクラスターが突然不調に陥りました。初期症状は奇妙なものでした。データベースを実行している仮想マシン(VM)同士のpingは通るものの、データのバックアップや大容量ファイルの転送を行うと、途中で接続が切れてしまうのです。さらに、vMotionのプロセスはちょうど14%で止まり、タイムアウトエラーが発生しました。
2時間の調査の結果、犯人を特定しました。それはMTUミスマッチです。新人の同僚がVMkernelでJumbo Frames(MTU 9000)を有効にしたものの、物理スイッチ(Cisco Nexus)の設定を忘れていたのです。その結果、スループットは10Gbpsから200Mbps未満へと激減し、大量のパケットが容赦なくドロップされていました。
MTU(Maximum Transmission Unit)とは、簡単に言えばネットワークポートが一度に送信できる最大パケットサイズのことです。VMwareの世界では、チェーン(VM -> vSwitch -> 物理スイッチ -> ストレージ)のどこか1箇所でも不一致があれば、システムは即座にトラブルに見舞われます。
vmkpingによる5分間のクイックチェック
ネットワークが不安定な時、推測に頼ってはいけません。ESXiホストに直接SSHでログインし、vmkpingコマンドを使用してください。これが、大きなパケットが実際に正常に通過しているかどうかを確認する最速の方法です。
Jumbo Frames(MTU 9000)の通信テストを行うには、以下のコマンドを実行します。
# ESXi의 standard syntax:
# -d: パケットの断片化を許可しない (Disallow fragmentation)
# -s 8972: 実際のペイロード (9000バイト - 28バイトのヘッダー)
vmkping -I vmk0 -d -s 8972 192.168.10.20
結果の読み方:
- Replyが返ってくる場合: 通信は正常です。
- “Message too long”と表示される場合: 間違いなくどこかでMTUのボトルネックが発生しています。
MTU同期のために確認すべき4つのポイント
このエラーの修正は難しくありません。重要なのは、以下の4つのレイヤーを漏れなくチェックすることです。トラブルの再発を防ぐため、一つも飛ばさないようにしてください。
1. VMkernel Port
ここはvMotion、iSCSI、vSANなどの重要なトラフィックを処理する場所です。ストレージにJumbo Framesを使用する場合は、ここでMTUを9000に設定する必要があります。
操作手順:Networking -> VMkernel adapters -> Edit -> MTUを9000に変更。
2. vSwitch または Distributed Switch (vDS)
vSwitchを「漏斗(ろうと)」と考えてください。VMkernelが9000でも、vSwitchがデフォルトの1500のままだと、パケットはこの入り口で詰まってしまいます。以下のコマンドで素早く確認できます:
esxcfg-vswitch -l
3. 物理スイッチ (Physical Switch)
最も忘れられがちなポイントです。Cisco、Dell、Aristaなどのエンタープライズ向けスイッチは、通常デフォルトでMTU 1500になっています。スイッチにログインし、対応するポートでMTUを設定する必要があります。
ヒント: 私は物理スイッチのMTUを9216に設定することが多いです。この数値は、将来VXLANやNSXなどのプロトコルを導入した際に発生するヘッダー分をカバーする余裕を持たせるためです。
4. 仮想マシンのOS (Guest OS)
最後は仮想マシンの内部です。ビデオストリーミングなどの専用システムで大容量のMTUが必要な場合は、WindowsやLinuxのネットワークカード設定でもこの値を調整することを忘れないでください。
PowerCLIを使用してクラスター全体のエラーをスキャンする
クラスターに数十台のノードがある場合、1台ずつMTUをチェックするのは苦行です。代わりに、このPowerCLIスクリプトを使えば、不一致のあるホストを数秒で見つけ出すことができます。
# すべてのvSwitchのMTUを確認
Get-VMHost | Get-VirtualSwitch | Select-Object @{N="Host";E={$_.VMHost.Name}}, Name, MTU | ft
# VMkernelポートのMTUを確認
Get-VMHost | Get-VMHostNetworkAdapter | Select-Object @{N="Host";E={$_.VMHost.Name}}, Name, IP, MTU | ft
他のホストが9000なのに、1500と表示されている行はありませんか?そこが対処すべき箇所です。
実体験から学んだ「教訓」
vSphereのネットワークトラブルを何度も解決してきた経験から、3つのルールを導き出しました:
- 必要な時だけ有効にする: 管理用ネットワーク(Management)でJumbo Framesを乱用しないでください。iSCSI、vSAN、またはCPU負荷を軽減するためのvMotionにおいてのみ、真価を発揮します。
- エンド・ツー・エンドの原則: MTUは端から端まで一貫している必要があります。iSCSIを使用している場合は、ストレージ筐体(NetApp, Dell EMCなど)のコントローラー側のMTU設定も確認してください。
- 「28」という数字を常に忘れない: 9000バイトでpingを打つ際、28バイトのヘッダーを差し引かないと、コマンドは必ず失敗します。トラブルシューティング中にこの些細なディテールで混乱しないようにしましょう。
MTUミスマッチの解決には高度な技術は必要ありませんが、細心の注意が必要です。この経験が、VMwareインフラを管理する上での自信につながれば幸いです。

