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.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では,データ転送を開始するとコンソールにバッファサイズが表示されるので,便利です.