[Linux]RX(受信)パケットのdropped(損失)解消を試みる
2018/04/07
前回の記事で自分の運営する鯖のNICをIntel製の物に載せ換えました
「あー、満足満足」と飯でも食ってやがるのですが……
カ二の時からdroppedが稀に発生していたのがふと気になったので、解消を試みてみました。
スポンサーリンク
dropped対策(バッファ拡張)
まず最初に、droppedとは落とす、的な意味で「損失」を表します。
損失はifconfigコマンドで確認できます。
その中でも転送系のエラーは以下の項目です。
RX packets:48502870 errors:0 dropped:153 overruns:0 frame:0
TX packets:106717681 errors:0 dropped:0 overruns:0 carrier:0
RXがReceive exchangeで受信、TXがTransmit exchangeで送信です。
RX(受信)パケットにdropped(損失)が生じていますね。
droppedが出ている事自体は前々から認識していましたが、「TCPって再送とかするし、損失も極少だし別に良いや」と放置していました。ダチョウアルゴリズムって奴ですね。
ただ、せっかくIntelNICに載せ換えたのですし、キモチワルイので解消を試みてみます。
原因
どうやら、受信パケットが沢山来ている際にはバッファに取り込むようです、それを捌くよりも早く次のパケットが来て……を繰り返すとバッファが一杯になってしまう様です。
バッファが一杯になると、古いデータを上書きして次のパケットを取り込むようです。
ですので、単純明快にバッファのサイズを拡張してやれば良いのです。
バッファ拡張
現在のバッファサイズは「ethtool -g」で確認できます。
test@server:~$ ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 256
RX Mini: 0
RX Jumbo: 0
TX: 256
「Pre-set maximums」が設定出来る最大値で「Current hardware settings」が現在設定している値です。
現在は256が設定されている様ですね、倍々に拡張して行くのが一般的なようです。
設定の変更は「ethtool -G」を使用します。現在、倍の512に拡張します。
eth0のRXバッファを512に拡張する際には「ethtool -G eth0 rx 512」を実行します(要:root)
test@server:~$ sudo ethtool -G eth0 rx 512
test@server:~$ ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 512
RX Mini: 0
RX Jumbo: 0
TX: 256
どうやら512になったようです。
しかし、この設定は起動している間のみ有効で、再起動すると元の256に戻ってしまいます。
永続的に設定を変更したい場合は以下の様に設定します。
設定の永続化
要は、起動時にこのコマンドを実行出来れば良いわけです。
Ubuntuであれば「/etc/network/interfaces」を開いて「post-up」と言う機能を使えば良いらしいです。
「post-up」初耳なので調べて見た所、どうやらネットワークが有効化された後で実行される様です。
反対に、ネットワークがダウンしてから実行されるのは「post-down」
有効化される前に実行されるのが「pre-up」、と言う事は「pre-down」もあります。
「post-up」で先程のコマンドを実行する訳ですね。エディタで「/etc/network/interfaces」を開いてから以下の様に設定すれば良いのです。
auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1
post-up ethtool -G eth0 rx 512
これで、再起動した後に「ethtool -g eth0」を実行してみて下さい。
RXパケットのバッファサイズが512に設定されているはずです。
もし、CentOSなどのRHEL系でしたら「/etc/rc.d/rc.local」にでも書けば良いのではないでしょうか?
あいにく、Ubuntuしか使えない者でしてね。
ちなみにですが、ethtoolは引数が小文字だと確認、大文字だと設定らしいです。
「ethtool -g」は小文字なので確認「ethtool -G」は大文字なので設定、ですね。