一 發現問題:
服務器是Linux系統,用jmeter測試接口,發現打開很多的TCP連接,[root@m3-2 bin]# ulimit -n 65535用這個命令設置了總的連接數;進行壓測的時候,連接數可能達到50000以上,很容易報錯;查看各個狀態的TCP個數:
netstat -an | awk '/^tcp/ {++s[$NF]} END {for(a in s) print a,s[a]}',發現連接狀態TIME_WAIT的狀態很多,(統計80端口連接數netstat -nat|grep -i 80|wc -l用這個統計也行)。而不報錯的接口,打開的TCP連接數比較少,約在15000-25000這樣。
初步懷疑是tcp的TIME_WAIT狀態太多了,導致連接的時間過長,系統的端口資源被長時間的占用,新的請求,又分配不到資源。
二 解決方式:
經過3天多的時間,終於找到了有效的解決方案,可以參考該微博:http://blog.oldboyedu.com/tcp-wait/:
在sysctl.conf配置文件中# vim /etc/sysctl.conf,修改成如下的配置:
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_timestamps = 1
再運行起來,TCP的連接數明顯下降了,而且接口的TPC上升了,不容易報錯,如下圖所示: