ESXiに構築されているVM(CentOS)の通信がちょくちょく切れて困っていた。ネットをさまよっていたところで TCP Segmentation Offload なるもののことを知って無効にすることを知ったので、その手順を説明します。
TCP Segmentation Offload (TSO) ってなに?
簡単に説明するとTCP通信の一部の処理をCPUからNICに渡す技術のコト。この機能を有効にすることによって、空いたCPUリソースを他の処理に有効に活用できるというモノ。
ソフトウェアで処理していたものをハードウェアで処理することで処理性能を高めることは他の技術でも見られる。例えばSSLの暗号化 / 復号化処理をハードウェアに専用のチップ(カード)を搭載して行わせることで処理性能を上げるというようなことはロードバランサではよくある話。
ただし、今回のTSOに関しては環境によって不具合が生じることがあるようなのでハマる原因はあらかじめ排除したい。っていうか、もうはまってるんだけも。。。
無効化設定
今回の環境は以下。NICのメーカ・型番などもわかればよかったのですが確認忘れました。
- ホスト :ESXi 5.5
- VM : CentOS 7.2
無効化手順
まず、現在の設定を確認するために、VMのインターフェイス名を確認します。
1 2 3 |
# cd /etc/sysconfig/network-scripts/ # ls ifcfg* ifcfg-ens32 ifcfg-lo |
続いて、現在の設定を確認します。
1 2 3 4 5 |
# ethtool -k ens32 | egrep "segmentation-offload|checksumming" rx-checksumming: off tx-checksumming: on tcp-segmentation-offload: on generic-segmentation-offload: on |
TSOを無効にします。
1 |
# ethtool -K ens32 rx off tx off tso off gso off |
変更後の確認をします。
1 2 3 4 5 |
# ethtool -k ens32 | egrep "segmentation-offload|checksumming" rx-checksumming: off tx-checksumming: off tcp-segmentation-offload: off generic-segmentation-offload: off |
以上で設定を無効化できましたが、再起動すると設定が戻ってしまうため恒久的に変更するよう起動スクリプトを用意します。
/etc/rc.d/init.d/local というファイルを用意して以下を記述します。(ファイル名はなんでも構わない)
1 2 3 4 |
vi /etc/rc.d/init.d/local --- #!/bin/bash /sbin/ethtool -K ens32 rx off tx off tso off gso off |
パーミッションを変更します。実行権を付与します。
1 |
# chmod 755 /etc/rc.d/init.d/local |
シンボリックリンクを作成します。ランレベル3の時に起動するように設定します。
1 2 3 4 |
# cd /etc/rc.d/rc3.d # ln -s ../init.d/local S99local # ls -l S99local lrwxrwxrwx 1 root root 15 4月 3 17:24 S99local -> ../init.d/local |
これで再起動しても起動時に作成したスクリプトが実行されます。
まとめ
仮想化環境が乱立している状況だと不具合が発生しても原因の特定に手間取ることが多々あります。さすがに商用の環境ではそんなことは無いと思いますが、社内の開発環境などでだましだまし使っているような場合はそんなこともあるかと思います。そういうときは切り分けのためにも試してみる価値はあるかと思います。
以上、お役に立ちましたらシェアをお願い致します。