深入分析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而导致系统崩溃。

原创文章,作者:YCFV,如若转载,请注明出处:https://www.506064.com/n/131984.html

(0)
YCFVYCFV
上一篇 2024-10-03
下一篇 2024-10-03

相关推荐

  • 包含python图像失真的词条

    本文目录一览: 1、OpenCV Python 系列教程4 – OpenCV 图像处理(上) 2、OpenCV-Python教程:57.图像修复 3、图像处理和数据增强…

    编程 2024-10-03
  • python正则结尾匹配(python正则匹配括号以及内容)

    本文目录一览: 1、python 正则表达式,怎样匹配以某个字符串开头,以某个字符串结尾的情况? 2、python 正则如何从末尾匹配 3、python的正则表达式 python …

    编程 2024-10-04
  • yum升级指南

    一、升级前的准备工作 在升级yum之前,我们需要进行一些准备工作,以确保系统的稳定性和安全性。 1、备份数据。在升级前,我们需要对重要的数据进行备份,以免因升级出现错误造成数据丢失…

    编程 2024-10-04
  • java精妙代码(java实用代码)

    1、做java软件工程师,怎样才能写出好的代码? 2、JAVA代码 3、跪地求好玩的JAVA 源代码~ Java代码之于java程序员而言就是左膀右臂,java代码写的好的java…

    编程 2024-10-03
  • 是时候放弃php了,2020年php凉透了

    本文目录一览: 1、是否该放弃学php?? 2、我是一个php程序员 工作半年多,不想做php这方面的开发了,想转java开发,是否该放弃重新学习java 3、为什么老师告诉我说P…

    编程 2024-10-03
  • Python 程序:反转数字

    本文公开了使用 Python While 循环、函数和递归来反转数字的 Python 程序。 这个 python 程序反转一个数字,允许用户输入任意正整数。然后,这个 Python…

    编程 2024-10-03
  • 提高网页图片信任度的CSS样式设置

    在现今互联网界,图片作为一种重要的信息载体,被广泛地应用于各种网站上。但是,随着网络攻击的不断升级,网页图片信任度的问题越来越受到重视。为了增加用户对网页图片的信任度,我们可以使用…

    编程 2024-10-04
  • phpdzcms的简单介绍

    本文目录一览: 1、需要定制一套CMS模板,帝国CMS这些都可以 2、在线急求 PHP解密 需要定制一套CMS模板,帝国CMS这些都可以 phpcms php168 dedecms…

    编程 2024-10-04
  • Latex导数详解

    一、Latex导数点 在Latex中表示导数点的方式是使用撇号,撇号数量表示导数的阶数,例如一阶导数表示为$f'(x)$,二阶导数表示为$f”(x)$,依次类推。 二、…

    编程 2024-10-03
  • Java KeySet:多重用途的集合

    一、简介 Java KeySet是Java编程语言中提供的一个集合类,用于保存键的集合。Java KeySet是从Java 1.2版本开始提供的。 KeySet是Java语言的一种…

    编程 2024-10-04

发表回复

登录后才能评论