ネットワーク管理者の憂鬱な日常

とある組織でネットワーク管理に携わる管理者の憂鬱な日常を書いてみたりするブログ

BPF buffer

パケットキャプチャのため,FreeBSDでtcpdumpを動かしていたりする.
パケットサイズにもよるが,1時間あたり100万パケットを超えたあたりから,
kernelでのパケットロスが発生していた.

まあ,多くても0.01%程度なので,誤差といえば誤差なのだが.

ひょんなことから,こちらのサイトを見つけ,
そちらに記述されていたのが,これ.

sysctl -w net.bpf.bufsize=10485760
sysctl -w net.bpf.maxbufsize=10485760

これで,カーネルパラメータに定義されるBPF(Berkeley Packet Filter)の
バッファサイズを変更できる.

ちなみに,bpf.bufsizeのデフォルト値は4096バイト,
bpf.maxbufsizeのデフォルト値は524288バイト.
つまり,たかだか4KBのバッファで,最大でも512KBってことか.

そりゃ,溢れるわな,とw

で,バッファを10MBに増やすと,見事にパケットロスが無くなった.
400万パケット/時間でもパケットロスは発生していない.

実は,パケットキャプチャ関係でPF_RINGに行き当たり,そこから辿って到達.
でも,PF_RINGは,LinuxカーネルでTCP/IPスタックを経由せずパケットキャプチャ
させるためのカーネルモジュールらしい.

▽ PF_RING - www.ntop.org
http://www.ntop.org/PF_RING.html

どうやら,Linuxでlibpcap経由でパケットキャプチャすると,取りこぼしが
多いらしく,それでPF_RINGが作られたような.

ま,とりあえずBSDでは,bpfバッファを大きくすることで(とりあえず)
パケットロスが回避できるようなので,お手軽.

今回の知見は,NetFlow/IPFIXのコレクタとして動作させるときにも
活用できるかもしれない.

スポンサーリンク