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。

你可能感兴趣的:(golang,redigo 使用中 Cannot assign requested address的解决办法)