11

我们最近将一个大型、高需求的 Web 应用程序从 Tomcat 4 迁移到 Tomcat 5.5,并注意到一些似乎与 JVM 暂停有关的特殊减速行为。为了在 Tomcat 4 上运行我们的应用程序并支持随时间增加的负载,许多不那么标准的 JVM 参数被设置和调整如下,我希望有 Tomcat JVM 调整经验的人可以评论任何可能有害的事情到 Tomcat 5.5 安装。另请注意,其中一些可能是从以前版本的 Java 继承下来的(我们在 Java 1.6 上使用这些参数成功运行了 Tomcat 4 一段时间,但可能已经引入了一些来帮助 Java 1.4 上的垃圾收集,这是 Java 1.4 的基础。我们的 Tomcat 4 安装了很长时间,现在可能弊大于利)。

一些注意事项:

  • 应用程序内存占用约为 1GB,可能略多一些。
  • CPU 不是问题 - 为应用程序服务的所有机器(负载平衡)的 CPU < 30%
  • 机器上的物理内存有很多空间。
  • -XX:MaxPermSize=512m 是作为 5.5 升级的一部分添加的唯一参数,它是对内存不足 permgen 空间问题的反应(它已解决)。
  • 在 Java 1.6、Solaris 操作系统上运行

-server -Xms1280m -Xmx1280m -XX:MaxPermSize=512m -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=75 -XX:MaxTenuringThreshold=0 -XX:+ AggressiveOpts -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:-TraceClassUnloading -Dsun.io.useCanonCaches=false -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000

4

5 回答 5

7

Java 冠军之一,Kirk Pepperdine 的博客: http: //kirk.blog-city.com/how_to_cripple_gc_ergonomics.htm
引用 1 “GC 文档会告诉你设置会影响什么,但通常不会告诉你会产生什么影响。你走错岔路的最大线索是当你明确设置一个值,然后给 GC 一个提示"

引用 2 “正如我在之前的博客文章中所说,除非有充分的理由,否则不要触摸旋钮。如果您必须触摸旋钮,请小心谨慎,仅使用有助于人体工程学的那些,而不是那些这会削弱人体工程学来满足您的暂停时间和吞吐量目标的能力。”

所以,我建议你回到普通的
-server -Xms1280m -Xmx1280m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:-TraceClassUnloading -Dsun.io.useCanonCaches=假 -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000

看看这是否能给你带来更好的表现。如果是,请坚持下去,
顺便说一句,-XX:MaxPermSize=378m 有什么问题吗?
Java 1.6 的人机工程学比 1.4 好得多。你可能想把它调到低于 1.4
顺便说一句,你试过 Tomcat 6 吗?Tomcat 6 在 Java 6 上的运行比 Tomcat 5.5 好得多。

PS:我使用 Tomcat 已经有一段时间了,通常会尝试让 sun 的 JDK 自由支配,而在这里和那里几乎没有调整。

于 2008-10-14T20:14:03.197 回答
3

作为一个也在纠结这个问题的人,我当然没有任何明确的答案,尤其是考虑到这种事情是如何特定于应用程序的。您可能已经看到了一个很好的参考,在这里:

http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

但是,这是一个很长的 jvm 参数列表,这表明可能设置了不必要的参数,特别是考虑到您有多个调试选项(PrintGCDetails、PrintGCTimeStamps、TraceClassUnloading),这在生产应用程序上并不好。60 秒超时也可能会占用资源。“服务器”是默认设置,但不会造成任何伤害。

应用程序如何以最少的调整参数(jvm 大小、MaxPermSize)运行?

于 2008-10-14T19:54:06.823 回答
3

刚刚从 tomcat 开发人员那里找到了一个关于调整 tomcat 的网络研讨会:http: //springsource.com/node/555。网络研讨会的后续行动:http: //blog.springsource.com/2008/10/14/optimising-and-tuning-apache-tomcat-part-2/

BR,
~A

于 2008-10-14T20:49:38.520 回答
1

您可能还想查看更改 Tomcat 用于处理以下请求的最小/最大线程数conf/server.xml

<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" ...

我在之前的工作中听到的一个经验法则是 maxThreads 应该等于您希望处理的同时连接的数量。我不确定这种说法有多科学,尽管我当然认为这是有道理的,因为您不希望客户端被阻塞等待线程释放以处理他们的请求。

于 2008-10-15T13:47:00.793 回答
0

也可能值得尝试使用替代 JVM(如 JRockit)来查看垃圾收集模型中的差异是否非常适合您的应用程序。

于 2008-10-15T16:55:45.483 回答