记tomcat参数之reloadable引发的大问题

一、关于Tomcat基本使用

请移步(WEB服务器之TOMCAThttp://www.52devops.com/chuck/1174.html)

二、事故起因

2.1 disconf介绍

Distributed Configuration Management Platform(分布式配置管理平台)专注于各种 分布式系统配置管理 的通用组件/通用平台, 提供统一的配置管理服务。
百度开源Disconf的github地址

2.2 起因描述

使用的环境是docker+tomcat,tomcat全部运行在docker内;每台机器上均会有多个docker容器在运行(不同业务的节点),当前使用量小加上从未出现此情况而且每个rs服务至少都均设置有两个rs节点;此时由于业务需求,开发人员通过disconf直接修改线上服务的配置,而且未通知运维人员,故障发生。

2.3 故障现状

2.3.1 宿主机cpu飙升非常高

zabbix的cpu用户态设置报警阈值为60%,开发调整后5分钟开始飙升至800%以上,如下图

2.3.2 宿主机可用内存减少

disconf配置服务修改后,宿主机可用内存减少6G

2.3.3 其他docker容器全部内存溢出

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。

三、问题分析

3.1日志反馈

通过查看tomcat的catalina.out日志查看,发现修改disconf后服务的tomcat重载了一次,日志截图如下:

重载后开始出现以上三个问题,并且服务无法正常工作,问题比较严重,影响了所有docker容器的服务。

3.2运维自我检查

  • 内存溢出
    所有容器的内存溢出,原因当然和catalina.sh配置有关,根据应用情况适当修改JAVA_OPTS=”-server -XX:PermSize=64M -XX:MaxPermSize=128m的配置大小 另一方面该disconf修改是所有docker项目共用的,一个修改导致了所有项目的修改。
  • Docker资源限制问题
    由于之前所有docker的服务压力均不大,并未来得及对资源限制。也是导致此问题的一大原因,生产服务尽量对docker进行资源限制,根据不同服务的重要级别进行宿主机的隔离。
  • Tomcat服务配置问题
    这里就说到问题重点了,用了好久的tomcat,对于运维来说,标准化配置是首要的,方便查找问题,统一配置修改等。所以使用的一直都是统一配置,对于tomcat的server.xml配置严格必须要求开发无权限修改;在此配置文件中,有reloadable参数,下面是官方文档解释:

    大致意思是:如果设置为true,tomcat会监控 /WEB-INF/classes/ and /WEB-INF/lib的class文件变化,一旦发现改变,会自动重载web应用。这个参数在应用的开发阶段是非常有用的,但是这个参数需求一个很重要的运行环境,并且此参数用在生产上建议设置为false;这也就是为什么默认就是false。
    此次故障的最主要原因就是此参数在生产上配置为true了,当修改disconf时,会修改 /WEB-INF/classes/ and /WEB-INF/lib下面的class文件,导致tomcat自动重载,此重载不同于tomcat的start.sh启动,异常重载导致故障发生。
  • 工作协调问题
    尽量限制开发人员对线上服务的修改,包括服务配置,代码修改,坚决杜绝开发人员进行线上调试和反复上线;严格限制任何对线上服务不负责的行为,来保障服务的健康为运行
0
未经许可,不得转载,否则将受到作者追究,博主联系方式见首页右上角

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论
取消评论
代码 贴图 加粗 链接 删除线 签到