linux中引起OOM Killer的原因及排查思路

2024-08-23 21:12

本文主要是介绍linux中引起OOM Killer的原因及排查思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OOM Killer(Out-Of-Memory Killer)的触发通常是由于Linux系统内存不足时,内核采取的一种极端保护措施。具体来说,OOM Killer触发的原因主要有以下几个方面:

一、触发OOM Killer原因

  • 系统内存耗尽

当系统物理内存(RAM)和交换空间(Swap)都被大量占用,无法满足新的内存分配请求时,OOM Killer会被触发。这通常发生在高负载的服务器上,当多个内存密集型应用同时运行时,系统内存很快就会被耗尽。

  • 内存分配失败

当某个进程尝试分配内存,但系统无法满足其请求时,内核会尝试通过回收内存(如页面回收、文件缓存回收等)来释放空间。如果回收的内存仍然不足,OOM Killer将被激活,以选择并终止某些进程来释放内存。

  • 内存泄漏

应用程序中的内存泄漏问题也可能导致OOM Killer的触发。内存泄漏是指程序在运行过程中,无法释放已经不再使用的内存空间,导致内存不断被占用,最终耗尽系统资源。

  • 特定进程的内存需求

某些进程可能因为内存需求过大,或者请求大块连续内存而触发OOM Killer。在32位系统中,由于地址空间的限制,大内存请求更容易导致问题。

  • 系统配置和策略

Linux内核提供了多种配置选项和策略,用于控制OOM Killer的行为。例如,可以通过调整/proc/sys/vm/oom_kill_allocating_task的值来决定是否杀死尝试分配内存的进程。此外,还可以通过设置进程的OOM得分(oom_score_adj)来调整其被OOM Killer选中的优先级。

  • 内核和硬件限制

在某些情况下,内核或硬件的限制也可能导致OOM Killer的触发。例如,在NUMA(Non-Uniform Memory Access)架构的系统中,节点间的内存分配限制可能导致OOM Killer的激活。

当OOM Killer被触发时,内核会计算每个进程的OOM得分,并选择得分最高的进程进行终止。OOM得分通常基于进程的内存使用量、优先级、类型等因素来计算。被终止的进程及其内存释放信息会被记录在系统日志中,以便管理员进行后续分析和处理。

二、排查思路

  1. 实时监控:通过系统监控工具(如tophtopfreevmstat等)查看当前系统内存使用情况,包括物理内存和交换空间。
  2. 检查系统日志:查看/var/log/messagesdmesg输出,寻找OOM Killer的相关信息,内核会在触发OOM Killer时记录相关信息,包括被杀掉的进程及其理由。
  3. 分析OOM Killer报告:当OOM Killer启动时,它会生成一个详细的报告,指出为何选择特定进程进行终止。可以通过这些信息来识别最可能的内存消耗大户。
  4. 定位消耗内存的进程:利用pspmapsmem等工具定位消耗内存最多的进程,并进一步分析其行为和资源需求。
  5. 检查程序日志和代码:如果确定是某个应用程序导致的OOM,应查看该程序的日志文件,了解其运行时的内存使用情况。同时,对代码进行审计,查找是否存在内存泄漏或其他不当内存管理。
  6. 启用内核OOME日志:在系统启动参数中加入vm.panic_on_oom=0vm.overcommit_memory=2(或适当调整内存过载策略),以便在发生OOM时让内核生成更详细的日志。
  7. 长期监控与趋势分析:使用像Prometheus + Grafana这样的监控系统长期收集内存使用数据并进行趋势分析,有助于提前发现潜在的内存使用增长问题。
  8. 优化资源配置:根据实际情况调整系统或容器的内存限制,优化程序以降低内存消耗,或者考虑增加物理内存和交换空间。
  9. 针对特定问题解决方案:例如,在图像处理或大数据场景中,采用合适的内存管理和缓存策略,避免一次性加载所有数据到内存中。对于Java应用,可通过调整JVM参数等方式优化内存管理。

三、优化建议

为了避免OOM Killer的触发,可以采取以下措施:

  • 优化内存使用:检查并优化应用程序的内存使用,避免内存泄漏和不必要的内存占用。
  • 增加内存资源:在系统允许的情况下,增加物理内存或交换空间的大小。
  • 调整OOM Killer策略:通过修改系统配置,调整OOM Killer的行为和优先级策略。
  • 监控和预警:使用系统监控工具实时监控系统内存使用情况,及时发现并处理内存不足的问题。

四、实例分析

1、ls触发OMM

Aug 17 03:12:59 Hygonrbej01 kernel: [159440.49643] ls invoked oom-killer: gfp_mask=0x6040c0(GFP_KERNEL|__GFP_COMP), nodemask=(null), order=3, oom_score_adj=0
Aug 17 03:12:59 Hygonrbej01 kernel: [159440.49646] ls cpuset=/ mems_allowed=0
Aug 17 03:12:59 Hygonrbej01 kernel: [159440.49652] CPU: 0 PID: 389525 Comm: ls Kdump: loaded Tainted: GOE  4.19.90-23.26.v2101.ky10.x86_64 #1

这段日志显示了Linux系统中的一个内存不足(OOM, Out of Memory)事件,具体是由ls命令触发的。ls命令是一个常用的列出目录内容的命令,但在某些情况下,如果它试图读取或处理大量文件,并且系统内存已经接近耗尽,就可能会触发OOM Killer。不过,在这个特定的例子中,ls命令本身作为OOM Killer的受害者似乎有些不寻常,因为ls通常不会消耗大量内存。这可能是由于其他因素导致的,比如系统内存已经极度紧张,或者ls命令在处理某些特殊文件或目录时遇到了问题。

以下是日志中关键信息的解释:

  • OOM Killer被调用:日志中的ls invoked oom-killer表明ls进程是触发OOM Killer的“罪魁祸首”。但请注意,这并不一定意味着ls是内存泄漏或过度使用内存的源头;它可能只是在系统内存已经严重不足时尝试分配内存的众多进程之一。

  • 内存分配请求gfp_mask=0x6040c0(GFP_KERNEL|__GFP_COMP)表示这是一个内核内存分配请求,使用了GFP_KERNEL__GFP_COMP标志。GFP_KERNEL是内核分配内存时最常用的标志,表示可以等待内存释放;__GFP_COMP可能是一个与内存压缩相关的标志,但在较新的Linux版本中可能不再使用或已更改含义。

  • 节点和CPU信息nodemask=(null)表明没有特定的NUMA节点偏好;CPU: 0表明OOM Killer的日志是在CPU 0上记录的。

  • 进程信息PID: 389525 Comm: ls显示了被OOM Killer选中的进程ID(PID)和命令名(Comm)。

  • 系统信息:包括硬件名称、BIOS版本等信息,这些信息对于分析系统环境和可能的问题源很有帮助。

  • 调用栈Call Trace部分显示了导致OOM Killer被触发的函数调用栈。这有助于开发者或系统管理员了解在内存分配失败时,系统是如何处理并最终决定杀死某个进程的。

  • 内存信息(Mem-Info):这部分提供了关于系统内存使用情况的详细统计,包括活跃和非活跃的内存、slab内存、映射的内存、共享内存等。这些信息对于诊断内存问题非常有用。

2、Java进程被kill9

Aug 17 03:12:59 Hygonrbej01 kernel: [159440.49894] Out of memory: Kill process 3067998 (java) score 244 or sacrifice child
Aug 17 03:12:59 Hygonrbej01 kernel: [159440.50254] Killed process 367998 (java) total-vm:12717748kB, anon-rss:3581268kB, file-rss:3936kB, shmem-rss:20kB
Aug 17 03:12:59 Hygonrbej01 kernel: [159440.19186] oom_reaper: reaped process 3067998 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:20kB
Aug 17 03:12:59 Hygonrbej01 systemd[1]: bes.service: Main process exited, code=killed, status=9/KILL
Aug 17 03:12:59 Hygonrbej01 systemd[1]: bes.service: Failed with result 'signal'.

这段日志记录了几个关键事件,主要涉及系统内存管理、服务失败。下面是对这些事件的详细解释:

  1. 内存不足(OOM Killer 触发)
    • Out of memory: Kill process 3067998 (java) score 244 or sacrifice child:这表示系统遇到了内存不足(Out of Memory, OOM)的情况,OOM Killer 被激活以杀死一些进程以释放内存。它选择了进程ID为3067998的Java进程作为牺牲品,因为这个进程的OOM分数(score)最高,为244。OOM分数是基于进程占用的内存量、优先级等因素计算得出的。
  2. Java进程被杀死
    • Killed process 3067998 (java) total-vm:12717748kB, anon-rss:3581268kB, file-rss:3936kB, shmem-rss:20kB:这进一步确认了Java进程(PID 3067998)已被杀死。该进程占用的总虚拟内存(total-vm)为12,717,748kB,匿名可回收内存(anon-rss)为3,581,268kB,文件映射内存(file-rss)为3,936kB,共享内存(shmem-rss)为20kB。
  3. OOM Reaper 清理
    • oom_reaper: reaped process 3067998 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:20kB:OOM Reaper 是一个内核线程,负责清理OOM Killer杀死的进程留下的资源。这里显示Java进程的匿名可回收内存和文件映射内存已被清零,但共享内存(可能是因为它不是由该进程独占的)保持不变。
  4. 服务失败
    • systemd[1]: bes.service: Main process exited, code=killed, status=9/KILLsystemd[1]: bes.service: Failed with result 'signal':这表明一个名为bes.service的服务的主进程被信号(这里是KILL信号)杀死,导致服务失败。这很可能与前面提到的Java进程被杀有关,如果该Java进程是该服务的一部分。

这篇关于linux中引起OOM Killer的原因及排查思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100509

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n