一、今天壓力測試時,開始12秒后出現了很多異常, 都是 java.net.NoRouteToHostException: Cannot assign requested address.
1、首先我這瀏覽器可以正常訪問接口,排除了是防火牆問題,不是被牆了。
2、開發用apacheab可以進行壓測,並且返回數據良好,排除了是tcpip的的連接數問題。
如果是這個問題,解決辦法如下:
經網上查資料, 是由於linux分配的客戶端連接端口用盡, 無法建立socket連接所致,雖然socket正常關閉,但是端口不是立即釋放, 而是處於TIME_WAIT狀態, 默認等待60s后才釋放。
查看linux支持的客戶端連接端口范圍, 也就是28232個端口:
cat /proc/sys/net/ipv4/ip_local_port_range
32768 - 61000
解決方法:
(1). 調低端口釋放后的等待時間, 默認為60s, 修改為15~30s
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
(2). 修改tcp/ip協議配置, 通過配置/proc/sys/net/ipv4/tcp_tw_resue, 默認為0, 修改為1, 釋放TIME_WAIT端口給新連接使用。
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
(3). 修改tcp/ip協議配置,快速回收socket資源, 默認為0, 修改為1.
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
3、最后發現是jmeter的keepalive沒有關閉,這里是http的keepalive。
這里消息結束后沒有及時關閉連接導致鏈接不夠用。
關閉后,成功解決。