全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

linux上TCP connection timeout问题解决办法

 linux上TCP connection timeout问题解决办法

最近在产线上经常出现connection timeout的问题,先看看Java 中关于connection timeout 的异常如何产生

JAVA中的timeout

java.net.SocketTimeoutException: connect timed out 
客户端异常:connect timed out 
  at java.net.PlainSocketImpl.socketConnect(Native Method) 
  at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) 
  at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
  at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
  at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
  at java.net.Socket.connect(Socket.java:589) 

我们能经常看到的connect timed out异常产生,看一下java 是如何生成这个异常

plainsocketimpl.c 中

while (1) { 
        jlong newTime; 
#ifndef USE_SELECT 
        { 
          struct pollfd pfd; 
          pfd.fd = fd; 
          pfd.events = POLLOUT; 
 
          errno = 0; 
          connect_rv = NET_Poll(&pfd, 1, timeout); 
        } 
#else 
        { 
          fd_set wr, ex; 
          struct timeval t; 
 
          t.tv_sec = timeout / 1000; 
          t.tv_usec = (timeout % 1000) * 1000; 
 
          FD_ZERO(&wr); 
          FD_SET(fd, &wr); 
          FD_ZERO(&ex); 
          FD_SET(fd, &ex); 
 
          errno = 0; 
          connect_rv = NET_Select(fd+1, 0, &wr, &ex, &t); 
        } 
#endif 
 
        if (connect_rv >= 0) { 
          break; 
        } 
        if (errno != EINTR) { 
          break; 
        } 
 
        /* 
         * The poll was interrupted so adjust timeout and 
         * restart 
         */ 
        newTime = JVM_CurrentTimeMillis(env, 0); 
        timeout -= (newTime - prevTime); 
        if (timeout <= 0) { 
          connect_rv = 0; 
          break; 
        } 
        prevTime = newTime; 
 
      } /* while */ 
 
      if (connect_rv == 0) { 
        JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException", 
              "connect timed out"); 
 
        /* 
         * Timeout out but connection may still be established. 
         * At the high level it should be closed immediately but 
         * just in case we make the socket blocking again and 
         * shutdown input & output. 
         */ 
        SET_BLOCKING(fd); 
        JVM_SocketShutdown(fd, 2); 
        return; 
      } 

这里可以看到在做connect的时候,是调用 NET_Poll 或者 NET_Select, 在linux 上就是使用 poll/select

当发生timeout的时候connect_rv=0  ,这里有个注意点虽然在poll/select 是传入timeout的时间,但是这是会被打断的,connect_rv返回的值为-1 ,所以jvm里面重新计算了timeout , 确保timeout 的时间片已经运行完了,才推出循环。

newTime = JVM_CurrentTimeMillis(env, 0); 
        timeout -= (newTime - prevTime); 
        if (timeout <= 0) { 
          connect_rv = 0; 
          break; 
        } 

同时设置connect_rv 为0, 也是下面只有当connect_rv为0的时候才抛出connect timeout

什么是connect timeout ?

也就是client 发出 syn 包,server端在你指定的时间内没有回复ack,poll/select 返回0

server 端为什么没有回复ack, 因为syn包的回复是内核层的,要么网络层丢包,要么就是内核层back_log的queue满了,关于backlog在本片中就不详细描述了。

当时查看产线上的连接最高能到1000多,同时查看了backlog 的queue的大小

cat /proc/sys/net/ipv4/tcp_max_syn_backlog 

有8192 在产线上没有这么多的客户端的连接,不可能backlog queue会满,虽然syn_backlog 的设置是8192 但并不代表服务器启动的时候设置成了8192,所以必须查这个端口所设置的backlog大小

ss -lt 

看到Send-Q在8080端口是128 ,原来在服务器端启动listen 的时候设置了128的backlog

查看tomcat 的配置,默认bio的设置

<Connector executor="tomcatThreadPool" 
      port="8080"  
        protocol="HTTP/1.1" 
          acceptCount="5000" 
          connectionTimeout="25000" 
          maxHttpHeaderSize="8192" 
          useBodyEncodingForURI="true" 
          enableLookups="false"  
          redirectPort="8443"  
          URIEncoding="UTF-8"  
          maxThreads="500" 
          maxKeepAliveRequests="1000" 
          keepAliveTimeout="30000" 
        /> 

产线上已经设置了acceptCount, 默认是100 但是这里设置了是5000 ,这与通过ss看到的send-q的结果严重不符合
通过内核代码分析,发现原来内核参数不仅仅是通过tcp_max_syn_backlog控制,同时也受somaxconn控制
查看

cat /proc/sys/net/core/somaxconn 

发现值是128, OK 原因找到了,修改/etc/sysctl.conf 添加

net.core.somaxconn = 8192 

sysctl -f /etc/sysctl.conf 重新加载一下,这样就能改变全局了

问题:是1000多个连接,500个工作线程,因为backlog的大小是受socket.accept控制的,我们通常境况下会单独起一个线程去serversocket.accept(),而当前server的load并不高,不因该会出现back_log queue出现满的情况,更何况只有1000多个连接,代码就是真相,查看tomcat的源码。

原来accptor 线程在accept 之前,会去countUpOrWaitConnection 发现接受到的的socket数目大于设置的work线程数目的时候,会停止accept.

<strong>countUpOrAwaitConnection</strong>(); 
 
         Socket socket = null; 
         try { 
           // Accept the next incoming connection from the server 
           // socket 
           socket = serverSocketFactory.acceptSocket(serverSocket); 
         } catch (IOException ioe) { 
           countDownConnection(); 
           // Introduce delay if necessary 
           errorDelay = handleExceptionWithDelay(errorDelay); 
           // re-throw 
           throw ioe; 
         } 

也就是说当并发超过628个连接以上,就有可能出现backlog queue满的情况,而出现connect timeout的情况,一切皆清楚了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# linux上TCP  # connection  # timeout的原因查找  # TCP  # timeout  # 详解Linux使用shell+expect远程登录主机  # Linux主机登录abrt-cli status timed out的  # 线上  # 多个  # 客户端  # 这是  # 成了  # 不可能  # 看了  # 有个  # 就能  # 就有  # 就不  # 这么多  # 时间内  # 希望能  # 不高  # 可以看到  # 仅是  # 不符合  # 满了  # 并不代表 


相关文章: 深圳网站制作的公司有哪些,dido官方网站?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  香港服务器租用每月最低只需15元?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  油猴 教程,油猴搜脚本为什么会网页无法显示?  如何设置并定期更换建站之星安全管理员密码?  详解jQuery中基本的动画方法  网站设计制作公司地址,网站建设比较好的公司都有哪些?  智能起名网站制作软件有哪些,制作logo的软件?  移民网站制作流程,怎么看加拿大移民官网?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  5种Android数据存储方式汇总  建站之星2.7模板快速切换与批量管理功能操作指南  兔展官网 在线制作,怎样制作微信请帖?  建站之星后台密码遗忘如何找回?  建站之星如何保障用户数据免受黑客入侵?  宁波自助建站系统如何快速打造专业企业网站?  如何通过可视化优化提升建站效果?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  网站微信制作软件,如何制作微信链接?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  建站之星伪静态规则如何设置?  网站制作软件有哪些,制图软件有哪些?  香港服务器WordPress建站指南:SEO优化与高效部署策略  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  建站之星收费标准详解:套餐费用及年费价格表一览  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何用虚拟主机快速搭建网站?详细步骤解析  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何生成腾讯云建站专用兑换码?  建站OpenVZ教程与优化策略:配置指南与性能提升  c# 在高并发场景下,委托和接口调用的性能对比  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  深入理解Android中的xmlns:tools属性  广州美橙建站如何快速搭建多端合一网站?  临沂网站制作企业,临沂第三中学官方网站?  代刷网站制作软件,别人代刷火车票靠谱吗?  定制建站流程解析:需求评估与SEO优化功能开发指南  宝塔面板创建网站无法访问?如何快速排查修复?  黑客如何通过漏洞一步步攻陷网站服务器?  linux top下的 minerd 木马清除方法  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  制作网站的公司有哪些,做一个公司网站要多少钱?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  如何在阿里云ECS服务器部署织梦CMS网站?  微课制作网站有哪些,微课网怎么进?  建站之星安装失败:服务器环境不兼容? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。