TCP keepaliveの値を調整

TCP KeepAliveの値を調整

ウェブのフロントエンドはapache httpで運用しています。どうも最近行儀がよくないクローラが時々きてはコンテンツをさらっていくんですが、ネットワーク的に行儀がわるいみたいで、TCP waitでコネクションが残ってしまうことがあります。
apache serverのstatus画面(/statusで参照できる画面)では w (Sending Reply)でとまってる状況。こっち(サーバ)としてはリクエストを返してるのに受け取ってくれないとか、もっとロウなレベルで切れるまでいかない中途半端な状態になってる模様。
一応自動監視システムでもって、その状態のスレッドが一定数を越えた場合にはhttpdを再起動して全部状態をリセットするようにしているのでサービスにはそれほど影響がないのですが、なんとかできないかなと。
で、TCPコネクションがキレないのがあまり良くないと思うのでカーネルのkeepalive関連のパラメタをいじってみます。
いじる項目は、keepalive_intvl,keepalive_probes,keepalive_timeの3つ。それぞれ意味とデフォルト値は以下の通り。

パラメタ デフォルト値 意味
keepalive_intv 75 どうですかーって尋ねるまでの間隔(秒)
keepalive_proves 10 何回どうですかーって聞く回数
keepalive_time 7200 一回接続してからコネクションをkeepaliveする時間(秒)

デフォルト値だと結構甘めなので、短い時間でキレてくれるようにしたい。

現在の設定値を確認

# sysctl -a | grep keepalive

/etc/sysctl.conf に設定値を書く

net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 4
net.ipv4.tcp_keepalive_time = 180

sysctlで反映させる。

# sysctl -p
# sysctl -a | grep keepalive
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 4
net.ipv4.tcp_keepalive_time = 180

数台あるフロントエンドのうち1台だけでやってて比較できるようにしてみる。