2015年6月19日金曜日

ubuntuのネットワークを高速化する

Ubuntu(Linux)カーネル・チューニングでネットワークを高速化!

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

52

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)を使って比較してみます。

58

測定方法は、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


興味のある方は、是非一度お試し下さい。


それでは、より良いスループット・ライフを!

1 件のコメント: