2

不确定这是否更适合 ServerFault,但由于我不是管理员而是开发人员,我想我会尝试 SO。

一段时间以来,我们一直在努力保持我们的多服务器配置稳定。上月底,我们在 CF 7.0.2 下在两台服务器设置(每台一个实例)上运行。那时,我们设法将每个实例的正常运行时间提高到大约 1 周,然后它们才会自行重启。自本月初以来,我们升级到 CF 9 并且我们回到了每天多次重启的第一方。

我们当前的配置是 2 台 Win2k3 服务器,运行 4 个实例的集群,每台服务器 2 个实例。在这一点上,我们很确定这是由于 JVM 设置不当造成的。

我们一直在玩弄他们,虽然有些人比其他人更稳定,但我们从来没有完全正确。

从默认值:

java.args=-server -Xmx512m -Dsun.io.useCanonCaches=false -XX:MaxPermSize=192m -XX:+UseParallelGC -Dcoldfusion.rootDir={application.home}/

目前:

java.args=-server -Xmx896m -Dsun.io.useCanonCaches=false -XX:MaxPermSize=512m -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:+UseParallelGC -Dcoldfusion.rootDir={application.home}/ -verbose:gc -Xloggc:c:/Jrun4/logs/gc/gcInstance1b.log

通过使用 FusionReactor 进行监控,我们确定我们确实需要超过默认的 512MB,平均而言,我们消耗的内存量在 300MB 左右徘徊,并且在重负载下可以达到 700MB。

大多数崩溃将记录在 jrun4/bin/hs_err_pid*.log 中,始终显示“Out of swap space”

我在帖子底部附上了昨天的 hs_err 和垃圾收集器日志文件的链接。

相关部分是(我认为)这个:

Heap
 PSYoungGen      total 89856K, used 19025K [0x55490000, 0x5b6f0000, 0x5b810000)
  eden space 79232K, 16% used [0x55490000,0x561a64c0,0x5a1f0000)
  from space 10624K, 52% used [0x5ac90000,0x5b20e2f8,0x5b6f0000)
  to   space 10752K, 0% used [0x5a1f0000,0x5a1f0000,0x5ac70000)
 PSOldGen        total 460416K, used 308422K [0x23810000, 0x3f9b0000, 0x55490000)
  object space 460416K, 66% used [0x23810000,0x36541bb8,0x3f9b0000)
 PSPermGen       total 107520K, used 106079K [0x03810000, 0x0a110000, 0x23810000)
  object space 107520K, 98% used [0x03810000,0x09fa7e40,0x0a110000)

从中,我推测它的 PSPermGen 已满(大多数日志在崩溃前会显示相同),这就是我们增加 MaxPermSize 但总数仍显示为 107520K 的原因!??!

这里没有人是 jRun 专家,所以任何关于下一步尝试的帮助甚至想法都将不胜感激!

日志文件: 对不起,我知道 sendspace 不是最友好的地方 - 如果您对日志文件有其他主机建议,请告诉我,我会更新帖子(所以不喜欢它们内联,它会破坏格式帖子)。

4

2 回答 2

2

这是一个可能有很多原因的影响——任何来自应用程序的构建方式(应用程序或服务器范围的非常规使用?糟糕的数据库驱动程序和连接管理?解析巨大的 XML 文件?使用 CFHTTP 或其他外部资源?问题本机会话复制?)到您的编码实践(无处不在的变量范围?)到您服务器中的 CPU 种类。如果没有太多分析,您不太可能会想出一些神奇的 JVM 设置(甚至可能不会)。但是对于初学者来说,为什么你有这么大的 PermGen?似乎是一种特殊的模式,但我当然对您的应用一无所知。

尝试一些不同的垃圾收集器似乎没什么可失去的。如果适合您的 JVM 版本,请尝试:

-XX:+UseConcMarkSweepGC -XX:+UseParNewGC 

并添加:

-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled

这可能有助于管理您的大型 PermGen。如果您尝试这些,请不要忘记取出 XX:+UseParallelGC。

于 2010-05-20T03:06:43.490 回答
1

一点更新。我尝试了不同的 GC,虽然有些人稳定了系统一段时间,但它一直在崩溃,只是频率降低了。所以我一直在挖掘,最终发现当操作系统本身拒绝分配所请求的内存时,JVM 会抛出“Out of swap space”。

这通常发生在最大内存已经分配给 JVM 进程时,这是 jrun 开销、JVM 本身、所有库、堆和堆栈。由于请求存在于堆栈中,如果您产生大量请求,堆栈将不断增长。每个线程的大小因操作系统和 JVM 版本而异,但可以使用 -Xss 参数进行控制。我将我们的减少到 64k,所以我们的 java.args 看起来像这样:

java.args=-server -Xmx768m -Xss64k -Dsun.io.useCanonCaches=false -XX:MaxPermSize=512m -XX:+UseParallelGC -Dcoldfusion.rootDir={application.home}/ -verbose:gc -Xloggc:c:/Jrun4/logs/gc/gcInstance2a.log

到目前为止,一切都稳定了 6 天,没有任何明显的减速,这绝对是我见过的应用程序保持运行时间最长的一次。如果您将请求大小减少太多,您将开始注意到日志中的堆栈溢出错误,而不是 OOM 错误。

我的下一步将是调整 MaxPermSize,但到目前为止还不错!

于 2010-06-02T15:01:44.953 回答