当前位置: 首页 > news >正文

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
http://www.jsqmd.com/news/279215/

相关文章:

  • 5个FSMN VAD部署推荐:镜像免配置一键启动教程
  • 技术实战:用 Python 脚本高效采集与分析手机操作日志
  • 多模态医学数据治理通过标准化整合、安全合规共享与智能分析,打通数据孤岛,为精准医疗、药物研发
  • 2026年研磨仪厂家推荐:组织研磨仪品牌+优质厂家+仪器选购全指南
  • 互联网大厂Java求职面试实战:从Spring Boot到微服务
  • 淋巴造血系统肿瘤MICM(形态学Morphology、免疫学Immunology、细胞遗传学Cytogenetics、分子生物学Molecular Biology)高质量数据集构建
  • ATCC细胞怎么进口?流程、挑战与解决方案探讨
  • C++课后习题训练记录Day72
  • 常见的Jmeter压测问题
  • AI赋能智能终端PCB设计,核心是通过自动化布局布线、仿真加速、缺陷预测与制造协同
  • 深聊美国ida国际设计奖诚信申报,红典咨询服务全!
  • 仓库管理系统+JAVA源代码及设计说明,零基础入门到精通,收藏这篇就够了
  • 2026年国内出海企业美国卡车运输公司优选指南——聚焦尾程物流痛点与合规解决方案
  • 如何用Docker+Shiny Server实现高效部署?(附完整脚本)
  • Speech Seaco Paraformer跨境电商应用:中文直播实时翻译场景
  • FBM201-P0916AA压缩现场端子模块
  • Qwen3-1.7B从零开始教程:Jupyter+LangChain完整调用流程
  • 固原市西吉隆德泾源彭阳原州英语雅思培训辅导机构推荐、2026权威出国雅思课程中心学校口碑排行榜
  • 独家披露:大厂都在用的dify长文本预处理方案(索引成功率提升至100%)
  • 昆明市富民石林禄劝寻甸安宁英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜
  • ue web socket server
  • Z-Image-Turbo API安全配置:生产环境接口访问控制教程
  • Qwen3-0.6B企业级部署:生产环境稳定性实战测试
  • GPEN支持自定义图片修复?inference_gpen.py参数详解
  • 分析服务不错的线下广告监测企业,浦零科技怎么收费
  • 云主机cpu使用率增加原因有哪些
  • 2026年1月中国跨境电商卖家必看:美国尾程物流痛点破解与货马达(Homeda)一站式解决方案指南
  • 想找海外能源投资律师,哪家服务靠谱费用合理?
  • ANSYS workbench的模态分析基本原理和步骤
  • 2026最新海南公司注册服务商/机构TOP5评测!专业团队+全流程服务权威榜单发布,助力企业轻松布局自贸港