2010年12月6日月曜日

NICのリングバッファ(ring buffer)拡張


サーバのNIC(eth0)にてRXのdroppedカウンタが増加していることに気がついた。

◆ 問題点
droppedが増えている。

$ ifconfig
eth0  Link encap:Ethernet  HWaddr 78:E7:D1:DE:AE:7A
      UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
      RX packets:1229784925 errors:0 dropped:830 overruns:0 frame:0
      TX packets:1527648296 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000
      RX bytes:3738595284 (3.4 GiB)  TX bytes:1955713102 (1.8 GiB)
      Interrupt:169 Memory:f4000000-f4012800

RX : Receive  eXchange(受信)
TX : Transmit eXchange(送信)

受信側のリングバッファ(ring buffer)のサイズを上げることにする。



◆ 現在の設定確認
$ ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:             1020 ← ここまで上げられる
RX Mini:        0
RX Jumbo:       4080
TX:             255
Current hardware settings:
RX:             255 ← 現在値
RX Mini:        0
RX Jumbo:       0
TX:             255

-g : Queries the specified ethernet device for rx/tx ring parameter information.

バッファを領域がいっぱいになったあとは、名前のとおり、
古いデータを順次上書きするような循環バッファとして機能する。
リングバッファの現在の利用率を確認することは難しい。
NICドライバが管理する領域であり、OSからは確認できない。



◆ 設定の変更
さしあたり2倍程度にする(ルート権限が必要である)。
CPUの処理量の増加が増やすことのデメリットとしてあげられる。
$ ethtool -G eth0 rx 512

-G : Changes the rx/tx ring parameters of the specified ethernet device.
設定変更後、一時的にNICのリセットが発生し、リンクのダウン・アップ(ただし瞬断)が発生した。



◆ 設定変更後の確認
$ ethtool -G eth0 rx 512
Ring parameters for eth0:
Pre-set maximums:
RX:             1020
RX Mini:        0
RX Jumbo:       4080
TX:             255
Current hardware settings:
RX:             512 ← 変更された
RX Mini:        0
RX Jumbo:       0
TX:             255



◆ 設定変更後の有効性確認
ドロップカウンタが増加し続けているか確認する。
リングバッファのサイズを変更するとカウンタは初期化される。

しばらく時間をおいて確認するも増加していない。
$ ifconfig
eth0      Link encap:Ethernet  HWaddr 78:E7:D1:DE:AE:7A
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:1229784925 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1527648296 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3738595284 (3.4 GiB)  TX bytes:1955713102 (1.8 GiB)
          Interrupt:169 Memory:f4000000-f4012800



◆ 設定の永続化
設定を永続化させるために、下記ファイルにも記載しておく。
$ vi /etc/rc.d/rc.local
#!/bin/sh
ethtool -G eth0 rx 512



大規模なシステムを構築するなら下記も見直すことが必要である。
kernelチューニング
ユーザ単位でのシステムリソース制限

TSO(TCPsegmentation offload)、
GSO(Generic Segmentation Offload)
の扱いも考慮すべきである。
tcを利用したトラフィックコントロール内の
【TSO、GSOの扱い】章を参照。