- トラフィックの上限でもない
- CPUリソースの枯渇でもない
- HDDのIOが遅い問題でもない
- コンテンツが重くなる(接続できない)
というケースで、見落としがちなLinuxのネットワーク周りのチューニングについてです。
iptables関連
iptablesを使用している場合、下記のパラメータを注意して下さい。
/proc/sys/net/ipv4/ip_conntrack_max
ip_conntrackに記録できる最大値です。65536あたりが初期設定になっているかと思います。これだとパケットの取りこぼしがすぐに起きてしまいます。1コネクションあたり約350バイト消費するので、実装されているメモリに応じて値を変更して下さい。
TCPコネクション(セッション)関連
現在使われているTCPコネクション(セッション)数をざっくりと把握します。
$ netstat -t | wc -l
大規模なWEBサーバだとTCPコネクションが枯渇する問題が発生します。数万コネクションを超えていた場合、調整した方が良いです。初期設定でlocal portを使用する許可されている範囲は以下の通り。
$ cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
61000 – 32768 = 28232ポート利用可能です。
1024-65535がエフェメラルポートなので、1024-65535を設定してしまいましょう。
TCPのtimeout調整
/proc/sys/net/ipv4/net.ipv4.tcp_tw_reuse
/proc/sys/net/ipv4/tcp_tw_recycle
TIME_WAIT関係を再利用することを許可する値です。NAT環境では問題が起きることがあるので注意する設定です。これを有効にした上で、
/proc/sys/net/ipv4/tcp_fin_timeout
の値を変更すると、TIME_WAITの調整が可能です。
番外編
接続数が増えてくるとサーバが同時に使用するファイル数も増えてくるかと思います。ファイルディスクリプタ周りの設定を変更しておきましょう。
大抵の初期設定ではこんな感じかと思います。
$ ulimit -n
1024
apacheが動作しているユーザーが1024個以上のファイルを同時に使用するケースなんてのはざらにあるかと思います。
/etc/security/limits.confにapacheが動作しているユーザーで、同時に使用できるファイル数の制限を調整してあげます。
/etc/security/limits.conf
www-data soft nofile 40960
www-data hard nofile 40960
まとめ
再起動してもカーネルパラメータが有効にするため、/etc/sysctl.confへ設定を記述。
/etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
iptablesは使っていないので、こんな感じ。tcp_tw_recycleなどは環境によっては問題になります。また、本来tcp_fin_timeoutをこんな小さな値にするのは良くありません。環境によって調整して下さい。
特に大規模な携帯コンテンツはコネクションがやたら多くきますので、この辺の設定は必須です。
参考書籍
大規模アクセスに耐えられるインフラを構築するのには以下の書籍がとても参考になります。