【发布时间】:2015-04-20 18:17:39
【问题描述】:
我目前正在将 Adobe Experience Manager 用于客户的网站(Java 语言)。它使用 openJDK:
#java -version
java version "1.7.0_65"
OpenJDK Runtime Environment (rhel-2.5.1.2.el6_5-x86_64 u65-b17)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)
它在 Rackspace 上运行,具有以下特性:
vCPU: 4
Memory: 16GB
Guest OS: Red Hat Enterprise Linux 6 (64-bit)
自从它投入生产以来,我一直在体验应用程序的性能非常缓慢。就像这样我启动应用程序,一切都很顺利,然后 3 到 4 天后 CPU 使用率飙升至 400%(约 4000 个用户/天访问该站点)。我遇到了一些 OOM 异常(1 或 2),但大多数情况下该站点异常缓慢,并且从未成为 OOM 异常。由于我是 Java 内存管理的新手,我开始阅读它的工作原理并找到了 jstat 之类的工具。当系统第二次不堪重负时,我跑了:
#top
得到java进程的PID,然后按shift+H,注意CPU百分比高的线程的PID。然后我跑了
#sudo -uaem jstat <PID>
得到一个线程转储并转换了我之前写下的线程 PID,并在转储中搜索它们的十六进制值。毕竟,我终于发现垃圾收集器由于某种原因而翻转并不奇怪。
我开始阅读大量有关 Java GC 调优的内容,并提出了以下 Java 选项。 因此使用以下选项重新启动应用程序:
java
-Dcom.day.crx.persistence.tar.IndexMergeDelay=0
-Djackrabbit.maxQueuedEvents=1000000
-Djava.io.tmpdir=/srv/aem/tmp/
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/srv/aem/tmp/
-Xms8192m -Xmx8192m
-XX:PermSize=256m
-XX:MaxPermSize=1024m
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:ParallelGCThreads=4
-XX:NewRatio=1
-Djava.awt.headless=true
-server
-Dsling.run.modes=publish
-jar crx-quickstart/app/cq-quickstart-6.0.0-standalone.jar start
-c crx-quickstart -i launchpad -p 4503
-Dsling.properties=conf/sling.properties
看起来它的性能要好得多,但我认为它可能需要更多的 GC 调整。
当我跑步时:
#sudo -uaem jstat <PID> -gcutils
我明白了:
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 55.97 100.00 45.09 4725 521.233 505 4179.584 4700.817
4 天后我重新启动它。
当我跑步时:
#sudo -uaem jstat <PID> -gccapacity
我明白了:
NGCMN NGCMX NGC S0C S1C EC
4194304.0 4194304.0 4194304.0 272896.0 279040.0 3636224.0
OGCMN OGCMX OGC OC PGCMN PGCMX
4194304.0 4194304.0 4194304.0 4194304.0 262144.0 1048576.0
PGC PC YGC FGC
262144.0 262144.0 4725 509
4 天后我重新启动它。
这些结果比我开始时要好得多,但我认为它可以变得更好。我不太确定下一步该做什么,因为我不是 GC 专业人士,所以我想知道你们是否对我有任何关于如何获得更好的应用程序/GC 性能的提示或建议,以及是否有任何明显的事情,比如比率和youngGen 和 oldGen 的大小?
我应该如何设置幸存者和伊甸园的大小/比率? 我应该像使用 CMS GC 还是 G1 一样更改 GC 类型? 我应该怎么做?
任何建议都会有所帮助。
最好的,
尼古拉
【问题讨论】:
标签: java performance garbage-collection openjdk jvm-hotspot