java.net.NoRouteToHostException: Cannot assign requested address 問題分析(端口被用完的解決方法)


 

 

問題:

錯誤原因: 由於liunx 分配的客戶端連接端口用盡,無法建立socket連接所致,雖然socket正常關閉,但是端口不是立即釋放,而是處於 TIME_WAIT 狀態,默認等待60s后釋放。
查看liunx支持的客戶端連接端口范圍,也就是 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_reuse,默認為0,修改為1,釋放TIME_WAIT端口給新連接使用。 echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
3. 修改 ctp/ip 協議配置,快速回收socket資源,默認為0.修改為1。echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle

https://blog.csdn.net/weixin_43757847/article/details/88188091

https://my.oschina.net/shichangcheng/blog/1560864

https://stackoverflow.com/questions/32282112/error-setting-net-ipv4-tcp-tw-reuse-net-ipv4-tcp-tw-recycle-in-sysctl-conf

 

偉程君幫忙找的

 

后記:

找到解決方法了

修改JMeter.properties中改動httpclient4.idletimeout=<time in ms> 設置成自己認為合理的時間,一般可設置成10-60s(表示連接空暇10s后才會斷開),注意這邊單位是ms。

參考: https://blog.csdn.net/Stesthu/article/details/87968927

 

后記:

前面對這個概念有點誤解了,建立長連接后,httpclient4.idletimeout這里意思是 長鏈接端口一空閑就斷開,比如服務器還沒響應回來空閑了直接斷開,導致報錯。這里時間應該設置長一點,保持長連接一直保持連接

參考: https://www.cnblogs.com/kaibindirver/p/11957645.html     要使用長連接還要配置一下 請求器見連接有講

 

查看端口有沒用完  netstat -an   查看是否有端口在 timewait

https://i-beta.cnblogs.com/posts/edit-done;postId=11956755

 

后記:

配置長連接后,依舊會有報錯問題,最后是要修改mac上端口的釋放時間 參考: https://www.cnblogs.com/kaibindirver/p/11958506.html

而且在jmeter模擬發送請求的時候,請求頭記得要加上

Connection:keep-alive 保持連接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM