Tomcat 在高负载期间不使用所有内核

Tomcat not using all cores in high load period

我们的 tomcat 服务器有一个奇怪的行为。 初始情况:

当我们对一个 web 应用程序(其他处于空闲状态)进行负载测试时,我们可以看到 tomcat 没有使用所有可用资源。几秒钟后,cpu 使用率下降到 7% 左右(16 个核心中的 1 个)。然后它上升,但一段时间后它再次下降到 7% 并保持在那里,直到所有请求都被处理。 如果我们尝试在 7% 期间在浏览器中打开这些 url,我们的响应时间也会非常慢。 我们不知道为什么 tomcat 没有使用其他核心。在系统级别,我们可以看到当时没有其他应用程序正在使用 cpu。

当我们将 webapps 的数量减少到 35 个或更少时,我们会看到不同的画面。 cpu 现在的使用率为 70% 到 100%,直到所有请求都得到处理,然后下降到大约 0.5%。

目前我们不知道在哪里可以找到这种行为的原因。 在堆转储中,我们可以看到正在处理一些 thymeleaf 表达式,但由于仍在处理“正常”请求,我们认为这不是问题所在。

配置:

<Connector port="8080" protocol="HTTP/1.1" maxThreads="10000" minSpareThreads="200" connectionTimeout="20000" acceptorThreadCount="4" redirectPort="8443" URIEncoding="UTF-8" />

-Djava.rmi.server.hostname=XXX
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=XXX
-Dcom.sun.management.jmxremote.access.file=XXX
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=9090
-Dcom.sun.management.jmxremote.rmi.port=9090
-Djava.awt.headless=true
-XX:PermSize=1024M
-XX:MaxPermSize=4096M
-XX:ReservedCodeCacheSize=512m
-Xdebug
-Xrunjdwp:server=y,transport=dt_socket,address=8081,suspend=n
-verbose:gc
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:/var/log/tomcat7/tomcat-gc.log
-Xms40000M
-Xmx40000M
-Dfile.encoding=UTF-8
-Dcatalina.base=/usr/share/tomcat7
-Dcatalina.home=/usr/share/tomcat7
-Djava.endorsed.dirs=
-Djava.io.tmpdir=/var/cache/tomcat7/temp
-Djava.util.logging.config.file=/usr/share/tomcat7/conf/logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

阿帕奇 Tomcat/7.0.39 | Java1.7.0_75-b13

感谢您的帮助!!

听起来很奇怪,但我们设置了一个 tomcat 开始参数来优先使用 IPv4,以解决此问题:

-Djava.net.preferIPv4Stack=true

参考:http://www-01.ibm.com/support/docview.wss?uid=nas8N1011363

此外,配置另一个垃圾收集器应该会有帮助:

-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC