理解和處理Cannot assign requested address錯誤


原因

“Cannot assign requested address.”是由於linux分配的客戶端連接端口用盡,無法建立socket連接所致,雖然socket正常關閉,但是端口不是立即釋放,而是處於TIME_WAIT狀態,默認等待60s后才釋放。

Cannot assign requested address 這個報錯信息是Linux定義的

  1. 連接是需要占用端口的,每一個新的連接就是新的四元組:客戶端ip+客戶端端口+目的IP+目的端口
  2. 目的IP和目的端口不變,客戶端的IP不變,只有客戶端的源端口是變化的
  3. 問題本質就是:短連接過多,導致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狀態端口等待時間:

  1. 調低端口釋放后的等待時間,默認為60s,修改為15~30s

    sysctl -w net.ipv4.tcp_fin_timeout=30
    
  2. 修改tcp/ip協議配置, 通過配置/proc/sys/net/ipv4/tcp_tw_resue, 默認為0,修改為1,釋放TIME_WAIT端口給新連接使用

    sysctl -w net.ipv4.tcp_tw_reuse=1
    
  3. 修改tcp/ip協議配置,快速回收socket資源,默認為0,修改為1

    sysctl -w net.ipv4.tcp_tw_recycle=1
    

可能解決辦法2

增加可用端口port_range:

  1. 確認port_range范圍

    # sysctl -a |grep port_range
    net.ipv4.ip_local_port_range = 50000    65000
    
  2. 修改配置

    # vi /etc/sysctl.conf
    net.ipv4.ip_local_port_range = 1024     65535
    

改完后,執行命令“sysctl -p”使參數生效。


參考:


免責聲明!

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



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