注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

Tomcat重启负载高问题定位  

来自侯本文   2013-10-22 15:14:30|  分类: 性能测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
某产品每次重启Tomcat都会收到CPU告警信息,重启阶段CPU使用率可以达到80%~90%以上,会持续一段时间回降(具体时间没有考察)。应产品方要求,对该问题进行分析定位。
因线上产品不能随便重启,问题定位阶段使用的是同规格的云主机QA19,该环境上有和线上一致的应用程序,且重启tomcat时,也会有CPU飙高的现象。
负载高的原因:
重启的时候对资源使用情况进行监控,并通过top -H + jstack 分析消耗CPU过高的线程堆栈信息。
  • 通过监控重启时的资源使用情况,在qa19这台机器上,重启一次,CPU飙高的持续时间约为50-60s左右。
  • 通过top -H + jstack 定位消耗CPU过高的线程,发现有三个:
1. spring applicationContext在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. 两个编译线程:

"C2 CompilerThread1" daemon prio=10 tid=0x00007fec48001800 nid=0x13c4 runnable
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" daemon prio=10 tid=0x00000000407c1000 nid=0x13c3 runnable
java.lang.Thread.State: RUNNABLE

尝试的解决方法:
helloJava的两篇文章中给出了两种配置方法:见:http://hellojava.info/?p=195 以及 http://hellojava.info/?p=201
  • 尝试加上-XX:+TieredCompilation,期望借助多层编译来缓解这个问题:
在tomcat jvm参数中增加该配置项,资源监控CPU飙高持续时间降低到45s左右,比原来少了10s+,略有效果
  • 尝试加一个-XX:CICompilerCount参数来试试,这个值默认是2,也就是说2个c2的编译线程来进行编译:
因为QA19和线上tomcat应用服务器都是2个核的云主机,所以默认值2应该是最优值,尝试把该值改成1 or 4,没有起到优化效果。
存在问题:
对于QA19性能测试环境来说,重启后没有其他请求引入,但是线上环境重启后会不断有请求过来,所以CPU飙高的时间会持续时间更长。
对于性能测试环境,重启之后的进行第一次并发测试,前期负载同样会很高,如下图:
Tomcat重启负载高问题定位 - 网易杭州QA - 网易杭州 QA Team
同样,在测试开始后通过top -H + jstack分析堆栈信息,分析得到两个原因:
  1. 启动各种各样的线程进行处理请求,如AJP线程、和数据通信的线程、和ActiveMQ通信的线程等,会短时间内耗费一些资源
  2. 另外,测试刚启动时,"C2 CompilerThread1"该线程耗费资源过多,会一段时间内持续在40%~80%的CPU消耗
测试时,增加-XX:+TieredCompilation该参数,对比资源使用情况如下:
  • 并发50个线程时,增加参数之前(左图)和增加参数后(右图)
Tomcat重启负载高问题定位 - 网易杭州QA - 网易杭州 QA Team Tomcat重启负载高问题定位 - 网易杭州QA - 网易杭州 QA Team
  • 并发100个线程,增加参数前(左图)和增加参数后(右图)
Tomcat重启负载高问题定位 - 网易杭州QA - 网易杭州 QA Team Tomcat重启负载高问题定位 - 网易杭州QA - 网易杭州 QA Team
  结论:
可以看出即便有流量引入,-XX:+TieredCompilation该参数也是起到了一定作用,使得飙高的CPU尽快回落。

  附录:

-XX:+TieredCompilation

Enables a JIT compilation policy to make initial quick JIT compilation decisions analogous to optimizations made by the HotSpot VM’s -client runtime and then continue to make more sophisticated JIT compilation decisions similar to those made by the VM’s -server runtime for frequently called Java methods in the program. In short, it uses a combination of the best of both -client and -server runtimes, quick compilation along sophisticated optimizations for frequently called Java methods. At the time of this writing, it is not recommended to use this command line option as a replacement for the -server runtime since the -server runtime offers better peak performance. This recommendation may change in the future as the tiered compilation feature is enhanced. Client applications running Java 6 Update 25 or later may consider using this command line option with the -server runtime (-server -XX:+TieredCompilation) as an alternative to the -client runtime. It is recommended you measure application startup performance and application responsiveness to assess whether the -server runtime with -XX:+TieredCompilation is better suited for the application than the -client runtime.

http://www.techpaste.com/2012/02/java-command-line-options-jvm-performance-improvement/

  评论这张
 
阅读(1158)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016