今天发现线上一台机器,监控一直在告警,一看是健康检查不通过,就上去查看了下,首先自己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、提供一次问题排查的参考。
相关推荐
*模拟银行账户转账系统: 有A,B两个银行账户,初始金额都为1000元,A,B随机向对方转账,转账金额不得大于账户余额,账户余额为0,无法进行交易,要求用图形界面显示,下方有两个按钮为“交易开始”,“清屏”,当...
S1的C#,取款,存款,转账!希望对大家有帮助
模拟实现多线程处理银行的实时转账交易,代码完整,可以完美运行~
用集合模拟数据库实现银行转账系统,有比较严格的软件分层结构,系统中数据库模拟主要用集合实现。框架用的是swing。
使用RESTful Web Service实现转账业务,包括事务处理和并发控制
慧达支付宝批量转账器采用超强的效验系统,帮助用户提前发现设置问题,超快转账速度,支持安全控件登录、支持数字证书付款,让支付宝批量转账更安全更可靠。 支付宝批量转账软件功能介绍: 1、支持ADSL拨号换IP 2...
帐户表(帐号,姓名,余额,锁定) 业务需求: 1.两个帐号都要存在。 2.如果任何一方被锁定(锁定字段=1),则不能转。 3.转账方最低余额为10元。 3.要保证交易完整性。
支付与转账接口与API支付与转账接口与API支付与转账接口与API支付与转账接口与API支付与转账案例
某电数据库课程设计大作业 实现一个银行转账系统 需要连接数据库以及设计UI 需要导入第三方库pyqt5 以及 pymysql模块 在进行一个应用系统的开发过程中,从上到下一般需要四个构件:客户端-业务逻辑层-数据访问层-...
p>慧达支付宝批量转账器采用超强的效验系统,帮助用户提前发现设置问题,超快转账速度,支持安全控件 登录、支持数字证书付款让支付宝批量转账更安全更可靠。手自一体的打码方式,轻松选择。更支持ADSL拨 号换IP,...
微信支付商家转账到零钱分销合同是一种电子合同,用于规定商家和分销商之间的权利和义务。这种合同通常包含以下内容: 1. 双方信息:包括商家和分销商的名称、注册地址、联系方式等。 2. 商品和服务:明确商家提供...
Android studio实现银行转账功能。其中有链接数据库操作,要在实例数据库里查看数据的变化,可向其中添加数据,实现钱款变化的功能
alipay+Thinkphp 单笔转账到支付宝账户封装,如有疑问:sunjingjie@yeah.net
通过这款软件,就能帮助用户快速截支付宝余额、支付宝转账、支付宝收款等界面图,适用于微商、淘宝店家,快来下载体验吧。 使用说明 1、下载解压并打开支付宝转账收款付款截图生成软件 2、在软件界面中设置相关的...
多种方式跳转到支付宝转账页面的工具类,多种方式跳转到支付宝转账页面的工具类,多种方式跳转到支付宝转账页面的工具类
提供支付宝开放平台的单笔转账到支付宝账户接口JAVA版本demo 望大家共同进步
C# MVC 支付宝商户转账即时到账源码(个人支付宝账号转账接口),个人支付宝账号申请即时到账业务,通过此接口进行转账(个人转账给个人)
微信提现到零钱功能既是商户号中"商家转账到零钱" PHP项目微信提现功能代码
TRC20和trc10转账查询余额完整版(带依赖包),代码完整封装了TRC20和TRC10下查询指定地址trx余额以及代币转账操作,可直接自定义TRX数量和TUSDT等代币数量和收款人 php版钱包实例,包括离线钱包生成、激活,TRX、...
atiTeasye转账提现模块 包括转账提现申请 提现审批..