最近临近产品发版,因为有性能压力测试
{"file":"api/init.go:15:func1()","level":"error","msg":"记录用户操作失败: dial tcp 127.0.0.1:3306: connect: cannot assign requested address","time":"2022-03-01 09:57:34"}
原因是客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端 口号,所以新的连接没办法绑定端口,因此就会跑出异常说 无法分配请求地址
在这里插入图片描述

  • 关于服务器TCP请求的TIME_WAIT,linux下可用netstat -a|grep TIME_WAIT 这个命令去查看一下连接数。
  • 同常有比较多条的一个列表,在程序跑的过程中,为了方便看到time_wait的数量是否增多,可以直接用命令netstat -ant|grep -i time_wait |wc -l 查看。
    因此比较直接的解决方式就是修改系统内核相关的参数:

net.ipv4.ip_forward=1 表示开启对于TCP时间戳的支持,若该项设置为为0,则net.ipv4.tcp_tw_reuse设置不起作用,该值系统默认是0

net.ipv4.tcp_syncookies = 1 表示开启对于TCP时间戳的支持,若该项设置为为0,则net.ipv4.tcp_tw_reuse设置不起作用,该值系统默认是0

net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭

net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭

net.ipv4.tcp_fin_timeout = 30 修改系統默认的TIMEOUT时间,默认是60

修改方式:

编辑 /etc/sysctl.conf 文件,加入参数内容,以上5个参数是我查到的认为有效的结果,然后我的实际情况仅修改了其中三个:

net.ipv4.ip_forward=1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

编辑完成后执行命令 /sbin/sysctl -p 让参数立即生效。至于气他参数就看具体情况了。我这种修改方式是直接永久保存的,不会受网络服务重启,系统重启等的影响,若要临时修改请自行查询命令。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐