我对 AIX 和系统监控还很陌生。实际上,我们的应用程序目前在 AIX 5.3 中的 jboss 5.1 上运行生产。请检查以下配置和系统设置。
- AIX 系统配置
- 操作系统级别 5.3.9.0 (
oslevel -g
) - 物理内存大小 24GB (
svmon -G
) - 页面空间 4GB (
lsps -s
) - 处理器 3 核,处理器类型:PowerPC_POWER6,处理器时钟速度:4704 MHz(
prtconf | grep Processor
)
- 操作系统级别 5.3.9.0 (
- Java 版本
- JRE 1.6.0 IBM AIX 构建 pap6460sr10fp1-20120321_01 (SR10 FP1) (
java -fullversion
)
- JRE 1.6.0 IBM AIX 构建 pap6460sr10fp1-20120321_01 (SR10 FP1) (
- JBoss 配置
- 杰博斯5.1/JBoss 企业服务总线4.11
- 大黄蜂与消费者流量控制
- Java选项:
-d64 -Xms2g -Xmx4g -XX:MaxPermSize=1024m
有时我们会观察到非常奇怪的行为杰博斯冻结时没有任何错误日志。服务器日志也停止,没有任何进一步的跟踪。我们也无法获取线程转储(kill -3
),并且它不会在那时生成。(kill -3 xxxxx
在正常情况下有效)我们唯一可用的选项是重新启动 jboss 服务器,它看起来像是重新启动后冻结时间过程中队列中的所有消息。
我们尝试调整 JBoss hornetq 中的某些设置,但我们认为问题出在那里。 Hornetq 默认卡住。但我们运气不佳,也无法在任何时候隔离问题。我们正在寻找 nmon 等工具来监控这个问题,但不知道它是否足够好。
请提供一些要点来调查此问题。
谢谢
答案1
1. 检查完整的核心转储
您需要检查您的 AIX 上是否激活了全核心:
lsattr -Elsys0 | grep full
要启用全核心:
chdev -l sys0 -a fullcore=true
2. 检查限制
Fsize 和核心限制需要设置为unlimited
。
ulimit -c unlimited
ulimit -f unlimited
答案2
首先要查看的是堆空间耗尽。通过将以下内容添加到 Java opts 来启用详细垃圾收集。
-verbose:gc
手动查看输出或使用以下方法进行分析http://www.tagtraum.com/gcviewer.html。
据我记得,AIX JDK 与 Sun JDK 有很大不同,包括 GC 策略,因此在阅读 JDK 时需要小心。
在健康的应用中,你会看到已用堆空间增加,然后当发生完整 GC 时,已用空间会大幅下降。这将在应用的整个生命周期中重复发生。
在运行不正常的应用中,每次完整 GC 后内存下降幅度都会小一些,因此随着时间的推移,使用的堆空间会慢慢增加,直到没有更多可用内存。此时,JDK 通常会变得无响应,因为它会不断运行垃圾收集器以尝试释放内存。
如果发生这种情况,那么您必须检查您的 Web 应用程序。开发人员将对象缓存在内存中但不对对象数量设置任何上限的情况并不少见。
提示:设置-Xms
为与 相同的大小-Xmx
。从操作系统分配更多内存以授予堆是一项昂贵的操作。在服务器环境中,这没有什么意义,因为您总是希望有足够的实际内存用于堆。