Websphere性能问题分析之线程挂起

姚锴

线程也被称为轻量级进程。在大多数现代操作系统中,都是以线程为基本的调度单位,而不是进程。如果使用得当,线程可以有效的降低程序的开发和维护成本,同时提升复杂应用程序的性能;如果使用不当,不但性能提升不明显,而且会使得资源消耗更大。

线程挂起(hang)是JAVA程序运行中较常出现的典型问题。本文对WAS线程挂起问题进行了详细描述,总结出了对于该问题的分析和解决方法。

一、什么是线程挂起

WAS应用服务器所包含的一个或多个线程(Thread)运行时间过长,导致应用服务器效率降低,甚至停止响应,称为线程挂起。当应用自身需要线程长时间运行并且能够正常完成时,不属于线程挂起。

当WAS应用服务器出现线程挂起时,会自动生成javacore文件。Javacore文件是一个包含了JVM关键的状态及运行信息的快照。该快照最常用的部分是JVM中当前活动线程的列表,也因此而被称为线程转储。线程转储最常见的用途是诊断JVM中出现挂起、崩溃或CPU占用率过高的原因。

二、WAS检测挂起机制

WAS服务器对所运行的线程进行监控,如果某个线程运行时间超过一定的限制,则会被WAS服务器认为可能挂起,会在日志中写入“WSVR0605W”;如果这个线程运行超过一定时间后可以正常完成,则会在日志中写入“WSVR0606W”来解除报告。

WAS服务器对所运行的线程进行的监控策略是可以根据实际情况进行配置。配置方法是在WAS控制台中,应用程序服务器 > Server名 > 服务器基础结构 > 管理 > 定制属性,新建相应的属性。

三、线程挂起原因

一般来说,导致线程挂起的原因大体可分为两类:一种是WAS版本的bug问题,可以通过升级WAS补丁包的方式解决。另一种是应用程序自身的原因,相对来讲应用程序问题导致线程挂起的可能性较大。如多线程的死锁、程序执行数据库操作造成数据库锁升级、程序长期占用某些系统资源(文件、端口、数据库连接等)造成资源争用和循环等待。这种情况就需要收集信息,定位到具体原因,针对解决。

四、线程挂起分析

(1)信息收集

线程挂起的原因分析,主要是分析故障时间段javacore文件中的线程状态。一般来讲,WAS在线程挂起时,会自动生成javacore文件。也可在问题出现的时间段内每隔一定时间收集1个javacore文件,连续收集3个。搜集的命令是kill -3 pid,其中pid是WAS服务器的进程号。

(2)问题分析

对比连续的javacore中的所有线程,看这些线程在不同时间点的行为,找出堆栈调用信息和运行状态前后完全一样的线程。根据线程的堆栈调用信息再来定位到相应的源代码,这样就找到了线程挂起的根本原因。

在实际情况中,环境往往会有更加复杂的地方,如多个线程争用资源或者某些资源配置不合理导致存在瓶颈的时候也可能会产生挂起现象,这就需要再分析线程之间的关系。

了解原理后,我们使用IBM Thread and Monitor Dump Analyzer for Java(简称jca)对javacore文件进行分析。

使用jca打开某次线程挂起时收集的几个javacore。

选中时间相邻的三个javacore文件进行对比。

可以看到大部分的WebContainer线程被一个线程(WebContainer:94)阻塞住了,这个线程的堆栈调用信息显示在最右侧。根据这些信息,可与应用开发人员共同定为到应用代码。

五、小结

当遇到WAS线程挂起问题时,由于线程无法像进程一样被直接停止,要解决线程挂起,只有停止其所在的进程。对于WAS来说,就是重启相应的server。但欲从根本上解决问题,还需在线程挂起的同时收集必要的信息,使用前文中所介绍的方法分析,定位到问题根源。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190627A0GDN700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励