深入分析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 23:49
下一篇 2024-10-03 23:49

相关推荐

  • 内核驱动编译环境代价分析

    内核驱动编译环境是在Linux系统中编译内核模块的过程。本文通过分析内核驱动编译环境的各个方面,包括编译工具的选择、编译速度、编译器选项等,来探讨其代价所在,并提供一些优化的建议。…

    编程 2025-04-29
  • 如何在Linux中添加用户并修改配置文件

    本文将从多个方面详细介绍在Linux系统下如何添加新用户并修改配置文件 一、添加新用户 在Linux系统下创建新用户非常简单,只需使用adduser命令即可。使用以下命令添加新用户…

    编程 2025-04-27
  • 如何解决linux jar包 invalid or corrupt jarfile问题

    对于许多开发人员和系统管理员在Linux环境下使用Java开发过程中遇到的一个常见的问题是 invalid or corrupt jarfile(无效或损坏的jar文件)错误。当您…

    编程 2025-04-27
  • 在Linux上安装JRE并配置环境变量

    本文将从以下几个方面为您详细阐述如何在Linux系统上,通过自己账户安装JRE,并且配置环境变量。 一、安装JRE 在进行安装前,我们需要下载JRE的安装包并解压,可以从官方网站下…

    编程 2025-04-27
  • 如何做内核的工作

    内核是操作系统的核心,它提供了系统调用接口、存储管理、进程管理、设备驱动等基础功能。如何做内核的工作呢?本文从多个方面进行阐述: 一、环境搭建 首先,我们需要搭建好内核开发环境。目…

    编程 2025-04-27
  • GTKAM:Linux下的照片管理器

    GTKAM是用于Linux操作系统的一款照片管理器,它支持多种相机及存储设备,并提供了一系列强大的工具,让用户可以方便地浏览、管理、编辑和导出照片。本文将从多个方面对GTKAM进行…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25

发表回复

登录后才能评论