您的位置:首页 > 产品设计 > UI/UE

golang,redigo 使用中 Cannot assign requested address的解决办法

2017-08-25 18:57 831 查看
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: