参考:http://ifeve.com/tomcat7-0-26-connect-bug/

首先感谢@烈元一起排查此问题。今天发现线上一台机器,监控一直在告警,一看是健康检查不通过,就上去查看了下,首先自己curl了下应用的url,果然是超时没有响应,那就开始按顺序排查了:

1、 load非常低,2、gc也正常,3、线程上也没死锁,4、日志一切正常。那是什么情况呢,不能忘记网络啊。果然,netstat命令一把,结果如下:

TIME_WAIT 68
CLOSE_WAIT 194
ESTABLISHED 3941
SYN_RECV 100

问题出来了,SYN_RECV竟然达到100个,正常情况下,半连接的请求应该是很小的。而且我们机器是内部的,不是lvs,不太会有半连接攻击,怎么可能达到这么大呢?

再grep SYN_RECV的连接,看到全部都是nginx在连接这台mtop机器,那接下来就dump tcp包看看了


一看一堆堆的wjas向mtop发起SYN连接请求,可是mtop机器是绝大部分没回应,只有极少的mtop机器syn+ack包。
注:wjas一天向mtop发起了近20亿的健康检查请求,够多的,所以没有外部流量时,还是有一大堆的http请求到应用上。

看系统信息,内核是2.6.32-220.23.2.ali1113.el5.x86_64的,半连接队列的长度是128不同的内核,半连接队列长度算法稍有不同,可以参考文章:linux诡异的半连接(SYN_RECV)队列长度。

可见是mtop半连接队列满了,不再接受新的tcp连接,导致请求没有响应了,但应用其实很空闲。

问题表现很清楚了,接下来就是各种怀疑了,因为这机器为解决之前tcnative的crash bug,刚切换成了nio模式、又昨天我手贱,在上面搞过btrace,aliperf。自己也成嫌疑,但这是半连接队列满,要么受到半连接攻击(排除,内网不太可能有半连接攻击),要么是Accept线程没有及时处理,应用没有接收连接的请求,导致三次握手后的队列连接满再引起半连接队列满了。(总结起来好像很有逻辑,排查的时候没那么明确的,还在想各种可能)

我们知道,tomcat有一个Acceptor线程,监听在端口上,在收到连接请求后,会立刻把请求交个后面线程池处理,bio是直接拿线程等待数据,nio与apr会在poller线程上注册监听,也就是select模式,底层再基于epoll事件触发(和nginx的处理模式有点区别)。那就是这个Acceptor线程难道停止了。

查看堆栈信息,果然

当前的这个acceptor已经被禁用了,需要唤醒,多次dump线程,发现此线程一直是这个状态,这就解释了为什么了。

马上查看tomcat源码,发现此代码是在tomcat的连接数(nio)达到1w的时候,会park当前线程,再请求处理后,会再唤醒,继续接受新的连接,Btrace了一把,果然这个连接数值是1w,但什么情况下,会导致这个值那么大,一直把线程暂停呢?按说如果要达到这么大的连接,我们的T4机器早就鸡飞狗跳了。

Google一把,原来是tomcat7.0.27之前的bug,我们使用的刚好是7.0.26.中枪了,不管是nio,bio,apr,都存在这个问题。Tomcat的代码如下:

当接受连接,出现异常时候,旧版本没有把这个数组减少,这时候就拼人品了,如果异常的请求累积,达到连接的最大值,就发生机器很闲,但tcp的连接队列与半连接队列满的情况了

tomcat在7.0.28修复了此问题,参见Tomcat 7 Changelog 。

1、如有遇到此类似情况,可看看是否这原因。
2、当最新版的jar或者容器稳定后,早点升级吧,特别是bug修复。
3、提供一次问题排查的参考。

Tomcat7.0.26的连接数控制bug的问题排查相关推荐

  1. Windows XP环境下Apache2.2.21和Tomcat7.0.26下的整合

    用到这个纯属偶然吧,实训的进行系统设计时自己觉得用下Apache和Tomcat整合下较好.因此网上查找了一些,自己实现了一下.我们都知道Tomcat 应用于服务器JSP处理是比较强的,但遇到一些诸如H ...

  2. eclipse无法创建tomcat7.0的server

    版权声明:转载请注明作者及出处,否则将追究法律责任. https://blog.csdn.net/q2158798/article/details/83958444 学习记录:BUG记录 eclips ...

  3. Tomcat7.0浅析

    Tomcat7.0浅析 目录结构 启动分析 结构体系 管理程序 host-manager Web 应用程序 manage Web 应用程序 Tomcat服务器是一个免费的可放源代的Web应用服务器,它 ...

  4. Tomcat7.0源码分析——请求原理分析(上)

    前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多早期的J2EE项目,由程序 ...

  5. Tomcat7.0源码分析——Session管理分析(下)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52451061 前言 在<Tomcat7.0 ...

  6. Tomcat7.0源码分析——Session管理分析(上)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52450268 前言 对于广大java开发者而言, ...

  7. Ubuntu下利用JDK的Keytool配置Tomcat7.0的SSL协议

    Ubuntu下利用JDK的Keytool配置Tomcat7.0的SSL协议: 1.用JDK自带的Keytool生成服务器证书:   1)打开终端控制台,转向tomcat主目录,执行生成keystore ...

  8. Ubuntu 10.10配置JRE、JDK、Eclipse和Tomcat7.0.5

    1.安装JDK 1.1.到官网下载相关的JDK,这里下载的是 jdk-6u23-linux-i586.bin. 网站:http://www.oracle.com/technetwork/java/ja ...

  9. 三级数据库还是linux好,08年计算机三级数据库辅导:如何修改Linux下MySQL5.0的默认连接数...

    08年计算机三级数据库辅导:如何修改Linux下MySQL5.0的默认连接数 分类:计算机等级| 更新时间:2008-08-25| 来源:教育联展网 这段时间服务器崩溃2次,一直没有找到原因,今天看到 ...

最新文章

  1. git克隆 不带目录_Git 系统学习笔记
  2. 【Mybatis】 mapper 继承
  3. Windows 8 DirectX 开发学习笔记(十六)使用Terragen生成自然环境贴图
  4. .net oa 用到那些技术_惨绝人寰!OA高达834分却只配收拒信?
  5. 平面杆系结构有限元分析C++程序设计思路
  6. 小米笔记本pro黑苹果原厂intel蓝牙亲测可用!!
  7. 使用postman解决浏览器POST测试时登录问题:未登录无法进行POST提交
  8. 科技粉必看的10部电影
  9. postgresql修改字段名
  10. 实现将exe格式的软件重新打包为msi格式的静默安装软件,方便域控使用策略分发软件
  11. word一级标题行距一样宽度不一致
  12. 【CSS】对话框--禁止弹框/对话框蒙层下方内容滚动
  13. MOOC人工智能原理学习笔记1
  14. JS进行人民币大小写转换
  15. 【项目管理软件盛宴】谁才是人气王?
  16. Creator打android包时报Could not resolve all files for configuration ':jcore-react-native:lintClassPath'异
  17. Java 复制PPT幻灯片
  18. greenplum数据库的使用
  19. 2022《人工智能》_ch06
  20. Windows下安装MySQL卡在Starting Server..的解决办法

热门文章

  1. python的raw_ input是什么意思-对python中raw_input()和input()的用法详解
  2. 5G 在物联网中的需求
  3. Go 语言编程 — GC 垃圾回收
  4. Microsoft Azure_Fabric
  5. ASCII、GB2312、GBK、Unicode、UTF-8介绍和转换
  6. 系列TCP/IP协议-广播与多播(010)
  7. JVM中线程是否可以并行执行
  8. .gitignore无效解决方案以及git rm和rm的区别
  9. 数据量很大的排序问题 大量数据如何排序
  10. 阿里新生的面试经,与老人分享的职业进阶攻略及规划