news 2026/5/12 11:30:32

linux OOM Killer 深度监控:进程、cgroup 和 namespace 配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux OOM Killer 深度监控:进程、cgroup 和 namespace 配置

📊 OOM Killer 深度监控:进程、cgroup 和 namespace 配置

🔍查看 OOM Killer 详细信息

1.查看 OOM 杀死的历史记录

# 查看内核环形缓冲区中的 OOM 详细日志sudodmesg-T|grep-A30-B5"Out of memory"# 使用专门的 OOM 日志分析工具sudojournalctl -k --grep="oom\|out.of.memory"--since="24 hours ago"# 查看被杀死进程的详细信息sudogrep-i"killed process"/var/log/messages|tail-20# 更详细的 OOM 信息(包含内存统计)sudojournalctl -k|grep-i"oom_kill_process"-A10

2.查看当前内存压力状态

# 查看内存压力状态cat/proc/pressure/memory# 监控内存压力变化watch-n1'cat /proc/pressure/memory'# 查看每个 NUMA 节点的内存统计cat/proc/zoneinfo|grep-A5"Node"# 查看页面分配失败统计(OOM 前兆)cat/proc/vmstat|grep-E"allocstall|pgalloc_dma"

📁进程级别的 OOM 配置查看

1.查看单个进程的 OOM 配置

# 查看指定进程的所有 OOM 相关文件ls-la /proc/<PID>/oom_*# 查看 OOM 分数(越高越容易被杀)cat/proc/<PID>/oom_score# 查看 OOM 调整值(范围:-1000 到 +1000)cat/proc/<PID>/oom_score_adj# 查看进程的内存使用情况cat/proc/<PID>/status|grep-A10-E"Vm"# 查看进程的内存映射cat/proc/<PID>/maps

2.批量查看所有进程的 OOM 分数

# 查看所有进程的 OOM 分数和内存使用forpidin$(ps-eo pid|grep-v PID);doif[-f /proc/$pid/oom_score];thenoom_score=$(cat/proc/$pid/oom_score2>/dev/null)oom_adj=$(cat/proc/$pid/oom_score_adj2>/dev/null)cmd=$(ps-p $pid -ocomm=2>/dev/null)echo"PID:$pid, CMD:$cmd, OOM Score:$oom_score, OOM Adj:$oom_adj"fidone|sort-k6 -rn|head-20# 更简洁的版本ps-eo pid,comm,%mem --sort=-%mem|head-10|whilereadpid cmd mem;do[-f /proc/$pid/oom_score]&&\echo"PID:$pid, CMD:$cmd, MEM:$mem%, OOM:$(cat/proc/$pid/oom_score)"done

🏗️Cgroup 相关的 OOM 配置

1.Cgroup v1(CentOS 7 默认)

# 查看 cgroup 内存配置ls-la /sys/fs/cgroup/memory/# 查看系统所有 memory cgroupfind/sys/fs/cgroup/memory -name"memory.*"-type f|head-20# 查看特定 cgroup 的内存限制cat/sys/fs/cgroup/memory/memory.limit_in_bytescat/sys/fs/cgroup/memory/memory.usage_in_bytes# 查看 cgroup 的 OOM 控制cat/sys/fs/cgroup/memory/memory.oom_control# oom_kill_disable 0 = 允许 OOM Killer,1 = 禁用# under_oom 0 = 没有 OOM,1 = 处于 OOM 状态# 查看 cgroup 的内存统计cat/sys/fs/cgroup/memory/memory.stat# 查看哪个 cgroup 发生了 OOMsudodmesg|grep-i"oom_kill"|grep-o"cgroup.*"

2.Cgroup v2(如果启用)

# 查看 cgroup v2 挂载点mount|grepcgroup2# 查看 cgroup v2 内存配置ls-la /sys/fs/cgroup/# 查看当前进程所在的 cgroupcat/proc/self/cgroup# 查看 cgroup 的内存限制和当前使用cat/sys/fs/cgroup/memory.maxcat/sys/fs/cgroup/memory.current# 查看内存压力cat/sys/fs/cgroup/memory.pressure

3.Docker 容器的 OOM 配置

# 查看 Docker 容器的内存限制dockerinspect<container_id>|grep-i memory# 查看容器的 cgroup 路径dockerinspect<container_id>|grepCgroup# 查看容器的 OOM 事件dockerevents --filter'event=oom'--since'24h'# 查看容器内进程的 OOM 状态dockerstats --no-stream# 进入容器的 cgroup 查看详细配置CONTAINER_ID=<your_container_id>CGROUP_PATH=$(dockerinspect $CONTAINER_ID|grepCgroup|cut-d'"'-f4)ls-la /sys/fs/cgroup/memory/docker/$CGROUP_PATH/

🌐Namespace 相关的内存隔离

1.查看进程的 Namespace 信息

# 查看进程的 namespace IDls-la /proc/<PID>/ns/# 查看进程所在的各个 namespacereadlink /proc/<PID>/ns/mnt readlink /proc/<PID>/ns/pid readlink /proc/<PID>/ns/net readlink /proc/<PID>/ns/ipc readlink /proc/<PID>/ns/uts readlink /proc/<PID>/ns/user# 查看进程的 Mount namespace 中的内存文件系统findmnt -N<PID>

2.查看 Namespace 中的内存配置

# 查看特定 namespace 中的内存信息nsenter -t<PID>-mfree-h# 进入容器的 namespace 查看内存nsenter -t<PID>-m -pcat/proc/meminfo# 查看不同 namespace 中的内存压力nsenter -t<PID>-mcat/proc/pressure/memory

🔧高级诊断工具

1.使用 systemd-cgtop 监控 cgroup

# 按内存使用排序查看 cgroupsystemd-cgtop --order=memory# 实时监控 cgroup 内存变化watch-n1systemd-cgtop --order=memory

2.使用 cgroup-tools

# 安装 cgroup 工具yuminstalllibcgroup libcgroup-tools# 查看所有 cgroup 子系统lssubsys -am# 查看特定进程的 cgroupcat/proc/<PID>/cgroup# 查看 cgroup 配置cgget -r memory<cgroup_path>

3.自定义 OOM 监控脚本

#!/bin/bash# oom-monitor.sh# 监控 OOM 事件echo"=== OOM Killer 监控 ==="echo"1. 查看最近 OOM 事件:"journalctl -k --since="1 hour ago"|grep-i"oom\|killed"|tail-5echo-e"\n2. 内存使用前10的进程:"ps-eo pid,ppid,cmd,%mem,%cpu --sort=-%mem|head-11echo-e"\n3. Cgroup 内存使用:"forcgin$(find/sys/fs/cgroup/memory -name"memory.usage_in_bytes");dousage=$(cat$cg)limit_file=$(echo$cg|sed's/usage_in_bytes/limit_in_bytes/')if[-f$limit_file];thenlimit=$(cat$limit_file)if[$limit-ne9223372036854775807];thenusage_mb=$((usage/1024/1024))limit_mb=$((limit/1024/1024))echo"Cgroup:$(dirname$cg), Usage:${usage_mb}MB, Limit:${limit_mb}MB"fifidone|head-10echo-e"\n4. 内存压力状态:"cat/proc/pressure/memory

📊实战:分析 OOM 事件

1.完整 OOM 事件分析流程

# 步骤1: 查找最近的 OOM 事件OOM_LOG=$(sudojournalctl -k|grep-B5 -A15"Out of memory"|tail-30)echo"$OOM_LOG"# 步骤2: 提取被杀死的进程信息KILLED_PID=$(echo"$OOM_LOG"|grep"Killed process"|grep-o"pid [0-9]*"|awk'{print $2}')if[!-z"$KILLED_PID"];then# 步骤3: 查看进程的 cgroupecho"进程$KILLED_PID的 cgroup:"cat/proc/$KILLED_PID/cgroup# 步骤4: 查看进程的内存使用历史if[-d /proc/$KILLED_PID];thenecho"进程内存状态:"cat/proc/$KILLED_PID/status|grep-E"Vm|Rss"fi# 步骤5: 查看进程的 OOM 配置echo"OOM 配置:"cat/proc/$KILLED_PID/oom_scorecat/proc/$KILLED_PID/oom_score_adjfi

2.Cgroup OOM 分析

#!/bin/bash# analyze-cgroup-oom.sh# 查找发生过 OOM 的 cgroupecho"查找发生过 OOM 的 cgroup:"find/sys/fs/cgroup/memory -name"memory.oom_control"|whilereadfile;dounder_oom=$(grep"under_oom"$file|awk'{print $2}')if["$under_oom"=="1"];thencgroup=$(dirname$file)echo"Cgroup$cgroup处于 OOM 状态"echo" 内存使用:$(cat$cgroup/memory.usage_in_bytes)bytes"echo" 内存限制:$(cat$cgroup/memory.limit_in_bytes)bytes"fidone

⚙️配置建议和优化

1.保护重要进程

# 为重要进程设置 OOM 保护echo"-1000">/proc/<PID>/oom_score_adj# 对于 systemd 服务[Service]OOMScoreAdjust=-1000MemoryHigh=90%MemoryMax=95%

2.Cgroup 内存限制最佳实践

# 为不同服务设置合理的 cgroup 限制# /etc/systemd/system/myapp.service.d/memory.conf[Service]MemoryLimit=2GMemorySwapMax=1G

3.监控和报警配置

# 在 /etc/crontab 中添加定期检查*/5 * * * * root /usr/local/bin/check-oom-risk.sh# 使用 Prometheus node_exporter 监控# 监控指标: node_memory_OOM_kill, node_memory_pressure
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 20:58:00

Linux cgroup 和 namespace 深度详解

&#x1f3d7;️ cgroup 和 namespace 深度详解 &#x1f4da; 核心概念对比 特性cgroup (Control Groups)namespace (命名空间)目的资源限制和分配隔离和虚拟化系统资源视图主要功能CPU、内存、I/O 等资源限制PID、网络、挂载点等隔离工作层级树状层级结构平级或嵌套结构配置…

作者头像 李华
网站建设 2026/5/9 15:31:57

导师推荐专科生必用AI论文工具TOP8:开题报告神器测评

导师推荐专科生必用AI论文工具TOP8&#xff1a;开题报告神器测评 2026年专科生论文写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的论文…

作者头像 李华
网站建设 2026/5/9 9:33:57

如何用Docker+Shiny Server实现高效部署?(附完整脚本)

第一章&#xff1a;Shiny网页应用部署概述 Shiny 是 R 语言中用于构建交互式 Web 应用的强大框架&#xff0c;广泛应用于数据可视化、统计分析和机器学习结果展示。将 Shiny 应用从本地开发环境部署到生产服务器&#xff0c;是实现成果共享与协作的关键步骤。部署过程不仅涉及代…

作者头像 李华
网站建设 2026/5/9 15:32:41

FSMN VAD实战案例:会议录音语音片段自动切分完整指南

FSMN VAD实战案例&#xff1a;会议录音语音片段自动切分完整指南 1. 引言&#xff1a;为什么你需要语音活动检测&#xff1f; 你有没有遇到过这样的场景&#xff1f;一场两小时的会议录完音&#xff0c;回放时却发现大量时间是静默、翻纸声或空调噪音。手动剪辑不仅耗时耗力&…

作者头像 李华
网站建设 2026/5/9 4:49:40

一文读懂 到底什么是CRM系统?(附厂商推荐)

最近发现&#xff0c;越来越多的企业决策者和管理层将关注点聚焦于几个关键命题&#xff1a;“企业必须推动精细化运营&#xff0c;向管理要效益”“客户资源是企业的核心战略资产&#xff0c;需进行系统性经营”“亟需部署CRM系统&#xff0c;实现客户关系的数字化、智能化管理…

作者头像 李华