前言
下面介绍的是防止Linux中OOM-killer杀死重要进程的操作。
(不写前言感觉没有灵魂。。就随便写一句)
OOM-killer简介
linux oom-killer的机制: (oom就是out of memory,内存用尽)linux为了避免内存用尽,导致系统的卡死,会唤醒oom_killer,找出/proc/pid/oom_score值最大的进程将之kill掉,从而释放内存,来保证整个系统的的正常运行。
oom机制:按照oom_score 给进程排序, oom_score越大, 进程就越容易被系统杀死, oom_score值的范围是-17—15, -17表示禁止oom
因此这是内存不足导致的,解决方法通常有以下几种:
在服务器上直接增加内存条(还得停机,云服务器直接扩充内存)
查找占据大量内存的服务进行清理或迁移(无需停机,但是需要准备迁移的目标)
调整服务的内存占用大小(无需停机,无需迁移;如果实例较多,仍是杯水车薪,即使调整了,服务也会容易被kill)
如何确定是OOM问题?
暂无截图,多会儿再出问题了想起再贴
cat /proc/kmsg
or
dmesg
or
more /var/log/messages
查找当天日志,在服务异常的大致时间内出现OOM-killer or Out of memory,即可确认
保护重要进程
<1>禁用重要进程OOM
echo -17 > /proc/<pid>/oom_adj
pid为要保护的那个进程的pid
-17表示禁用OOM
<2>禁用整个系统OOM
不建议,易导致系统卡死或宕机
sysctl -w vm.panic_on_oom=1 (默认为0开启;1禁止)
sysctl -p
<3>通过调整内存相关的内核参数
0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2:表示内核允许分配超过所有物理内存和交换空间总和的内存。
临时生效:
sysctl vm.overcommit_memory=0
sysctl vm.overcommit_memory=1
sysctl vm.overcommit_memory=2
永久生效:
vim /etc/sysctl.conf
vm.overcommit_memory=1
sysctl -p