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のコレクタとして動作させるときにも
活用できるかもしれない.
パケットサイズにもよるが,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のコレクタとして動作させるときにも
活用できるかもしれない.