通信性能に影響するLinuxのOS設定(TCP編)

通信性能に影響するLinuxのOS設定(TCP編)

Linuxの一般的なディストリビューション(UbuntuやRHELなど)では、特にネットワークのパラメータの設定を変更しなくても、1Gbpsまでの環境では通信性能に問題が起きることはほとんどありません。しかし、10Gbps~の環境や、遅延の非常に大きい環境(海外との通信等)では、デフォルトの状態だと性能を出し切ることができません。今回は、LinuxのOSのTCP通信に関するネットワーク設定で代表的なものを紹介します。

TCPの設定

TCPは遅延・パケットロスの大きい環境では性能が低下します。このうち、パケットロスに関してはプロトコルの特性によるものなので、パラメータチューニングによる改善はできませんが、遅延に関しては改善することが可能です。こうしたパラメータチューニングが必要となる例としては、AWSでリージョン間の通信を行う場合などが挙げられます。AWSのEC2では10Gbps~の帯域を持つものもあり、リージョン間で最大性能を発揮するためにはOSのデフォルトの設定では不十分です。

遅延がある環境でのTCPの性能の理論値は、以下のようになります。

理論最大スループット[bps] = TCPバッファサイズ[byte] / 遅延[sec]
例:TCPバッファサイズ10MBで遅延が100msの場合の理論最大スループットは100MB/sec (800Mbps)

このように、遅延のある環境でのTCPの性能を上げるためにはバッファサイズを大きくする必要があります。OSのデフォルト設定はディストリビューションなどにもよって変わるのですが、大きくても数MB程度であることが多いです。

Linuxでは、以下のコマンドでTCPのバッファサイズを設定します。

sysctl -w net.ipv4.tcp_rmem="<min> <default> <max>"
sysctl -w net.ipv4.tcp_wmem="<min> <default> <max>"

# 例:最大バッファサイズを100MBに設定
sysctl -w net.ipv4.tcp_rmem="4096 87380 104857600"
sysctl -w net.ipv4.tcp_wmem="4096 87380 104857600"

min, default, maxという3つの数値がありますが、重要なのはmaxの値です。TCPはウィンドウスケーリング機能によってバッファサイズが動的に変化しますが、このmaxの値を大きくすることで、遅延が大きい時にウィンドウスケーリングによるバッファサイズの拡大がmaxの値までできるようになり、スループットが向上します。

なお、上記の設定は一時的なもので、永続化するためには以下のようにします。

# /etc/sysctl.confのファイルに以下を追記

# 例:最大バッファサイズを100MBに設定
net.ipv4.tcp_rmem="4096 87380 104857600"
net.ipv4.tcp_wmem="4096 87380 104857600"

# 設定を反映
sysctl -p
TOP