Ubuntu(Linux)カーネル・チューニングでネットワークを高速化!
これだけ最初から高速を売りにした回線が世の中に出回ると、何とかして・少しでもネットワーク速度を高速化しよう、なんて思うことも殆ど無いんだと思いますが、ふと、Ubuntu(Linux)でネットワークのスループットを向上するにはどんなパラメータがあるだろうと思い、調べて見ることにしました。

net.core.rmem_max
TCPソケットの受信バッファの最大サイズです。この値は手元のXubuntuでは、標準で131071バイト(/proc/sys/net/core/rmem_max)ですが、端末(ターミナル)から次のコマンドで16777216に変更します。
$ sudo sysctl -w net.core.rmem_max=16777216
net.core.wmem_max
TCPソケットの送信バッファの最大サイズです。この値は手元のXubuntuでは、標準で131071バイト(/proc/sys/net/core/wmem_max)ですが、rmem_maxと同様に端末(ターミナル)から次のコマンドで16777216に変更します。
$ sudo sysctl -w net.core.wmem_max=16777216
net.ipv4.tcp_rmem
TCPソケット(IPv4)の受信バッファの最小・標準・最大サイズです。この値は手元のXubuntuでは、それぞれ4096、87380、901728バイト(/proc/sys/net/ipv4/tcp_rmem)ですが、端末(ターミナル)から次のコマンドで4096、87380、 16777216(最大値はnet.core.rmem_maxが優先)に変更します。
$ sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
net.ipv4.tcp_wmem
TCPソケット(IPv4)の送信バッファの最小・標準・最大サイズです。この値は手元のXubuntuでは、それぞれ4096、16384、 901728バイト(/proc/sys/net/ipv4/tcp_wmem)ですが、端末(ターミナル)から次のコマンドで4096、87380、16777216(最大値はnet.core.wmem_maxが優先)に変更します。
$ sudo sysctl -w net.ipv4.tcp_wmem="4096 87380 16777216"
net.ipv4.tcp_no_metrics_save
ネットワークのルート・メトリクス(リンク速度、遅延時間、ホップ数などネットワークのコスト情報)を保存する・しないを設定します。手元のXubuntuでは標準で0(保存する)ですが、次のコマンドで無効にします。
$ sudo sysctl -w net.ipv4.tcp_no_metrics_save=1
net.ipv4.tcp_moderate_rcvbuf
受信バッファ・サイズの自動チューニングを次のコマンドでON(1)にします。
手元のXubuntuではこの値は標準でON(1)でしたが、ご参考に。
$ sudo sysctl -w net.ipv4.tcp_moderate_rcvbuf=1
net.core.netdev_max_backlog
カーネルの処理速度よりも早い速度でネットワーク・インタフェースがパケットを受信する場合に、カーネルがバッファ(キューイング)するパケットの最大個数を指定します。
手元のXubuntuでは標準で1000キューでしたが、次のコマンドで5000キューに変更します。
$ sudo sysctl -w net.core.netdev_max_backlog=5000
txqueuelen
ネットワーク・インタフェース(デバイス・ドライバ)のパケット送信キューサイズです。
この値の初期値はインタフェース次第ですが、イーサーネット(eth*)の場合は1000、イーモバイルのデータ通信端末(ppp0)では3でした。
次の例ではifconfigコマンドでeth0の送信キューサイズを3000キューに変更しています。
$ sudo ifconfig インタフェース名(eth0, ppp0など) txqueuelen 3000
イー・モバイルで実測・比較してみる
チューニング前、後でどの程度スループットが変わるか、イー・モバイルのデータ通信端末(GD01)を使って比較してみます。
測定方法は、BNRスピードテストを利用し、上り・下り速度を各10回測定、上位・下位20%を除いたデータの平均値とします。
まずは、標準のXbunutu(11.10)で測定した結果から。
下り平均速度:17.8Mbps
上り平均速度:1.25Mbps
続いてチューニング後の測定結果。
下り平均速度:21.7Mbps
上り平均速度:1.18Mbps
上りで大きな変化は見受けられませんでしたが、下りに関しては違いを体感できる程度のスループット向上が確認出来ました。
Ubuntu起動時にチューニング設定を自動的に有効にしたい場合
今回の設定した方法では、OS再起動時に初期値に戻ってしまいます。常に反映したい場合は、まず、/etc/sysctl.confファイルにtxqueuelen以外の設定を記述します。
$ sudo vi /etc/sysctl.conf
viが苦手な人はgeditでどうぞ。
今回の例でいえば、/etc/sysctl.confファイルの末尾に次のように追記します。
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_wmem = 4096 87380 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.core.netdev_max_backlog = 5000
txqueuelenだけはネットワーク・インタフェースの設定になるので、別の場所に設定します。
方法は色々あるんですが、今回はインタフェースが有効になった際に自動で反映されるよう、/etc/network/if-up.d/ディレクトリの中に次のようなシェルスクリプトを用意します。
まずは適当な名前でファイルを作成します。
$ sudo vi /etc/network/if-up.d/txqueuelen
※viが苦手な人はgeditでどうぞ。
中身はこんなかんじ。有効になったネットワーク・インタフェースがeth0の場合、txqueuelenを3000に設定しています。
#!/bin/sh
set -e
PATH=/sbin:/bin:/usr/sbin:/usr/bin
if [ "$IFACE" = "eth0" ]; then
/sbin/ifconfig $IFACE txqueuelen 3000
fi
保存したら、次のコマンドで実行権を付けておきます。これでおしまい。
$ sudo chmod 755 /etc/network/if-up.d/txqueuelen
興味のある方は、是非一度お試し下さい。
それでは、より良いスループット・ライフを!