読者です 読者をやめる 読者になる 読者になる

BR450ルーターへ接続したRaspberry Pi2のネットワークスピードが遅かったので対応した

Raspberry Pi ネットワーク

BR450ルーターへ接続したRaspberry Pi2のネットワークスピードが遅かったので、対応した時のメモを残します。

 

環境

 

症状

例えば、sudo apt-get updateをした時に、

pi@raspberrypi ~ $ sudo apt-get update
Get:1 http://archive.raspberrypi.org wheezy Release.gpg [490 B]
...
34% [6 Packages 2,247 kB/6,903 kB 33%]                      1,538 B/s 50min 27s

と、50分もかかるような状態でした。

一方、Windows7は特に問題なく、GB単位のダウンロードも可能です。

 

対応

ダウンロードが遅くなるといえば、過去にWindows7で対応した事例がありました。
BR450ルーターの下にWindows7を接続すると、接続スピードが遅くなる - メモ的な思考的な

たぶんこれだろうと考え、RaspbianのTCP受信ウィンドウまわりについて調べてみたところ、以下の記事がありました。
kernel/システムパラメタ - Linux Tips

その記事を見ると、net.ipv4.tcp_window_scalingというパラメータについて、

RFC1323のTCPウィンドウ スケーリング(一度に送れるウィンドウの大きさを決める)を無効/有効にする。有効にすると、64K以上のTCP windowを使えるようになる。巨大なファイルをFTP/SCP/HTTPなどでやりとりする際、うまく転送出来ない場合に無効(0)にすると解決されることがあるらしい。デフォルトでは有効になっている。ただし、これを無効(0)にすると、window sizeが最大でも32768に制限されるため、伝送速度が落ちることがある。

とありました。

また、対応するLinuxカーネルについても触れられていて、

カーネルバージョン 2.6.17 以降では、最大で 4 [MB] までのバッファサイズの 完全自動チューニングが行なわれます。

と、現在のカーネルLinux raspberrypi 3.18.11-v7+ #781では自動チューニングが行われていそうでした。

 
念のためsysctlコマンドを使いRaspbianの状態を調べてみたところ、自動チューニングが行われているようでした。

pi@raspberrypi ~ $ sysctl net.ipv4.tcp_window_scaling
net.ipv4.tcp_window_scaling = 1

 
そのため、/etc/sysctl.confファイルの一番最後にnet.ipv4.tcp_window_scaling = 0という設定を加えることにしました。

# 編集
pi@raspberrypi ~ $ sudo nano /etc/sysctl.conf

# 結果確認
pi@raspberrypi ~ $ cat /etc/sysctl.conf
...
vm.min_free_kbytes = 8192

net.ipv4.tcp_window_scaling = 0

 
再起動して、自動チューニングが行われない設定が保存されているかを確認します。

# 再起動
pi@raspberrypi ~ $ sudo reboot

# 設定の確認
pi@raspberrypi ~ $ sysctl net.ipv4.tcp_window_scaling
net.ipv4.tcp_window_scaling = 0

 
この状態でsudo apt-get updateを行ったところ、スピードが途中で低下することなく、無事に終了しました。

 
なお、Raspbianに限らずどのLinuxでも発生しそうなので、今後同じような症状が出てきた時は同じようなことを試してみようと思いました。