WebSphere Application Server控制台显示部分应用不可用,经查日志发现报 HMGR0152W: 检测到 CPU 饥饿。当前线程调度延迟是 102 秒。HMGR0152W这个信息报出说明当前进程中存在JVM线程调度延迟。表现就是在系统运行高峰时期,系统出现WEB页面打开缓慢,登陆应用系统缓慢,登陆后应用运行缓慢,有时甚至无法访问,严重会引起WAS宕机,有很多原因可能导致这个调度线程不能以适时的方式获得CPU资源。
原理:WebSphere Application Server高可用管理器组件中包含线程调度延迟检测逻辑,它会周期性的启动一个线程, 用这个线程去跟踪是否线程已经被分派,是否按照计划运行。默认情况下,延迟检测线程每30秒钟运行一次, 如果超过计划5秒钟没有运行就会在日志中记录一条HMGR0152W消息。这条消息显示了延迟的时间或者与该线程期望得到CPU和实际得到CPU的时间差。
下面是这个问题的一些常见原因:
1. 物理内存被过量使用并且产生了分页.
2. 进程的堆大小太小导致垃圾回收频繁或者过长阻塞了其他线程的执行.
3. 系统中运行着太多线程,负载过高可能导致CPU使用过高.
这个警告信息如果不及时修正可能导致WAS不稳定的情况.你需要分析为什么调度线程发生了延迟,需要采取哪些措施.下面是一些常用的解决方法:
1. 增加物理内存防止分页.
2. 优化JVM堆内存配置,从而优化垃圾回收.(在WAS控制台里可设置详细垃圾回收,JVM的上下限值)
3. 降低系统的整体负载到一个可以接受的值.
如果HMGR0152W信息不是经常报出,并且报出的消息延迟很短(例如小于20秒), 通常不会有其他问题发生,这个时候这个消息可以被忽略.
当然在这种情况下,还可以做个javacore来看下,究竟是哪些线程在等待(1、等待什么资源 2、有多少个请求在等待、3、有多少个线程正在执行);另外检查下操作系统的配置,这个也和操作系统参数有关的。(这个可根据javacore中的结果来进一步确认);检查下数据是否有资源冲突现象,或者锁表现象。
关于JAVACORE的分析,可参看我的《was进程占用CPU率较高实例深解析》 http://xjsunjie.blog.51cto.com/999372/1136156
高可用管理线程调度延迟检测可以通过配置下面两个定制属性中的一个来实现:
1. IBM_CS_THREAD_SCHED_DETECT_PERIOD 参数决定延迟检测线程多长时间运行一次.默认值是30秒.
2. IBM_CS_THREAD_SCHED_DETECT_ERROR 参数决定多长时间的延迟需要被用这个警告信息记录在日志中.
这些属性在WAS控制台里,你可以按照如下方法配置:
1. 在管理控制台中, 点击服务器 > 核心组 > 核心组设置, 然后选择核心组名字.
2. 在其它属性下, 点击定制属性 > 新建.
3. 输入属性名和值.
4. 保存配置.
5. 如果是网络部署环境, 请注意同步所有节点.
6. 重新启动所有的服务器是该配置在该服务器上生效.
虽然我们可以用上面两个属性增加线程调度检测时间, 但是不建议通过它们使HMGR0152W警告消息完全不再报出. 这个方法只是用于优化系统消除线程调度延迟.