1. 程式人生 > >golang,redigo 使用中 Cannot assign requested address的解決辦法

golang,redigo 使用中 Cannot assign requested address的解決辦法

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~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_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。