end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

/etc/sysctl.conf の編集で netstatのTIME_WAITやCLOSE_WAITを軽減

あるサーバに対してsoap(http)で接続できない現象が発生した為、netstatしてみると、次のように大量のTIME_WAITが発生していました。

$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 localhost.localdom:5432 localhost.localdo:32776 ESTABLISHED 
tcp        0      0 localhost.localdom:5432 localhost.localdo:32804 ESTABLISHED 
<略>
tcp        0      0 10.209.15.205:10050     139.154.172.150:46441   TIME_WAIT   
tcp        0      0 10.209.15.205:10050     139.154.172.150:55147   TIME_WAIT   
tcp        0      0 10.209.15.205:8080      10.209.15.204:60447     TIME_WAIT   
tcp        0      0 10.209.15.205:8080      10.209.15.204:60444     TIME_WAIT   
<略>  ※200行以上のTIME_WAIT
tcp        0      0 10.209.15.205:8080      10.209.15.204:60385     TIME_WAIT   

「apache2.2の設定ファイル(httpd.conf)では、http 1.1のkeep aliveも有効にしているのになぜ?」と/etc/sysctl.conf を調べてみると、次のようになっていました。

旧 /etc/sysctl.conf

net.ipv4.ip_forward = 0
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 0
net.ipv4.tcp_fin_timeout = 10

このような現象はよくあるものらしく、ググったページを参考にしながら、net.ipv4.tcp_〜 を追加すると、TIME_WAITやCLOSE_WAITは軽減されました。

参考にさせて頂いたurl
http://network.station.ez-net.jp/server/linux/network/time_wait.asp
http://d.hatena.ne.jp/d_sea/20080812/p1

新 /etc/sysctl.conf

net.ipv4.ip_forward = 0
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 0
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_keepalive_time = 20
net.ipv4.tcp_keepalive_probes = 4
net.ipv4.tcp_keepalive_intvl = 5

※ /etc/sysctl.conf の変更後、sysctl -pで編集内容をシステムに反映しましょう
※ 現状は落ち着いていますが、しばらくnetstatの値は観察した方が良さそう

その他の/etc/sysctl.conf の解説

今回は、net.ipv4.tcp_〜 の一部を追加編集しましたが、/etc/sysctl.conf の詳細は次のurlで分かりやすく解説されていました。

http://linux.mini13i.com/?kernel%2F%A5%B7%A5%B9%A5%C6%A5%E0%A5%D1%A5%E9%A5%E1%A5%BF#eb7b6f3c