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/

时间: 2024-09-20 07:33:16

Tomcat重启负载高问题定位的相关文章

java程序启动时cpu和负载高探索

这两天协助运维定位1个监控程序CPU占用率达到150%的问题,过程曲折,结论简单,很有意思:) 首先我们来看一下cpu高时候截图: 可以看到红色框中的监控程序CPU占用率都很高,但其实这些监控程序的实现很简单:发送1个http请求,收到响应后简单判断一下响应码,然后打印监控结果,打印完成就退出了.每次监控都会重新由daemon程序拉起运行. 这么简单的业务占用这么高的cpu,怎么感觉都不太可能,于是拿到监控程序的源码开始定位. 第一个想到的是VisualVm.JConsole等工具,但由于程序很

nginx+tomcat实现负载均衡,使用redis session共享_nginx

环境准备 1.准备一台nginx服务器 ip192.168.1.133 端口81 安装过程: #首先安装依赖: yum -y install gcc-c++ yum -y install pcre pcre-devel yum -y install zlib zlib-devel yum -y install openssl openssl-devel #注意 : 安装nginx必须使用 root 用户安装 #创建一个nginx目录 mkdir /usr/local/src/nginx #进入到

memcached在大负载高并发网站上的应用(一)---简介

大家可能对memcached这种产品早有了解,或者已经应用在自己的网站中了,但是也有一些朋友从来都没有听说过或者使用过. 这都没什么关系,本文旨在从各个角度综合的介绍这种产品,尽量深入浅出,如果能对您现在或以后的工作有所帮助,笔者将感到无比荣幸. 我要介绍的内容包括以下几个方面: 1.memcached的简介 2.memcached的应用场景 3.memcached的安装 4.memcached的使用 5.memcached的部署架构 6.memcached的局限性 7.memcached的改进

tomcat运行内存过高过高,导致服务崩溃

问题描述 tomcat运行内存过高过高,导致服务崩溃 tomcat运行不到2小时,内存占的过高,导致服务崩溃 2015-6-1 10:34:22 com.microsoft.sqlserver.jdbc.TDSReader throwInvalidTDS 严重: ConnectionID:21 got unexpected value in TDS response at offset:199 2015-6-1 10:36:07 org.apache.tomcat.jdbc.pool.Conne

[Domino]Tomcat需要NCSO.jar来定位Domino异常

[Domino]Tomcat需要NCSO.jar来定位Domino异常 编写者 日期 关键词 郑昀@ultrapower 2005-6-15 Java Tomcat Axis NotesFactory   现象 我试图从Web Service访问Domino.Web Service的构建方法是:Axis+Tomcat,在Eclipse中加入了tomcatPluginV31beta插件,从而很容易地发布基于Axis的Java Web Service. 但是,当访问web service时,Note

项目启动报错-linux系统tomcat重启报错

问题描述 linux系统tomcat重启报错 以下是启动是的错误信息: INFO: Starting Coyote HTTP/1.1 on http-8080 Jan 21, 2015 4:26:24 PM org.apache.jk.common.ChannelSocket init INFO: JK: ajp13 listening on /0.0.0.0:8009 Jan 21, 2015 4:26:24 PM org.apache.jk.server.JkMain start INFO:

同一台服务器安装两个tomcat做负载均衡请求响应不一致

问题描述 同一台服务器安装两个tomcat做负载均衡请求响应不一致 同一台服务器安装两个tomcat,做tomcat的负载均衡请求和响应的端口不一样,导致登陆时报404错误. 比如,两个tomcat 8081.8082端口,登陆时请求的是8081端口,验证用户信息,但是响应的是8082端口号,导致404错误. 解决方案 这需要做一些负载均衡的规则,保证同一个session是在一个服务器上处理. 解决方案二: 需要做session共享,tomcat最常见的就是使用memcache存储session

linux系统tomcat重启老是端口被占用

问题描述 linux系统tomcat重启老是端口被占用 linux上的tomcat java网站更新,./startup.sh查看日志发现是端口被占用,然后查使用端口的 线程,kill掉,再次启动还是端口被占用,已经纠结两天了,求大神解答! 解决方案 http://jingyan.baidu.com/article/67662997372ecc54d51b8423.html 解决方案二: 那就要看那个进程为 ui 什么老是启动,是不是常驻进程 解决方案三: 你查出来占用端口的是什么程度没有? 参

服务器上tomcat需要更新程序时,大家是怎么办的,直接关闭tomcat重启吗?

问题描述 服务器上tomcat需要更新程序时,大家是怎么办的,直接关闭tomcat重启吗? 譬如我云服务器代码有bug,我修改后想重新提交部署.是直接关闭tomcat,部署完后再重启吗? 这样的话会有1分钟的宕机状态,岂不是不太好? 解决方案 tomcat服务器经常需要重启Eclipse异常关闭 Tomcat无法重启 解决方案二: 部署的时候它应该会自动停掉并且重启吧,在部署的时候访问肯定会有问题的 解决方案三: 所以最好就使用集群,这样可以逐步更新. 最后写个tomcat的重启脚本,这样可以简