Tomcat重启负载高问题定位

简介:
 某产品每次重启Tomcat都会收到CPU告警信息,重启阶段CPU使用率可以达到80%~90%以上,会持续一段时间回降(具体时间没有考察)。应产品方要求,对该问题进行分析定位。
  因线上产品不能随便重启,问题定位阶段使用的是同规格的云主机QA19,该环境上有和线上一致的应用程序,且重启tomcat时,也会有CPU飙高的现象。
   负载高的原因:
  重启的时候对资源使用情况进行监控,并通过top-H+jstack分析消耗CPU过高的线程堆栈信息。
  通过监控重启时的资源使用情况,在qa19这台机器上,重启一次,CPU飙高的持续时间约为50-60s左右。
  通过top-H+jstack定位消耗CPU过高的线程,发现有三个:
   1.springapplicationContext在web容器中加载过程消耗的资源:(部分堆栈信息)
"main" prio=10 tid=0x000000004166f800 nid=0x100f runnable [0x00007fbf42987000]
java.lang.Thread.State: RUNNABLE
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
   2.两个编译线程:
"C2CompilerThread1"daemonprio=10tid=0x00007fec48001800nid=0x13c4runnable
java.lang.Thread.State:RUNNABLE
"C2CompilerThread0"daemonprio=10tid=0x00000000407c1000nid=0x13c3runnable
java.lang.Thread.State:RUNNABLE
尝试的解决方法:
  helloJava的两篇文章中给出了两种配置方法:见:http://hellojava.info/?p=195以及http://hellojava.info/?p=201
  尝试加上-XX:+TieredCompilation,期望借助多层编译来缓解这个问题:
  在tomcatjvm参数中增加该配置项,资源监控CPU飙高持续时间降低到45s左右,比原来少了10s+,略有效果
  尝试加一个-XX:CICompilerCount参数来试试,这个值默认是2,也就是说2个c2的编译线程来进行编译:
  因为QA19和线上tomcat应用服务器都是2个核的云主机,所以默认值2应该是最优值,尝试把该值改成1or4,没有起到优化效果。
  存在问题:
  对于QA19性能测试环境来说,重启后没有其他请求引入,但是线上环境重启后会不断有请求过来,所以CPU飙高的时间会持续时间更长。
  对于性能测试环境,重启之后的进行第一次并发测试,前期负载同样会很高,如下图:
  同样,在测试开始后通过top-H+jstack分析堆栈信息,分析得到两个原因:
  启动各种各样的线程进行处理请求,如AJP线程、和数据通信的线程、和ActiveMQ通信的线程等,会短时间内耗费一些资源
  另外,测试刚启动时,"C2CompilerThread1"该线程耗费资源过多,会一段时间内持续在40%~80%的CPU消耗
  测试时,增加-XX:+TieredCompilation该参数,对比资源使用情况如下:
  并发50个线程时,增加参数之前(左图)和增加参数后(右图)
  
    并发100个线程,增加参数前(左图)和增加参数后(右图)
   结论:
  可以看出即便有流量引入,-XX:+TieredCompilation该参数也是起到了一定作用,使得飙高的CPU尽快回落。

最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章
|
应用服务中间件
tomcat重启时保持会话关闭
tomcat重启时保持会话关闭
242 0
|
应用服务中间件
Tomcat——通过.bat批处理程序重启Tomcat
Tomcat——通过.bat批处理程序重启Tomcat
|
Java 应用服务中间件 Perl
Tomcat启动、关闭、重启脚本
#!/bin/sh #chkconfig: 345 90 10 #tomcat auto-start #. /etc/init.d/functions #.
1334 0
|
应用服务中间件 Linux
Linux不重启Tomcat清空catalina.out日志的几种方法
Linux不重启Tomcat清空catalina.out日志的几种方法
1355 0
|
Java 应用服务中间件 Linux
Linux重启tomcat服务
Linux重启tomcat服务
|
应用服务中间件 Perl
Centos6.5下重启tomcat脚本
Centos6.5下重启tomcat脚本
|
监控 应用服务中间件 Python
python 监控Tomcat 重启
利用python监控Tonmcat启动
python 监控Tomcat 重启
|
前端开发 JavaScript Java
IntelliJ IDEA - 热部署(更新HTML/JSP/JS/CSS代码、不用重启Tomcat)
IntelliJ IDEA - 热部署(更新HTML/JSP/JS/CSS代码、不用重启Tomcat)
2476 0
IntelliJ IDEA - 热部署(更新HTML/JSP/JS/CSS代码、不用重启Tomcat)
|
Ubuntu 应用服务中间件
生产环境如何重启tomcat
如果是系统安装,可以直接用服务管理脚本进行, 如ubuntu在/etc/init.d/tomcat8 主要思路是先用start-stop-daemon发停止信号结tomcat进程, 如果不能顺利结束, 再用kill杀掉进程.
363 0
|
Java 应用服务中间件
java上传图片后需要重启tomcat才可以访问
当java上传图片后,需要重启tomcat才可以访问,我们只要保存图片路径的时候要直接保存到tomcat的路径下,然后就不用重启就可以访问了。
860 0
java上传图片后需要重启tomcat才可以访问