純規の暇人趣味ブログ

首を突っ込んで足を洗う

[Linux]RX(受信)パケットのdropped(損失)解消を試みる

      2016/03/25    HimaJyun

前回の記事で自分の運営する鯖の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」を使用します。
現在、256なので倍の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」を開いてから以下の様に設定すれば良いのです。

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
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
# This is an autoconfigured IPv6 interface
iface eth0 inet6 auto

これで、再起動した後に「ethtool -g eth0」を実行してみて下さい。
RXパケットのバッファサイズが512に設定されているはずです。

もし、CentOSなどのRHEL系でしたら「/etc/rc.d/rc.local」にでも書けば良いのではないでしょうか?
あいにく、Ubuntuしか使えない者でしてね。

ちなみにですが、ethtoolは引数が小文字だと確認、大文字だと設定らしいです。
「ethtool -g」は小文字なので確認「ethtool -G」は大文字なので設定、ですね。
開発者の遊び心?ですね。

 - サーバ運営 ,