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台だけでやってて比較できるようにしてみる。