golang,redigo 使用中 Cannot assign requested address的解決辦法
阿新 • • 發佈:2019-02-02
go使用redigo建立redis連線池處理高流量資料快取
情景:
高併發,高流量,分散式
問題:
“Cannot assign requested address.”是由於Linux分配的客戶端連線埠用盡,無法建立socket連線所致,雖然socket正常關閉,但是埠不是立即釋放,而是處於TIME_WAIT狀態,預設等待60s後才釋放。
解決:
1.高併發情況下,調高MaxIdle (根據qps自行計算)
2.減少defer使用
3.減少程式中無效記憶體使用,連線使用完畢後快速釋放
4.tcp釋放時間,減小。修改 linux配置檔案調整,調低time_wait狀態埠等待時間:
1. 調低埠釋放後的等待時間,預設為60s,修改為15~30ssysctl -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_timestamps=1
3. 修改tcp/ip協議配置,快速回收socket資源,預設為0,修改為1
sysctl -w net.ipv4.tcp_tw_recycle=1
修改引數:
$ vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 10000 65000 -----意味著10000~65000埠可用
改完後,執行命令“sysctl -p”使引數生效,不需要reboot。