Linux 連線數調校.
Temperature: 0 °C
最近常常遇到連線數太多(因為底層 WebService 太忙了).
web 最後連不上的問題.
後來 用這個指令
netstat -anl | grep 80 | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }'
檢查發現
LISTEN 2
FIN_WAIT1 4
FIN_WAIT2 113
ESTABLISHED 73
TIME_WAIT 566
SYN_RECV 1
停在 TIME_WAIT 的數目偏大了,
原本 linux 的 somaxconn 只有 1024,
所以等於只剩大約 300多個連線可以給客戶連.
查了好幾篇網路文件.
總算調好參數.
現在 sysctl.conf 裡面
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_fin_timeout = 20
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.ip_local_port_range = 9000 64000
lighttpd.conf 裡面加上
server.max-fds = 2048
一切搞定
ps: 後來發現 net.ipv4.tcp_tw_reuse, net.ipv4.tcp_tw_recycle 如果打開,
在 NAT 後面會發生問題,
所以還是關掉比較好.
參考下列幾篇:
http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html
http://www.lognormal.com/blog/2012/09/27/linux-tcpip-tuning/
捷運科技大樓站 Go