NICのオフロード設定の変更方法(Linux)

2019年4月1日

サーバーのネットワーク配線

NIC(ネットワークインターフェースカード)にはCPUの処理を肩代わりして負荷を減らすオフロード機能を持っているものが多いです。

ただNICのメーカーによってはオフロード機能が原因でパケット処理に不具合が起きることが稀にあります。

そこでLinux上でオフロード機能を確認したり、有効化・無効化する方法を書いていこうと思います。

使用ツール

NICの設定ツールにはethtoolというものを使用しますので、デフォルトで入っていたような気もしますが入れていない方はインストールしておきましょう。

Debian系のapt searchコマンドでも、RedHat系のyum searchコマンドでもethtoolで見つかると思います。

使用方法

オフロード設定の確認

確認には小文字のkオプションに続いてインターフェース名を指定します。

# ethtool -k eth0

上記のコマンドで現在のオフロード設定を確認することができます。

一覧に変更できない固定された設定項目も含まれていますので、

# ethtool -k eth0 |grep -v fixed

などのようにすると変更不可項目が除外されて見やすくなると思います。

オフロード設定の変更

変更には大文字のKオプションに続いてインターフェース名と短縮された項目名(rx|tx|sg|tso|gso|groなど)と設定値(on|off)を指定します。

ethtool -K eth0 rx on

続けて複数の項目を並べて一度に設定することもできます。

ethtool -K eth0 rx on tx on sg on tso off gso off gro off

指定できる短縮された項目名について詳しくはman ethtoolの-Kの項目を見て確認して下さい。

オフロード設定項目の簡単な説明

rx

受信パケットのチェックサム計算をオフロード処理するかどうかの設定項目です。

パケットのチェックサムは届いたパケットが壊れていないかどうかの判定に使われます。

通常壊れたパケットはアプリケーションまで届けられず捨てられます。

NICのオフロード処理の中にはヘッダのパケット長より後にゴミデータが付いているパケットだとチェックサム計算がバグるものがあります。

またメーカーの中にはオフロード処理が有効時に一度に大量のパケットを受信するとNICがハングアップするものが昔ありました。

3流のメーカーだとNICのオフロード処理自体に不具合があるものもあるようです。

最近のNICではずいぶんとオフロード処理は改善してきていますので 、ほとんどの環境ではオンで問題ないと思いますが、ネットワークの調子が悪いならオフにして確認してみて下さい。

tx

送信パケットのチェックサム計算をオフロード処理するかどうかの設定項目です。

rxと同じ理由でほとんどの環境でオンで問題ないと思います。

調子が悪い時はオフにして確認してみて下さい。

sg

scatter-gather(スキャッターギャザー)を有効にするかどうかの設定項目です。

scatter-gatherとは複数の非連続なバッファに置かれたパケットデータを扱えるようにする機能のことです。

ジャンボフレームなどでパケットサイズ分の連続したバッファを確保しなくてもよくなります。

通常はオンのままで問題ないと思いますが、ジャンボフレームなどを扱う環境で不具合があるならオフにして様子を見てみて下さい。

tso

TCP segmentation offloadを有効にするかどうかの設定項目です。

大きなデータを送信する時にNIC側でTCPパケットへの分割処理を行う機能になります。

MTUなどとの絡みで結構トラブルの元になりますので、パフォーマンスを追求しない限り通常はオフ推奨です。

オンにする場合は使用する環境で十分な調査と検証を行って下さい。

ufo

UDP segmentation offloadを有効にするかどうかの設定項目です。

tsoと同じ理由で通常はオフ推奨です。

オンにする場合は使用する環境で十分な調査と検証を行って下さい。

gso

Generic segmentation offloadを有効にするかどうかの設定項目です。

大きなデータを送信する時にNIC側でIPパケットへの分割処理を行う機能になります。

トラブルが多いためtsoと同じく通常はオフ推奨です。

オンにする場合は使用する環境で十分な調査と検証を行って下さい。

gro

Generic receive offloadを有効にするかどうかの設定項目です。

受信した分割されたIPパケットをNIC側で結合処理する機能になります。

無用なトラブルを避けるため通常はオフ推奨です。

オンにしてパフォーマンスを追求したい方は十分なテストを行って下さい。

lro

Large receive offloadを有効にするかどうかの設定項目です。

受信したジャンボフレームをNIC側で結合処理する機能になります。

オフ推奨ですが、オンにする場合は現在のネットワーク環境で十分なテストを行う必要があります。

設定の恒常化

Debianであれば/etc/network/interfacesファイルの対象インターフェースのパラメータとして以下のように記述すると、インターフェースUPの際にオフロード設定を適用してくれます。

iface eth0 inet static
…(略)…
        offload-tx on
…(略)…

他のディストリビューションの場合は残念ながら設定の恒常化は把握しておりません。(多分何かしらあるとは思いますが)

そういう仕組みを使わずに独自に適用したい場合、/etc/rc.localに記述するとタイミングによっては適用されないことがありました。

if-up.dなどにスクリプトを置いて適用するのが良さそうです。

(多分…自信なし^^;)

まとめ

ethtoolでは他にもバッファサイズの変更やネゴシエーション設定の変更などNICに関する様々な設定が行えます。

気になった方はman ethtoolで確認してみて下さい。

原因不明のネットワークトラブルが実はNICのオフロード処理だったというオチは結構聞きます。

通常の使用では問題の出ないことが多いですので、オフロード処理のメリットとデメリットを理解した上で上手に利用していきましょう。