一个Tomcat配置参数引发的血案
转载:https://mp.weixin.qq.com/s/3IuTcDCTB3yIovp6o_vuKA
一、现象
有用户反馈访问PC首页偶尔会出现白页情况,也偶尔会收到听云的报警短信
二、监控(听云和JVMVISUAL)
刚开始去听云监控看到偶尔有几分钟报500,然后就又好了,而且没有详细的堆栈信息,但是日志显示调用的接口有熔断发生,所以初步怀疑是熔断造成,因为刚开始设置的熔断是600MS,后来调整到2s、10s,但是依然无效,依然有500的出现。换思维,通过jvisualvm进行监控,分别从cpu、内存、类、线程几个方面进行分析。经过一段时间观察得到如下结论:
1.cpu没有太大波动,看起来垃圾回收还比较合理,图形如下:
2.堆(存放类的实例、数组)看起来比较正常,也能正常回收; 非堆:(8以下,存放方法区[又叫永久区,存放类的类型信息、常量池、域信息、方法信息,大部分来源于class文件]、JVM内部处理或优化所需内存等其他meta-data);metaspace又叫元空间, 属于非堆区(java8以上,替换了之前的永久区[方法区]),图形出现了异常,呈现阶段性上升。
异常
异常
3.加载的类(共享和独有类???),发现类似异常,随时间会有阶段性增长
异常
4.线程,呈现阶段性波动,说明当时是有异常的
三、深入分析
整体的现象如上图所示,
1、首先排除线程是否存在死锁导致内存溢出。
可以借助Jconsole来查看线程是否存在死锁,或是通过jstack里查找LOCKED
通过检查以上不存在线程死锁,可以排除这种情况。
2、接着查看当时的访问量曲线,基本平稳,没有太大的流量波动(可以从听云吞吐率图形来看
3.查看内存占用最大的线程及内存增量大的线程,以及程序的问题
从图中可以看出ContainerBackgroundProccessor线程无论是从总量还是增量都是占用最高的,我们先看了我们代码中是否有内存泄漏情况,从下图可以看到程序内并没有占用很高的情况,说明程序代码并未出现内存泄漏,关键在ContainerBackgroundProccessor线程问题
于是百度,也未查到相关资料,但从名字看起来像是tomcat 容器类,于是从听云监控查找出问题的日期,发现从8月26号之后出现的,在看jeckins构建记录,在25号并未提交新功能,只是做了tomcat升级,于是对照未升级的tomcat运行状况,发现只有更新后的tomcat会出ContainerBackgroundProccessor线程一直占用较高的情况,而且所有升级的项目都有这个问题,但是由于其他项目都采用了4g内存所以不明显,但WEB又被改成2g内存了,于是猜想是由于tomcat升级后引起了内存溢出。
于是开始对比8.0.33和8.5.15.0两个版本的区别
将web项目的tomcat回退到8.0.33,经过几天的观察,运行稳定,没有出现类似问题,而且那个线程内存和cpu占用也极低,接近0。
为了稳定考虑,最终决定将所有项目先回退tomcat,但为什么新版本会出现这样的问题?于是猜想要么升级后的tomcat本身有问题,要么是配置文件,要么是JVM参数问题。如果是tomcat版本bug的话,网上肯定会有人提,本着对tomcat信任的原则,先排除另外两个。
首先,运维对JVM参数进行了调优,经过测试后再次重现,于是排除了JVM参数问题;
接着换思路,如果是配置文件的话,都有哪些不一样?于是开始对比tomcat下的几个文件context.xml和server.xml,发现了在server.xml中的 <Context path="" debug="0" crosscontext="true" reloadable="true" docBase="/data/Webapps/Web" caseSensitive="false" /> reloadable这个参数是不一样的,于是查了下该参数:reloadable:如果这个属性设为true, Tomcat服务器在运行状态下会监视在WEB-INF/classes和Web-INF/lib目录CLASS文件的改运.如果监视到有class文件被更新,服务器自动重新加载Web应用。虽然看起来很智能,但是一旦设置成true,ContainerBackgroundProccessor线程就会占用很高内存,将近98%,从而导致内存溢出,服务不正常等问题,理论上生产环境禁止设置成false。于是把测试环境的这个参数改了下,之前那个ContainerBackgroundProccessor线程所占内存和cpu立即降到几乎为0,回到正常。
四、结论
升级tomcat后,但tocmat配置并未按原先的配置,之前的reloadable=false设置成了reloadable=true导致了内存溢出。所以我们在生产环境对tomcat或配置的修改一定要慎重,大到容器,小到一个参数都有可能引发血案。另外就是我们要学会通过JConsole和JvmVisual来进行有效监控,便于定位和分析问题。
一个Tomcat配置参数引发的血案的更多相关文章
- 一次tomcat配置参数调优Jmeter压力测试记录前后对比
使用的tomcat版本为:apache-tomcat-7.0.53 使用测试工具Jmeter版本为:apache-jmeter-2.12 1.测试前tomat的"server.xml&quo ...
- jenkins配置findbugs失败---不要随便忽略警告!一个因为文件所有权引发的血案
一:背景交代 这两天组长让我这边搭一个持续集成环境.梳理了需求后,因为我们的项目都是maven项目,所以我选择了jenkins+外置maven(区别于直接从jenkins里面安装)的方案.(cento ...
- 一个ES设置操作引发的“血案”
背景说明 ES版本 7.1.4 在ES生产环境中增加字段,一直提示Setting index.mapper.dynamic was removed after version 6.0.0错误.但是我只 ...
- springboot tomcat配置参数列表
springboot tomcat的配置选项大全 server. Port = xxxx server. Address = server. contextPath = server. display ...
- 由hbase.client.scanner.caching参数引发的血案(转)
转自:http://blog.csdn.net/rzhzhz/article/details/7536285 环境描述 Hadoop 0.20.203.0Hbase 0.90.3Hive 0.80.1 ...
- 一个tomcat配置多个不同端口的项目
1.将要同时启动的项目放入不同的webapps文件夹中 2.修改tomcat安装目录下的conf-->setting.xml文件 <?xml version="1.0" ...
- 图文解说:Nginx+tomcat配置集群负载均衡
图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用 作者:niumd Blog:http://ari.iteye ...
- Nginx+tomcat配置集群负载均衡
开发的应用采用F5负载均衡交换机,F5将请求转发给5台hp unix服务器,每台服务器有多个webserver实例,对外提供web服务和socket等接口服务.之初,曾有个小小的疑问为何不采用开源的a ...
- idea 配置多个tomcat引发的血案
javax.management.InstanceNotFoundException: Catalina:type=Server 修改tomcat端口时却仍是8080 没有使用在idea tomcat ...
随机推荐
- .net中 Timer定时器
作者:feiying008 在开发一套视觉系统时,发现系统内存一直不断增加,直至系统内存爆满.一开始还以为是程序内存泄露,是图像操作算法写的有问题,但是,发现如果电机轴如果 不运行的状态下,每隔一秒进 ...
- MediaPlayer滑动不准的问题
因为MediaPlayer在seekto是异步进行的,如果在滑动过程中暂停,会导致滑动不准确的情况,这时候就需要添加滑动完成的监听即setOnSeekCompleteListener
- 运行hadoop的时候提示物理内存或虚拟内存溢出的解决方案running beyond physical memory或者beyond vitual memory limits
当运行中出现Container is running beyond physical memory这个问题出现主要是因为物理内存不足导致的,在执行mapreduce的时候,每个map和reduce都有 ...
- 洛谷P2713 罗马游戏
题目传送门 分析: 好吧,其实没什么好分析的,左偏树裸题. Code: #include<cstdio> #include<cstring> #include<cstdl ...
- Linux含交互的自动登录脚本
近来经常要通过ssh登录服务器,每次输入命令和密码很麻烦,查资料发现有两种解决,一种是本地创建密钥直接登录,另一种是写个脚本. 这里介绍第二种方法,第一种资料也很多,但是觉得没啥意思. 先上脚本: # ...
- AGC 020 B - Ice Rink Game
题面在这里! 倒着维护可以取的范围区间,判一下可不可能无解即可. #include<bits/stdc++.h> #define ll long long using namespace ...
- [BZOJ 3553][SHOI2014]三叉神经树
传送门(下面也有题面) 题目大意: 一颗有根树,每个非叶子节点都有三个子节点,每个节点的权为0/1. 每个节点的权 取决于其所有子节点中 哪种权出现的次数更多. 有若干次询问,每次询问修改一个叶子节点 ...
- Problem B: 颠倒字符串
#include<stdio.h> #include<string.h> //用来调用strlen(str)函数 int main() { int i,n; ]; while( ...
- [转] Spring@Autowired注解与自动装配
1 配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss ...
- 判断隐式Intent是否有响应
PackageManager manager = getContext().getPackageManager(); if (manager.queryIntentActivities(intent, ...