理解和處理Cannot assign requested address錯誤
阿新 • • 發佈:2020-07-21
原因
“Cannot assign requested address.”是由於linux分配的客戶端連線埠用盡,無法建立socket連線所致,雖然socket正常關閉,但是埠不是立即釋放,而是處於TIME_WAIT狀態,預設等待60s後才釋放。
Cannot assign requested address
這個報錯資訊是Linux定義的
- 連線是需要佔用埠的,每一個新的連線就是新的四元組:客戶端ip+客戶端埠+目的IP+目的埠
- 目的IP和目的埠不變,客戶端的IP不變,只有客戶端的源埠是變化的
- 問題本質就是:短連線過多,導致timewait連線過多,消耗的本地埠過多,當新連線建立的時候伺服器本身無法分配新埠就有 Cannot assign requested address 的日誌
場景簡述
簡單的邏輯圖如下
Client-ECS -> ELB --> Nginx-ECS
+---------+ +--->|Nginx-ECS| | +---------+ +------------+ +-----+ | +---------+ | Client-ECS +------>| ELB |---+--->|Nginx-ECS| +------------+ +-----+ | +---------+ | +---------+ +--->|Nginx-ECS| +---------+
出問題的場景是:ClientECS有大量的指令碼任務去訪問ELB,導致大量的連線處於TIME_WAIT狀態;
解決辦法
可能解決方法1
調低time_wait狀態埠等待時間:
調低埠釋放後的等待時間,預設為60s,修改為15~30s
sysctl -w net.ipv4.tcp_fin_timeout=30
修改tcp/ip協議配置, 通過配置/proc/sys/net/ipv4/tcp_tw_resue, 預設為0,修改為1,釋放TIME_WAIT埠給新連線使用
sysctl -w net.ipv4.tcp_tw_reuse=1
修改tcp/ip協議配置,快速回收socket資源,預設為0,修改為1
sysctl -w net.ipv4.tcp_tw_recycle=1
可能解決辦法2
增加可用埠port_range:
確認port_range範圍
# sysctl -a |grep port_range net.ipv4.ip_local_port_range = 50000 65000
修改配置
# vi /etc/sysctl.conf net.ipv4.ip_local_port_range = 1024 65535
改完後,執行命令“sysctl -p”使引數生效。
參考: