信息:
VM 数量= 4,每个集群中都有一个 Tomcat 8.5.* 实例。应用程序 = 5 个 war 应用程序 - 2 个 UI 应用程序和 3 个 Web 服务。Java 版本 = java 1.8.* 配置 = 2 个 LTMS 和 2 个 Apache Web 服务器 - 1 个 LTM 位于 tomcat 集群之上,用于处理 Web 服务请求(工作日每天 200K+)。另一个 LTM 位于 Web 服务器之上,该服务器也位于 Tomcat 实例之上,用于处理 UI 应用程序请求(每天 10K+ 个请求)。JVM 参数:所有默认参数均为 -Xms3072m -Xmx3072
Tomcat 配置:
Connector port="xxxx"
protocol="HTTP/1.1"
connectionTimeout="3000"
enableLookups="false"
redirectPort="yyyy"
maxThreads="80"
Connector port="yyyy"
protocol="org.apache.coyote.http11.Http11NioProtocol"
redirectPort="yyyy"
secure="true"
scheme="https"
clientAuth="false"
sslProtocol="TLS"
sslEnabledProtocols="SSLv2Hello,TLSv1,TLSv1.1,TLSv1.2"
SSLEnabled="true"
maxThreads="70"
maxKeepAliveRequests="100"
keepAliveTimeout="5000"
connectionTimeout="10000"
keystoreFile="....."
keyPass="..."
keystorePass="..."
keyAlias="....."
truststoreFile="..."
truststorePass="..."
ciphers="......."
Connector port="zzzz"
scheme="https"
protocol="AJP/1.3"
redirectPort="yyyy"
问题:我们每周必须回收一次 tomcat,而且是在周末进行。如果不回收,在正常运行的第 7 天或第 8 天,次要 GC 时间会延长到 5 秒到 30 秒,如果仍未重新启动,则每当发生主要 GC 时,至少需要一分钟的时间,从而导致多个事务失败。检查所有 4 个节点上的 VM 状态时,在此期间,我们看到发生了很多交换。内存利用率始终低于 55%,CPU 利用率也低于 25%。令人惊讶的是,这种情况发生在周末,当时几乎没有负载。我们从未见过任何 OOM 错误,到目前为止,堆调整似乎不是问题(我可能错了)。我们在生产模拟环境中也有相同的配置,其中负载不如生产服务器那么多,并且在该环境中没有这样的交换/GC 问题。任何关于此的见解或建议都将非常有帮助。如果需要任何其他信息,请告诉我。
答案1
交换是由于不活动的内存页面、暂时未使用但不受 GC 影响的对象,请尝试将系统交换率降低到 10%。
在回收 tomcat 之前还要检查代码缓存的利用率,因为这可能会导致速度随着时间的推移而变慢。
尝试将 GC 更改为 g1gc 并检查,它应该具有更少的 STW 暂停。