JIRA应用的内存参数设置不当+容器没有对资源进行限制导致服务挂掉的例子
背景:
应用的部署结构是这样的:使用rancher管理的Docker集群,有三台物理主机,二十多个Docker容器,
提供的功能是问题跟踪(JIRA),文档管理(Confluence),代码托管(svn,gitlab),持续集成(jenkins,gitlab-ci + Docker),代码质量管理(Sonar),构件管理(nexus3)和测试管理(TestLink)的功能.服务于1400多个研发人员
前端使用Apache来对后端的服务进行反向代理,同时Apache集成了CAS和LDAP 提供了单点登录的功能
某天下午,用户反馈,应用访问的速度非常的慢,登录的请求也无法响应了.
到Apache所在的主机上看资源的占用,,发现CPU占用率超过500%,apache没有足够的CPU资源来处理请求

通过在主机上ps这个CPU超过500%的进程,发现是一个java的进程,对应的是JIRA的容器
主机上显示的进程号,和容器里边的进程号是不一样的
在容器里,JIRA对应的java进程是进程号为1的进程
进入JIRA容器
dump出来这个进程的所有的线程栈
jstack 1 > jirastack.log
查看这个进程中的占cpu最高的线程
top -Hp 1
得到的结果如下:

可以看到,有8个线程的CPU占用都超过了70左右,合计起来是 500%多
前边的 49,53之类的是和线程栈里边的线程的nxID对应的,只不过,nxID是用十六进制来表示的
我们把这些十进制的数字也变成十六进制

从dump出来的线程栈里边找到了对应的线程:
从线程栈里边搜索 nid=0x31,搜到了以下的线程

我们可以看到,这些都是垃圾回收的线程,垃圾回收的线程占据了所有的CPU的时间
查看JIRA的参数设置,发现了内存的设置较小 -Xms1024m -XmX2048m,使用的垃圾收集器是ParallelGC,因为主机的CPU有8个内核,所以就默认启动了8个垃圾收集器的线程
系统的用户大概有1.4K人,都是开发和测试人员来使用,对比另一个应用 confluence的内存配置(6G的堆大小,G1垃圾收集器),JIRA的堆的配置是有点小了,所以把JIRA的堆内存设置为4G(主机所在的内存还有很多没有使用)然后针对增大的这个堆,启用G1垃圾收集器,然后打印了垃圾收集的日志信息到一个日志文件里边
配置如下:

JVM_MINIMUM_MEMORY 和 JVM_MAXIMUM_MEMORY的值都是4096m
然后,为了防止某个容器占用的资源过多,影响其他的容器(就是开头的时候我们遇到的问题,JIRA占用的CPU过多,导致了apache无法响应请求,其他的应用都无法访问了),所以,我们在rancher上对容器的资源做了一些限制

事后的反思
JIR的jvm参数设置不当和没有对容器占用的主机的资源进行隔离这两个原因共同导致了这个问题的发生
在使用容器作为生产环境的时候,要对自己在容器内所部署的应用的性能和配置参数等有足够的了解,
对Docker容器所在的物理机的CPU和内存等资源所能支撑的容器的数量进行合理的预估,对容器所占用的物理机的资源进行限制,防止容器因配置不当占满物理机的资源,影响其他容器
JIRA应用的内存参数设置不当+容器没有对资源进行限制导致服务挂掉的例子的更多相关文章
- tomcat安装服务和内存参数设置
第一:安装服务 在dos窗口进入到tomcat的bin目录下,通过如下命令即可将tomcat安装成服务 service.bat install Tomcat2 其中Tomcat2是服务的名称 如果启动 ...
- JVM内存异常与常用内存参数设置总结
Java Web程序由于引入大量第三方java类库,在启动时经常会遇到内存溢出(Memory Overflow)或者内存泄漏(Memory leak)问题,导致程序启动失败. 一.OOM异常分类: O ...
- JVM内存参数详解以及配置调优
基本概念:PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域He ...
- caffe 网络参数设置
weight_decay防止过拟合的参数,使用方式: 样本越多,该值越小 模型参数越多,该值越大 一般建议值: weight_decay: 0.0005 lr_mult, decay_mult 关于偏 ...
- Tomcat参数设置,解决内存溢出问题
Tomcat默认参数不适合生产环境使用,因此需要修改一些参数 1.修改启动时内存参数.并指定JVM时区 (在Windows Server 2008 下时间少了8个小时): 在Tomcat上运行j2ee ...
- 如何设置Docker容器中Java应用的内存限制
如果使用官方的Java镜像,或者基于Java镜像构建的Docker镜像,都可以通过传递 JAVA_OPTS 环境变量来轻松地设置JVM的内存参数.比如,对于官方Tomcat 镜像,我们可以执行下面命令 ...
- Linux swappiness参数设置与内存交换
swappiness参数设置与内存交换 by:授客 QQ:1033553122 简介 swappiness,Linux内核参数,控制换出运行时内存的相对权重.swappiness参数值可设置范围在0到 ...
- Oracle 内存参数调优设置
Oracle 数据库系统中起到调节作用的参数叫初始化参数,数据库管理员根据实际情况需要适当调整这些 初始化参数以优化Oracle系统. 1 主要系统参数调优介绍 2 系统内存参数的分配 2.1 Ora ...
- 如何设置Java虚拟机JVM启动内存参数
Tomcat默认的Java虚拟机JVM启动内存参数大约只有64MB或者128MB,非常小,远远没有利用现在服务器的强大内存,所以要设置Java虚拟机JVM启动内存参数.具体设置方法为: Tomcat修 ...
随机推荐
- 关于js的函数
1.获取内容的兼容函数 /* * 一: 获取内容的兼容函数 * setText(obj, str) * 思路: * 1.首先判断浏览器: * 2.如果是IE浏览器,就用innerText: * 3.如 ...
- C#_02.13_基础四_.NET方法
C#_02.13_基础四_.NET方法 一.方法概述: 方法是一块具有名称的代码.可以通过方法进行调用而在别的地方执行,也可以把数据传入方法并接受数据输出. 二.方法的结构: 方法头 AND 方法 ...
- SSD固态硬盘测试工具收集(持续更新)
https://www.crsky.com/zhuanti/gutaiyingpanceshi.html https://www.crsky.com/zhuanti/ssdjiance.html ht ...
- 【转】java日志组件介绍(common-logging,log4j,slf4j,logback )
common-logging common-logging是apache提供的一个通用的日志接口.用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, comm ...
- MYSQL的联合查询最好是少用,效能差异巨大
同样的功能,不同的写法,时间和内存占用差了几千倍,不废话,直接上代码 第一种写法: 代码如下: $Rs=DB::get($_ENV['DB'],3,"SELECT * FROM _xiazh ...
- 03、操作RDD(transformation和action案例实战)
1.transformation和action介绍 Spark支持两种RDD操作:transformation和action.transformation操作会针对已有的RDD创建一个新的RDD:而a ...
- 分布式架构探索 - 1. RPC框架之Java原生RMI
1. 什么是RPC RPC(Remote Procedure Call)即远程过程调用,指的是不同机器间系统方法的调用,这和 同机器动态链接库(DLL)有点类似,只不过RPC是不同机器,通过网络通信来 ...
- nrm管理npm源
npm源:npm install命令下载需要依赖包的服务器地址,默认是 npm ---- https://registry.npmjs.org/ 而国外的源速度太慢,所以我们一般都用国内的淘宝源tao ...
- UVA524 素数环 Prime Ring Problem
题目OJ地址: https://www.luogu.org/problemnew/show/UVA524 hdu oj 1016: https://vjudge.net/problem/HDU-10 ...
- 删除 nuget 文件夹内容
vs2017 ->工具->选项->NuGet 包管理器->清除所有NuGet缓存