系統出現:Cannot assign requested address
網上找了下原因,大致上是由於客戶端頻繁的連伺服器,由於每次連線都在很短的時間內結束,導致很多的TIME_WAIT,以至於用光了可用的端 口號,所以新的連線沒辦法繫結埠,即“Cannot assign requested address”。是客戶端的問題不是伺服器端的問題。通過netstat,的確看到很多TIME_WAIT狀態的連線。
client端頻繁建立連線,而埠釋放較慢,導致建立新連線時無可用埠。
網上的解決方法:
執行命令修改如下2個核心引數 (需要root許可權)
sysctl -w net.ipv4.tcp_timestamps=1 開啟對於TCP時間戳的支援,若該項設定為0,則下面一項設定不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1 表示開啟TCP連線中TIME-WAIT sockets的快速回收
linux核心中存在兩個引數:
net.ipv4.tcp_tw_reuse = 1表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連線,預設為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1表示開啟TCP連線中TIME-WAIT sockets的快速回收,預設為0,表示關閉。
在/etc/sysctl.conf檔案中加入上述引數,然後執行/sbin/sysctl -p讓引數生效。
但是由於我們專案在docker中執行,並且很難單純通過增加機器進行橫向擴充套件。當時從網上找到了docker調整網路核心引數的方式,但是經過試驗,沒有效果。