`
cfyme
  • 浏览: 263680 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

(转账)Tomcat7.0.26的连接数控制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包看看了

image001
一看一堆堆的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线程难道停止了。

查看堆栈信息,果然

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

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

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

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

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

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

 

转账地址:http://ifeve.com/tomcat7-0-26-connect-bug/

分享到:
评论

相关推荐

    模拟银行账户转账系统

    *模拟银行账户转账系统: 有A,B两个银行账户,初始金额都为1000元,A,B随机向对方转账,转账金额不得大于账户余额,账户余额为0,无法进行交易,要求用图形界面显示,下方有两个按钮为“交易开始”,“清屏”,当...

    C#MyBank的转账

    S1的C#,取款,存款,转账!希望对大家有帮助

    java多线程模拟处理银行的实时转账交易

    模拟实现多线程处理银行的实时转账交易,代码完整,可以完美运行~

    模拟银行转账

    用集合模拟数据库实现银行转账系统,有比较严格的软件分层结构,系统中数据库模拟主要用集合实现。框架用的是swing。

    RESTful Web Service实现转账

    使用RESTful Web Service实现转账业务,包括事务处理和并发控制

    慧达支付宝批量转账器v1.7绿色版

    慧达支付宝批量转账器采用超强的效验系统,帮助用户提前发现设置问题,超快转账速度,支持安全控件登录、支持数字证书付款,让支付宝批量转账更安全更可靠。 支付宝批量转账软件功能介绍: 1、支持ADSL拨号换IP 2...

    sql 实现银行转账

    帐户表(帐号,姓名,余额,锁定) 业务需求: 1.两个帐号都要存在。 2.如果任何一方被锁定(锁定字段=1),则不能转。 3.转账方最低余额为10元。 3.要保证交易完整性。

    支付与转账接口与API

    支付与转账接口与API支付与转账接口与API支付与转账接口与API支付与转账接口与API支付与转账案例

    数据库银行转账系统python实现.rar

    某电数据库课程设计大作业 实现一个银行转账系统 需要连接数据库以及设计UI 需要导入第三方库pyqt5 以及 pymysql模块 在进行一个应用系统的开发过程中,从上到下一般需要四个构件:客户端-业务逻辑层-数据访问层-...

    慧达支付宝批量转账器 v1.6.zip

    p>慧达支付宝批量转账器采用超强的效验系统,帮助用户提前发现设置问题,超快转账速度,支持安全控件 登录、支持数字证书付款让支付宝批量转账更安全更可靠。手自一体的打码方式,轻松选择。更支持ADSL拨 号换IP,...

    微信支付商家转账到零钱分销合同

    微信支付商家转账到零钱分销合同是一种电子合同,用于规定商家和分销商之间的权利和义务。这种合同通常包含以下内容: 1. 双方信息:包括商家和分销商的名称、注册地址、联系方式等。 2. 商品和服务:明确商家提供...

    实现银行转账的功能。

    Android studio实现银行转账功能。其中有链接数据库操作,要在实例数据库里查看数据的变化,可向其中添加数据,实现钱款变化的功能

    alipay+Thinkphp 单笔转账到支付宝账户封装

    alipay+Thinkphp 单笔转账到支付宝账户封装,如有疑问:sunjingjie@yeah.net

    支付宝转账收款付款截图生成软件V1.01免费安装版

    通过这款软件,就能帮助用户快速截支付宝余额、支付宝转账、支付宝收款等界面图,适用于微商、淘宝店家,快来下载体验吧。 使用说明 1、下载解压并打开支付宝转账收款付款截图生成软件 2、在软件界面中设置相关的...

    多种方式跳转到支付宝转账页面的工具类.zip

    多种方式跳转到支付宝转账页面的工具类,多种方式跳转到支付宝转账页面的工具类,多种方式跳转到支付宝转账页面的工具类

    支付宝单笔转账接口JAVA版本demo

    提供支付宝开放平台的单笔转账到支付宝账户接口JAVA版本demo 望大家共同进步

    C# MVC 支付宝商户转账即时到账源码(个人支付宝账号转账接口)

    C# MVC 支付宝商户转账即时到账源码(个人支付宝账号转账接口),个人支付宝账号申请即时到账业务,通过此接口进行转账(个人转账给个人)

    微信支付-商家转账到零钱

    微信提现到零钱功能既是商户号中"商家转账到零钱" PHP项目微信提现功能代码

    PHP封装TRC20和trc10转账查询余额完整版(带依赖包)

    TRC20和trc10转账查询余额完整版(带依赖包),代码完整封装了TRC20和TRC10下查询指定地址trx余额以及代币转账操作,可直接自定义TRX数量和TUSDT等代币数量和收款人 php版钱包实例,包括离线钱包生成、激活,TRX、...

    atiTeasye转账提现模块

    atiTeasye转账提现模块 包括转账提现申请 提现审批..

Global site tag (gtag.js) - Google Analytics