热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JIRA应用的内存参数设置不当+容器没有对资源进行限制导致服务挂掉的例子

背景:应用的部署结构是这样的:使用rancher管理的Docker集群,有三台物理主机,二十多个Docker容器,提供的功能是问题跟踪(JIRA),文档管理(Confluence),代码托管(sv

背景:
应用的部署结构是这样的:使用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和内存等资源所能支撑的容器的数量进行合理的预估,对容器所占用的物理机的资源进行限制,防止容器因配置不当占满物理机的资源,影响其他容器


推荐阅读
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • Eclipse 中 JSP 开发环境配置指南
    本文详细介绍了如何在 Eclipse 集成开发环境中配置 JSP 运行环境,包括必要的软件下载、Tomcat 服务器的配置以及常见问题的解决方法。 ... [详细]
  • OpenWrt 是一款高度可定制的嵌入式 Linux 发行版,广泛应用于无线路由器等领域,拥有超过百个预装软件包。本文详细探讨如何在 OpenWrt 上通过 Luci 构建自定义模块,以扩展其功能。 ... [详细]
  • 本文详细探讨了 Java 中 Daemon 线程的特点及其应用场景,并深入分析了 Random 类的源代码,帮助开发者更好地理解和使用这些核心组件。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 本文介绍如何从JSON格式的文件中提取数据并将其分配给Bash脚本中的变量。我们将探讨具体的命令和工具,帮助你高效地完成这一任务。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 解决 SVNManager 中文路径乱码问题的方法
    在安装 MySQL 后,通过调整 my.cnf 文件中的字符集设置,可以有效解决 SVNManager 在处理中文路径时出现的乱码问题。 ... [详细]
  • 本文探讨了Git与SVN在版本控制上的区别,重点介绍了Git中特有的工作流和文件状态管理机制。 ... [详细]
author-avatar
蓝色水气球_453
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有