前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >某次压测时物理内存被用光 Tomcat 被 Kernel kill 掉的案例

某次压测时物理内存被用光 Tomcat 被 Kernel kill 掉的案例

作者头像
小小科
发布于 2018-05-03 05:07:34
发布于 2018-05-03 05:07:34
1K0
举报
文章被收录于专栏:北京马哥教育北京马哥教育

背景描述

某项目结构图如下(前端交互式体验及对象存储为主,Redis 及 rds 负载较小没有画出):

web1 和 web2 是两个 Apache,publisher1 和 publisher2 是两个 Tomcat 容器下的 app 应用服务器

在对该项目进行压测时,并发数加到 750 左右,阿里云 PTS 压测工具监测到在某个时间点后 tps 呈下降趋势:

作为对应指标的响应时间(rt)在这个时间点呈上升趋势:

查看实时监控-监控集指标,发现 publisher1 节点的 CPU 利用率已降为 1.9,在高并发的时候这个值肯定是有问题,很可能这个节点已经宕掉:

查看网络流量发现该节点果然已经没有了网络流量:

ssh 登录 publisher1 ps 证实 Tomcat 确实已经 crash。但查 Tomcat 日志、应用日志,没有任何异常,find 也没找到类似于 hs_err_pidNNN.log 之类的 crash 日志。Tomcat 内存分配情况: JAVA_OPTS="-Xmx3072m"

系统物理内存 8G,看上去绰绰有余。真的是这样吗?

原因分析

一般来讲,诸如内存溢出之类常见的 Tomcat 崩溃都会在容器日志或者 crash 日志中记录原因。但不排除这种情况:Linux 允许系统中的进程申请比现有系统可用内存还要多的内存,但当整个系统内存不足的时候,Kernel 会将耗用内存最多的那个进程给干掉,就是 Tomcat 了,但这并不能说明 Tomcat 发生了某些运行时的致命错误,所以我们没有看到任何容器、应用甚至 jvm 级别的异常,Tomcat 来不及做任何日志处理就 Over 了。 查看 /var/log/message,在 PTS 指示的时间点找到了以下日志:

注意以上系统时间为 UTC 时间,对应北京时间为 Jul 25 11:15:39,PTS 监控到的 publisher1 节点的内存曲线图的顶点跟 OOM 的时间也基本一致:

可以看到在 11:15 左右 publisher1 节点的 8G 物理内存已经用光。

解决方案

当 Linux 系统物理内存不够用的时候,需要将物理内存中的一部分空间释放出来以供当前运行程序使用。这些被释放出来的空间很可能来自于一些长时间没有什么操作的程序,这些被释放出来的空间会被临时存放到 SWAP 空间,等这些程序要运行时,再从 SWAP 恢复数据到内存。上述案例 publisher1 节点 SWAP 查看:

交换分区空间没有,系统在物理内存不够的时候也就没有临时空间可以利用,为了整个系统的正常运行,"oom_killer" 函数被调用了,于是 Tomcat 悲剧了。。。

解决方案似乎已经很明显了。值得一提的是,在上面的 message 日志里,Kernel 在筛选要干掉的进程的日志里,在其前面紧挨着的便是指示 SWAP 为 0 无交换空间可用:)

参考资料

Tomcat stopped without any log or any stack Out of Memory + httpd.worker invoked oom-killer

博主 20170727 日续:关于 Apache 的类似案例

上述案例中 app 节点,也就是 publisher1 节点修复以后,继续加压测试,在并发数达到 1000 的时候,web2 节点宕掉。具体表象为 web2 服务器 SSH 连不上,阿里云 PTS 监控集也显示为 web2 处于下线状态。

查看 web2 的 /var/log/message,该时间段日志摘要如下:

日志处理逻辑看上去和 publisher1 干掉 Tomcat 的做法一般无二,区别在于 Apache 为了保证高可用性在 httpd worker 进程故障后会再拉起一个,系统物理内存最终被耗光而 OOME 宕机。于是 Publisher1 的表象为 Tomcat 的 crash,而 web2 的表象为 Linux 系统无响应。

解决办法是,除了像 publisher1 那样给 web2 启用虚拟空间,还可以降低 Apache 的最大连接数 MaxClients、最大内存 ServerLimit,修改后使用命令 service httpd restart 对 apache 进行重启使配置生效。

作者:Defonds 来源:http://blog.csdn.net/defonds/article/details/76070281


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 马哥Linux运维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
彻底理解虚拟内存:从一个demo看free/ps/top内存含义
笔者团队发现现网服务负载即将达到瓶颈,但cpu利用率并未达到瓶颈,基于充分利用机器资源的考量,研发同学提出:“降低nginx worker数,腾出一部分内存,随后提高业务程序worker数,从而提升业务处理能力”的解决方案。
Radar3
2020/05/31
2.5K2
linux out of memory分析(OOM)
原文:http://blog.csdn.net/guomsh/article/details/6536915
一见
2019/03/14
9K0
在 4G 内存的机器上,申请 8G 内存会怎么样?
这篇文章其实之前发过,但是最近有位读者跟我反馈,我文章中的实验在 64 位操作系统、2 G 物理内存的场景,申请 8G 内存是没问题的,而他也是这个环境,为什么他就无法申请成功呢?
捡田螺的小男孩
2023/02/23
2.4K0
在 4G 内存的机器上,申请 8G 内存会怎么样?
Centos应用“Cannot allocate memory”的解决方案
在启动一个Springboot工程时,抛出一项“Cannot allocate memory”异常,很明显,是因为内存分配原因导致的OOM异常导致JVM宕掉。跟随log,查看JVM hs_err_pid24442.log文件。
有一只柴犬
2024/01/25
1.6K0
Centos应用“Cannot allocate memory”的解决方案
我的文章上榜首了!
前几天我发了一篇文章:在 4GB 物理内存的机器上,申请 8G 内存会怎么样?,但是当时写的比较匆忙,文章中只考虑关闭 swap 的情况,没有提及开启 swap 的情况,有读者希望我补充这部分内容。
小林coding
2022/10/27
9680
我的文章上榜首了!
Docker容器内存限制
​ 默认情况下容器使用的资源是不受限制的。也就是可以使用主机内核调度器所允许的最大资源。但是在容器的使用过程中,经常需要对容器可以使用的主机资源进行限制,本文介绍如何限制容器可以使用的主机内存。
码客说
2019/10/22
11.5K0
Linux之《荒岛余生》(三)内存篇
内存问题,脑瓜疼脑瓜疼。脑瓜疼的意思,就是脑袋运算空间太小,撑的疼。本篇是《荒岛余生》系列第三篇,让人脑瓜疼的内存篇。其余参见:
xjjdog
2019/09/24
1.2K0
Linux之《荒岛余生》(三)内存篇
高性能BPF内存分析工具解析
作者简介:许庆伟,Linux Kernel Security Researcher & Performance Developer 众所周知,Linux内核和CPU处理器负责将虚拟内存映射到物理内存。为了提高效率,在一个称为页的内存组中创建一个内存映射,其中每个页的大小根据处理器的实际情况而来。尽管大多数处理器也支持更大的页,但默认通常是4 KB,。内核可以从页空闲列表中为物理内存页的申请提供分配,并且为了提高效率,为每个DRAM组和CPU均设计了维护这些请求的方案。内核程序可以通过分配器(比如slab分配
刘盼
2022/07/12
1.4K0
高性能BPF内存分析工具解析
郭健:Linux内存管理系统参数配置之OOM(内存耗尽)
本文是描述Linux virtual memory运行参数的第二篇,主要是讲OOM相关的参数的。为了理解OOM参数,第二章简单的描述什么是OOM。如果这个名词对你毫无压力,你可以直接进入第三章,这一章是描述具体的参数的,除了描述具体的参数,我们引用了一些具体的内核代码,本文的代码来自4.0内核,如果有兴趣,可以结合代码阅读,为了缩减篇幅,文章中的代码都是删减版本的。按照惯例,最后一章是参考文献,本文的参考文献都是来自linux内核的Documentation目录,该目录下有大量的文档可以参考,每一篇都值得细细品味。
Linux阅码场
2019/10/08
2.9K0
郭健:Linux内存管理系统参数配置之OOM(内存耗尽)
分享Linux内存占用几个案例
最近一台 CentOS 服务器,发现内存无端损失了许多,free 和 ps 统计的结果相差十几个G,非常奇怪,后来Google了许久才搞明白。
YP小站
2020/09/22
3.9K0
tomcat内存配置
1Tomcat的JVM内存溢出解决方法 在生产环境中,tomcat内存设置不好很容易出现JVM内存溢,解决方法就是修改Tomcat中的catalina.sh文件。
用户1499526
2019/07/15
7K0
jvm系列(十):教你如何成为Java的OOM Killer
此文出处云时代架构,作者:李艳鹏 教你如何成为Java的OOM Killer 前言 虽然事隔半年,当时排查线上OOM事故的过程记忆犹新,每一个步骤都历历在目,感谢业务组、系统部、压测组、监控与应急部对架构组的强力支持,得以让这个Java内存问题水落石出,经过半年多的全面的应用日志 切割方式的改造,现在基本没有OOM的问题了,线上服务运行非常健康,对可用性的保障起到了很大的作用,如果你在经历OOM,读了这个文章会有很大的启发。 Become OOM Killer 我们都知道JVM的内存管理是自动化的,Jav
纯洁的微笑
2018/04/18
1.9K0
jvm系列(十):教你如何成为Java的OOM Killer
腾讯云服务器添加虚拟内存
使用腾讯云服务器也有一段时间了,不过由于对Linux知识了解的比较少,加上服务器稳定性一直都比较好的,所以便很少去折腾服务器。直到最近,站点时常打不开,查了很久的原因,才发现是内存不够导致的~
緣來
2020/01/02
32.5K1
Linux下Tomcat使用详解
版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://blog.csdn.net/wh211212/article/details/53198350
shaonbean
2019/05/26
2.1K0
Tomcat内存设置详解
1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。
allsmallpig
2021/02/25
4.7K0
深入了解Linux OOM Killer:一次可怕的内核事件
The OOM Killer 是内核中的一个进程,当系统出现严重内存不足时,它就会启用自己的算法去选择某一个进程并杀掉. 之所以会发生这种情况,是因为Linux内核在给某个进程分配内存时,会比进程申请的内存多分配一些. 这是为了保证进程在真正使用的时候有足够的内存,因为进程在申请内存后并不一定立即使用,当真正使用的时候,可能部分内存已经被回收了。
嵌入式Linux内核
2023/08/08
5.9K0
深入了解Linux OOM Killer:一次可怕的内核事件
Linux下 Tomcat内存溢出
Tomcat本身不能直接在计算机上运行,需要依赖于操作系统和一个Java虚拟机。JAVA程序启动时JVM会分配一个初始内存和最大内存给APP。当APP需要的内存超出内存的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。
星哥玩云
2022/07/04
3.5K0
Linux Swap交换分区介绍总结
什么是Linux swap space呢?我们先来看看下面两段关于Linux swap space的英文介绍资料:
zhangdd
2021/03/02
5K0
深入理解swap交换分区理解及扩存
定义:Swap space交换空间,是虚拟内存的表现形式。系统为了应付一些需要大量内存的应用,而将磁盘上的空间做内存使用,当物理内存不够用时,将其中一些暂时不需要的数据交换到交换空间,也叫交换文件或页面文件中。
网络技术联盟站
2020/08/28
3.8K0
前京东陌陌高级架构师的直播笔记分享(Java 内存问题排查和解决:内存概览,内存问题出现的原因,问题代码,案例分析)
上一周我有幸观看了高级架构师李国讲师的直播,内容是关于 Java 内存问题排查和解决。
RendaZhang
2020/09/08
1.5K0
前京东陌陌高级架构师的直播笔记分享(Java 内存问题排查和解决:内存概览,内存问题出现的原因,问题代码,案例分析)
相关推荐
彻底理解虚拟内存:从一个demo看free/ps/top内存含义
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档