一次接到用户电话,说某个应用在并发量稍大的情况下就会出现响应时间陡然增大,同时管理控制台的响应时间也很慢,几乎无法进行正常工作。
赶到现场后,查看平台版本为Webshpere6.0.2.29,操作系统
为Windows 2003企业版sp2,于是首先分析systemout.log,发现有如下报错:
= com.ibm.websphere.ce.j2c.ConnectionWaitTimeoutException Max connections reached 869
Exception = com.ibm.websphere.ce.j2c.ConnectionWaitTimeoutException
Source = Max connections reached
probeid = 869
同时也发现有“Caused by: java.io.IOException: Async IO operation failed, reason: RC: 10053 您的主机中的软件
放弃了一个已建立的连接。”
很明显是连接池无法分配一个新连接给请求,wait时间过长达到WaitTimeout时间,第一反应是数据库连接池大小开的不够,于是设成初始50,最大150,120S空闲则自动释放连接。
但是调整参数后没有改善,过了不到10分钟应用依旧变慢。再次查看System.out和FFDC里的错误信息,发现有许多关于IO的报错:
com.ibm.ws.webcontainer.channel.WCCByteBufferInputStream 102
Exception = java.net.SocketTimeoutException
Source = com.ibm.ws.webcontainer.channel.WCCByteBufferInputStream
probeid = 102
stack Dump = java.net.SocketTimeoutException: Async operation timed out
java.io.IOException com.ibm.ws.webcontainer.servlet.RequestUtils.parsePostData 398
Exception = java.io.IOException
Source = com.ibm.ws.webcontainer.servlet.RequestUtils.parsePostData
probeid = 398
Stack Dump = java.io.IOException: Async IO operation failed, reason: RC: 55 指定的网络
资源或设备不再可用。probeid = 1184
事后才知道其实数据库和中间件之间的问题,但是一来没有报连接池大小不够的错,二来此时管理控制台也几乎无法使用,又结合此应用在操作中会上传许多文件并进行校验,怀疑是服务器
的I/O瓶颈导致应用变慢。
于是在服务器
上
开启性能工具,添加%Disk time、%Disk Write、%Disk Read、Disk Queue Length、Fage
Fault等计数器。发现%Disk Time平均维持在20~70之间,瞬时的Disk Time会达到90多,而且Disk
Read值很小,基本是Disk Write。
继续观察了一段时间,发现当磁盘读写下来后,应用还是很慢,于是分析内存
回收情况,查看是否有内存泄漏发生。
用IBM Monitoring and Diagnostic Tools for Java? – Garbage Collection and
Memory Visualizer分析发现 Mean interval between
collections只有0.46分钟,且内存使用量才250多M就开始GC,而内存参数设置为760~1260M,于是分析内存中的碎片太多,导致
GC频繁,使服务的响应速度变慢。同时分析软件得出The mean heap unusable due to fragmentation is
estimated at 34.685%,问了应用他们申请内存对象一般是短期的,于是更改GC
Policy为Gencon(分代并发),再观察GC日志发现每次回收间隔都较长,而且是young区的回收,Global
collections间隔为23分钟。
可惜做了如此的性能优化,情况一点都未改善,在控制台的性能实时检测中可以看到JDBC连接有40~60个繁忙状态,当时无法确定这是否正常,是否是确实
需要用到如此多连接。后来应用开发的检测数据库,发现很多active的连接时间长达5到10分钟,内容为一查询语句。原来应用是在Hibernat下开
发的,查询语句被它加了自己的函数,导致原先建的索引无法起作用(应用建立索引的时候犯了低级错误),后来重新建立索引后,查询很快完成,连接池繁忙数量
降低到0~5,应用恢复正常。原来是数据库的查询时间过长,导致线程都在等待数据库的返回信息,100个线程很快被用完,无法响应新的服务,因为数据库连
接池资源已经开大,所以没有这方面的报错。
回顾这一周的排错过程,走了很大的弯路,当时因为经验欠缺没有想到做thread dump,如果做了thread dump的话,应该很容易看到大量的线程在等待数据库的返回,从而定位到数据库问题。
从中我们也看到,最终的问题也许很低级,但是排查的过程会很复杂,因为中间件问题牵扯到主机、网络、数据库、应用等各方面。不过得到的经验就是,在应用响
应慢的时候,应该做个thread dump观察线程运行情况,而并非要等到hang住,cpu
100%,OutOfMemory的时候才想起分析javacore。
分享到:
相关推荐
FFST(First Failure Support Technology)则记录第一次故障的详细信息,有助于快速诊断问题。 3. **系统层面检查**:检查操作系统状态,如内存使用、磁盘空间、网络连接等,看是否存在系统级问题影响MQ。 4. **应用...
无须修改应用,JProbe就能对桌面或远程服务器上的应用进行分析,实现强大的信息展示和Java代码性能诊断功能。利用JProbe先进的数据收集功能,可以实现自动化的性能信息采集,缩短应用开发和优化周期。 JProbe在简单...
无须修改应用,JProbe就能对桌面或远程服务器上的应用进行分析,实现强大的信息展示和Java代码性能诊断功能。利用JProbe先进的数据收集功能,可以实现自动化的性能信息采集,缩短应用开发和优化周期。 JProbe在简单...
无须修改应用,JProbe就能对桌面或远程服务器上的应用进行分析,实现强大的信息展示和Java代码性能诊断功能。利用JProbe先进的数据收集功能,可以实现自动化的性能信息采集,缩短应用开发和优化周期。 JProbe在简单...
- **事务追踪**:记录并分析每一次交易的过程,帮助IT团队理解交易流程。 - **性能分析**:评估应用的响应时间和吞吐量,以确保电子商务平台的高效运行。 - **故障恢复**:提供故障恢复机制,确保即使在出现问题时也...
在Windows操作系统中,手工抓取WebSphere Application Server (WAS) 的dump文件是解决系统异常、性能问题或诊断故障的重要步骤。以下是一个详尽的指南,涵盖了如何在Windows环境下进行这个过程。 首先,理解什么是...
《LoadRunner中文使用手册》是IT领域中针对性能测试工具LoadRunner的一份详细教程,它旨在帮助用户理解和掌握如何有效地使用这个强大的工具进行系统压力测试。LoadRunner是HP(现已被Micro Focus收购)开发的一款...
8. **故障排查与性能优化**:分享如何诊断和解决MQ运行时的问题,以及如何调整参数来优化MQ性能。 9. **实战案例**:可能包含一些实际应用场景的示例,帮助理解MQ在业务系统中的具体应用。 压缩包内的“MQ应用入门...
单点登录允许用户仅需一次登录即可访问所有授权的应用程序和服务。这对于提高用户体验和简化管理至关重要。WebSeal支持多种SSO协议,包括但不限于Kerberos、SAML等,使得它可以轻松集成到现有的安全架构中。 ### ...
本文主要探讨的是一个名为"财务管理创新及数据治理项目"的情况,这个项目旨在提升集团公司的财务管理水平,通过全面预算管理和数据治理来优化财务流程和决策。项目预计总投资为709万元,采用"咨询-实施"模式,涵盖了...
6.6.3 在工作空间和配置之间强制建立一对一关系..... 177 6.7 本章小结...... 178 6.8 参考文献...... 178 第Ⅱ部分 扩展Eclipse基础 第7章 扩展Eclipse,亦利亦弊 181 7.1 对扩展Eclipse感到兴奋吗? ...