最近遇到两起Linux的内存问题,其一是触发了oom-killer导致系统挂 1. 内核使用low memory来跟踪所有的内存分配,这样的话一个16GB内存的系统比一个4GB内存的系统,需要消耗更多的low memory,当low memory耗尽,即便系统仍然有剩余内存,仍然会触发oom-killer
导读:手上有一个测试服务器,内存是8G,最近开始搭起微服务的软件架构,单个Spring Boot 服务内存占用有点大,比如一个RocketMq的消费者服务(单独运行的服务),启动占用了 500M 内存,导致我后面想运行其他服务,内存不够,触发了 Linux 的 OOM - Killer 机制
然后又看到了熟悉的oom-killer,又是out of memory,又是swap不足了。 Dec 21 11:09:07 template-mongodb-2-6-3 kernel: [31458594.279409] mongod invoked oom-killer: gfp_mask=
在很多情况下,经常会看到还有剩余内存时,oom-killer依旧把进程杀死了,现象是在/var/log/messages日志文件中有如下信息: Out of Memory: Killed process 当low memory耗尽,不管high memory剩多少,oom-killer都会杀死进程,以保持系统的正常运行。 查看当前的oom-killer的状态:cat /proc/sys/vm/oom-kill 关闭/打开oom-killer: echo "0" > /proc/sys/vm/oom-kill > /proc/sys/vm/oom-kill 或者直接加到/etc/sysctl.conf文件,内容如下: vm.oom-kill = 0 此时,当进程被oom-killer log/messages文件中,信息如下: "Would have oom-killed but /proc/sys/vm/oom-kill is disabled" 5、或者不把oom-killer
通过启动日志看到,SGA的设置不高,服务器配置比较低,所以资源使用也比较紧张,至于宕库原因很可能是因为内存资源不足导致的,如果没猜错就是oom-killer的情况。 所以我让这位朋友去看看系统日志的情况,是否存在oom-killer的情况,没过多久,看到反馈的截图,证明了第一步猜测是正确的了,确实是oom-killer导致的。 ? buffers Swap: 4128760k total, 3872660k used, 256100k free, 5414088k cached 但是8G的内存分配了2G的SGA也不至于导致oom-killer
此篇文章叙述个人的一些拙见~ 先介绍下这位朋友:OOM-killer OOM Killer(Out of Memory Killer) 是当系统内存严重不足时 linux 内核采用的杀掉进程,释放内存的机制 简单来讲,oom-killer 的原则就是损失最小、收益最大,因此它会让杀死的进程数尽可能小、释放的内存尽可能大。 在数据库服务器上,MySQL 被分配的内存一般不会小,因此容易成为 oom-killer 选择的对象。 “既然发生了 OOM,那必然是内存不足,内存不足这个问题产生原因很多。 另一个可以想到的原因就是一般部署 MySQL 的服务器,都会部署很多的监控和定时任务脚本,而这些脚本往往缺少必要的内存限制,导致在高峰期的时候占用大量的内存,导致触发 Linux 的 oom-killer 结果可想而知,这个实例在运行中经常被 oom-killer 杀死,想必原因之一即是因为一开始 MySQL 自身的内存规划欠妥。
简单来讲,oom-killer 的原则就是损失最小、收益最大,因此它会让杀死的进程数尽可能小、释放的内存尽可能大。 在数据库服务器上,MySQL 被分配的内存一般不会小,因此容易成为 oom-killer 选择的对象。 “既然发生了 OOM,那必然是内存不足,内存不足这个问题产生原因很多。 另一个可以想到的原因就是一般部署 MySQL 的服务器,都会部署很多的监控和定时任务脚本,而这些脚本往往缺少必要的内存限制,导致在高峰期的时候占用大量的内存,导致触发 Linux 的 oom-killer 结果可想而知,这个实例在运行中经常被 oom-killer 杀死,想必原因之一即是因为一开始 MySQL 自身的内存规划欠妥。 调整 oom_score_adj 参数(/proc/<pid>/oom_score_adj),将 MySQL 被 oom-killer 锁定的优先级降低。这个参数值越小,越不容易被锁定。 3.
引起此异常的主要原因是内存吃紧,导致oom-killer被触发。oom-killer会杀掉占用内存较高的进程,以确保系统不至于崩溃。
不过所幸开始查看日志,发现原来是 oom-killer导致, 这个和剩余内存少密切相关,当然也和swap相关。 场景8:那么接着导入30g的dump,是否依旧成功呢,遗憾的是这次还是失败了, 因为发生了oom-killer,对应的线程被终止了,swap彻底释放,swap使用量一下子重置为5M了。 场景11:过了几天之后我再次查看,发现swap已经自动重置了,而重置的原因还是oom-killer,看来应该是有个连接被强制终止之后,触发了oom-killer,然后swap彻底释放。
之后可能会出现Lost Connection to MySQL Server during query 1.2 通过日志分析 dmesg -T | grep tidb-server 查看系统日志,在日志中可以发现OOM-Killer 2.1 日志 dmesg -T | grep tikv-server 系统日志中的OOM-killer日志 tikv.log 宕机前后时间的Welcome to TIKV日志,也就意味着tikv重启了
mysql -u root –p或者mysql -uroot –p 快速诊断 top 判断主机负载情况 dmesg | tail 是否存在oom-killer或tcp drop等错误信息 vmstat
子进程 正常结束 或 被 OOM-killer 杀死(SIGKILL 9)。 父进程 未调用wait/waitpid 或 未注册SIGCHLD 处理器。 子进程变成僵尸,PID 仍挂在进程表。
Killed process 9682, UID 27, (mysqld) total-vm:47388kB, anon-rss:3744kB, file-rss:80kB httpd invoked oom-killer 为了保护重要进程不被 oom-killer 掉,我们可以:echo -17 > /proc//oom_adj。其中的数字 -17 表示禁用 OOM。
这个文件里面包含了一个控制是否为当前cgroup启动OOM-killer的标识。 如果写0到这个文件,将启动OOM-killer,当内核无法给进程分配足够的内存时,将会直接kill掉该进程;如果写1到这个文件,表示不启动OOM-killer,当内核无法给进程分配足够的内存时,将会暂停该进程直到有空余的内存之后再继续运行
因此,现在修改后的期望是,如果实际堆大小(驻留对象大小)超过OOM-KILLER阈值(--memory容器中的标志),则容器终止应用程序。 实际上,这也可能不会发生。 当我在容器受限的环境下分析内存密集型Node.js应用程序时,我看到两种情况: OOM-KILLER在heapTotal和heapUsed的值都高于容器限制之后,隔一段很长的时间才执行。 OOM-KILLER根本没有执行。 容器环境中的Node.js相关行为解释 监控容器中运行应用程序的重要指标是驻留集大小(RSS-resident set size)。
通过应用日志并未查到有任何异样,代码也走查了好几遍; 3、通过dmesg | grep java查看内核日志信息,发现了问题所在,如下: [16949523.941194] java invoked oom-killer
通过应用日志并未查到有任何异样,代码也走查了好几遍; 3、通过dmesg | grep java查看内核日志信息,发现了问题所在,如下: [16949523.941194] java invoked oom-killer
查看操作系统日志,进一步验证了 MySQL 耗尽主机内存,触发 OOM : # grep oom-killer /var/log/messages* /var/log/messages-20220605 :May 30 02:31:30 vm10-136-9-24 kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj
可用内存(free+buffers/cache)过低,接近于0的时候 交换分区内存占用swap used增加或者有波动 dmesg | grep oom-killer显示有OutOfMemory-killer
full时刻开始,大约过了2.5小时,mysqld进程内存消耗持续上升,最终引发oom kill Sep 18 12:56:28 mgr3 kernel: docker-containe invoked oom-killer 14638256 /usr/local/mysql-8.0.26-linux-glibc2.12-x86_64/bin/mysqld --defaults-file=/data/MySQL/my.cnf OS层oom-killer