您的位置:

深入分析Linux内核的oomkiller

Linux内核的oomkiller(Out of Memory Killer)是一个非常有用的工具,它可以在Linux系统内存不足的时候,关闭一些进程来释放内存。oomkiller在大多数情况下都能正常工作,但是,在某些情况下,它可能会关闭一些重要的进程,导致系统崩溃或数据丢失。接下来,我们将从多个方面深入分析oomkiller。

一、oomkiller日志

oomkiller的日志是非常重要的,因为它能够记录oomkiller的行为和执行过程,帮助我们更好地理解它的机制和获取错误诊断。查看Linux系统的oomkiller日志文件,可以使用以下命令:

dmesg | grep -i "oom"

如果系统中发生oom事件,可以查看到类似下面的输出:

[817032.308828] Out of memory: Kill process xxxx (php-fpm) score xxxx or sacrifice child
[817032.324742] Killed process xxx (php-fpm) total-vm:xxxxx kB, anon-rss:xxxxx kB, file-rss:xxxx kB, shmem-rss:xxxx kB

可以看到,oomkiller关闭了一个大小为xxxxkB的进程(上面输出内容中的 pid, score和KB的位置,因为不同系统和内核版本的问题可能会有所差异,需要自行修改)。

此时,用户需要检查进程的日志,排查问题,再决定是否需要对oomkiller设置进行调整或升级硬件配置等操作。

二、oomkiller设置

默认情况下,Linux系统的oomkiller是开启的,并且是按照缺省优先级进行操作的。但是,在实际生产环境中,有时需要对oomkiller进行一些配置优化或调整。以下是一些常见的设置:

1、修改优先级:如果系统中有一些特别重要的进程需要保持运行,可以通过指定/proc位置下的相应进程中oom_score_adj参数,调整其优先级。例如,以下命令将php-fpm进程优先级降低50:

echo -500 > /proc/<pid>/oom_score_adj

2、禁用oomkiller:在某些情况下,禁用oomkiller是有必要的,比如,当你的系统运行了非常稳定的程序或负载非常低的任务时。可以使用sysctl命令来禁用oomkiller:

sysctl -w vm.overcommit_memory=2 
sysctl -w vm.oom_kill_allocating_task=1

3、设置oom_adj:这个参数是用来决定在系统内存不足时,哪些进程应该被关闭。可以使用以下命令设置它的值:

echo -17 > /proc/<pid>/oom_adj

注意,需要root权限来修改以上设置。

三、oomkiller机制

oomkiller的机制涉及很多内核调度算法和内存管理。在Linux内核中,当系统内存出现不足的时候,会采取一些机制来尝试解决内存不足的问题。

如果所有尝试都失败了,它将找到一个将释放最多内存的进程,并关闭它,然后回收其内存。oomkiller对进程排序的算法是基于进程的内存占用率进行的。不过,如果有些进程被明确地标记为不可杀死的,oomkiller将会绕过它们。

四、oomkiller 路由器

尽管本文一直在讲述Linux中的oomkiller,但它并不是Linux系统的专利。事实上,许多路由器使用的嵌入式系统也具有oomkiller功能。如果你想查看路由器中的oomkiller日志,可以使用以下命令:

dmesg | grep -i "oom"

如果路由器中的oomkiller关闭了一个进程,用户应该根据操作系统及应用程序的要求,对操作系统和应用程序进行检查和调整,处理问题。如果出现了频繁的oomkiller事件,你可能需要升级硬件或更改软件配置。

五、oomkiller 关掉

在大多数情况下,oomkiller是非常有用的,但是,如果你想关闭oomkiller,请使用以下命令:

sysctl -w vm.panic_on_oom=1

当你这样做时,oomkiller将被永久关闭。这是一个非常危险的操作,如果系统出现了内存不足的情况,它将无法自动释放一些内存,导致系统崩溃或死机。

六、oomkiller ac2100选取

oomkiller并不是所有Linux系统都默认开启的,即使它被开启了,也需要一些参数和优化。这也使得有些用户选择其他系统或路由器设备。

ASUS的AC2100路由器,是一款非常受欢迎的路由器设备。它的Linino系统默认开启oomkiller,并可以进行修改。以下是一些与oomkiller相关的设置示例:

#获得所有PID 和 OOM得分
ps waux | awk '{print $2,$6,$10}' | grep -v '
   ' | sort -n -k 2

#修改启用优先级为-999,禁用Oomkiller,值可以根据实际情况适当修改
echo "-999">/proc/self/oom_adj

#查看当前内存状态
cat /proc/meminfo

#修改启用优先级-offset,默认值为0
echo "10">/proc/sys/vm/overcommit_memory
echo "100">/proc/sys/vm/oom_score_adj-offset

#查看崩溃日志
grep -i "oom" /var/log/messages

   

以上示例仅供参考,因为不同的系统和硬件可能需要不同的优化参数。

总结

oomkiller是Linux系统很重要的一个功能组件,负责释放内存、杀死进程等操作。文章从日志、设置、机制、路由器、关闭等多个方面详细介绍了oomkiller的作用和使用方法。当然,在开启和修改oomkiller的参数时,需要谨慎进行,并根据实际情况进行调整,尽量避免因oomkiller而导致系统崩溃。