服务器tcp连接上限问题解决:报错代码10060 由于连接方在一段时间后没有正确答复或连接的主机没有反应

first

  • 在flask后台上新开了一个接口,然后准备做一下压测
  • 压测报错如下图
    在这里插入图片描述

定位原因

  • 第一种情况(后台服务问题?):

    • 1,难道是因为flask的性能不够,导致的这个问题?
      否决了,因为我部署前面 有nginx->gunicorn(8个gevent worker) -> flask->redis,这种流程是不应该有性能瓶颈的,随后查看了log,也证实了我的想法
  • 第二种情况(客户端问题?):

    • 1,Google搜索,大多数是做爬虫时多线程并发遇到了这种情况,解决方案统一为补获异常然后进行重试
  • 第三种情况(服务器问题?):

    • 1,多线程连接服务器,触发服务器连接数上限
  • ps: emmm… 阿里云的bug啊,为什么tcp连接还有半个的,是因为处于四次挥手阶段嘛?(题外话题外话)

2,通过阿里云的服务监控看到这个图基本可以确定是因为tcp连接数上限所导致客户端的异常
服务器tcp连接上限问题解决:报错代码10060 由于连接方在一段时间后没有正确答复或连接的主机没有反应_第1张图片

 ps:也可以通过linux命令 :
 netstat -na|grep ESTABLISHED  | wc -l 计算出来目前活跃的tcp连接
 另外通过Googl得知:服务器默认socket上限为5000.... 这个也比较符合上图中触发异常的条件

解决方案:

  • 1,查看 配置文件:cat /etc/sysctl.conf,按照需要对文件进行配置
	net.ipv6.conf.all.disable_ipv6 = 1
	net.ipv6.conf.default.disable_ipv6 = 1
	net.ipv6.conf.lo.disable_ipv6 = 1

	vm.swappiness = 60
	net.ipv4.neigh.default.gc_stale_time=120
	net.ipv4.conf.all.rp_filter=0
	net.ipv4.conf.default.rp_filter=0
	net.ipv4.conf.default.arp_announce = 2
	net.ipv4.conf.lo.arp_announce=2
	net.ipv4.conf.all.arp_announce=2
	net.ipv4.tcp_max_tw_buckets = 5000 # 这个表示系统同时保持TIME_WAIT套接字的最大数量
	net.ipv4.tcp_syncookies = 1
	net.ipv4.tcp_max_syn_backlog = 1024 # 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。 
	net.ipv4.tcp_synack_retries = 2
	vm.overcommit_memory = 1

2, 修改其中的
net.ipv4.tcp_max_tw_buckets = 10000
3, sudo sysctl -p 使这个配置立即生效
4, 注意:123步的前提是ulimit -n 先查看自己服务器:打开文件描述符的最大值(我司服务器之前已经配置好了是65535)

ulimit -a
 
ulimit -u    # max user processes
 
ulimit -n    # open files

如果要进行修改则:
编辑/etc/secutity/limit.conf
* soft nofile 65536      # open files  (-n)
* hard nofile 65536
 
* soft nproc 65565
* hard nproc 65565       # max user processes   (-u)

你可能感兴趣的:(linux)