Socket Buffer Tuning
Home >> Note >> Socket Buffer Tuning

Overview

ADSLや光回線などの充実によって,ここ数年でネットワークの回線速度もかなり進歩してきました.ですが,Linuxの バージョンによっては,一昔のネットワーク速度を基準としてパラメータの設定を行っているためにネットワーク帯域を フル活用できていない場合もあります(特に,1Gbpsを超えるような場合はその可能性が高い).そこで,今回はボトルネック の一つとなりやすいバッファサイズのチューニング方法について記述します.

sysctl変数の設定

Linuxにおいてシステム全体のバッファサイズを変更する場合には,sysctlコマンドを使用します.設定する項目は, 下記の9種類です( Manpage of TCP参照).

net.ipv4.tcp_window_scaling
RFC 1323のTCPウィンドウスケーリングを有効にします.この機能を用いると,(接続先が対応していれば) TCP接続で64 KByte以上のウィンドウが使えるようになります.送受信バッファサイズを64 KByte以上に設定した場合は, そのバッファを有効に利用できるようにこのオプションを有効にしておきます.
net.ipv4.tcp_rmem
TCPが受信バッファサイズを調整するために用いられます.このsysctl変数は,[min,default,max]の3つの値を持ちます. それぞれの値の意味は,下記の通りです.
  • min ..... 各TCPソケットが用いる受信バッファの最小値です.この値は,SO_RCVBUFを用いてソケットの 最低受信バッファサイズを宣言する際には用いられません.
  • default ..... TCPソケットの受信バッファのデフォルト値です. この値は,net.core.rmem_defaultよりも優先されます.
  • max ..... 各TCPソケットが用いる受信バッファの最大値です.この値よりもnet.core.rmem_maxが優先されます. この値は,SO_RCVBUFを用いてソケットの受信バッファサイズを制限する際には用いられません.
net.ipv4.tcp_wmem
TCPが送信バッファサイズを調整するために用いられます.このsysctl変数も[min,default,max]の3つの値を持ちます. それぞれの値の意味は,net.ipv4.tcp_rmemと同様です.
net.ipv4.tcp_mem
TCPがメモリ使用量を追跡するために用いられます.このsysctlは,[low,pressure,high]の3つの値を持ちます. それぞれの値の意味は,下記の通りです.
  • low ..... TCPは,グローバルに割り当てたメモリがこの数値以下の場合は, メモリアロケーションを調整しません.
  • pressure ..... TCPがアロケートしたメモリがこの数値を越えると, TCPはメモリ消費を抑えるようになります.
  • high ..... TCPがグローバルに割り当てるメモリの最大値です.
net.ipv4.tcp_rmemやnet.ipv4.tcp_wmemで送受信バッファサイズを大きくした場合は, この値も大きくしておく必要があります.
net.core.rmem_default
net.ipv4.tcp_rmemのdefaultと同様です.ただし,設定値は,net.ipv4.tcp_rmemのdefaultの方が優先されます.
net.core.wmem_default
net.ipv4.tcp_wmemのdefaultと同様です.ただし,設定値は,net.ipv4.tcp_wmemのdefaultの方が優先されます.
net.core.rmem_max
net.ipv4.tcp_rmemのmaxと同様です.ただし,設定値はこちらの方が優先されます.
net.core.wmem_max
net.ipv4.tcp_wmemのmaxと同様です.ただし,設定値はこちらの方が優先されます.
net.core.optmem_max
補助バッファの最大サイズを表します.

Example

以下に,バッファサイズの変更例を記述します.設定するバッファサイズは,帯域遅延積などを考慮して決定して下さい.

sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.tcp_rmem="4096 873800 1747600"
sysctl -w net.ipv4.tcp_wmem="4096 873800 1747600"
sysctl -w net.ipv4.tcp_mem="2048000 2048000 2048000"
sysctl -w net.core.rmem_default=873800
sysctl -w net.core.wmem_default=873800
sysctl -w net.core.rmem_max=1747600
sysctl -w net.core.wmem_max=1747600
sysctl -w net.core.optmem_max=20480

その他

設定したバッファサイズがきちんと適用されているかどうかは, Iperfなどを用いて確認すると良いと思います. Iperfでは,データ転送を開始するとコンソールにバッファサイズが表示されるので,便利です.

参考URL