<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cgroup on 吾爱主机</title><link>https://blog.waihost.com/tags/cgroup/</link><description>Recent content in Cgroup on 吾爱主机</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 16 Jul 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://blog.waihost.com/tags/cgroup/index.xml" rel="self" type="application/rss+xml"/><item><title>Linux cgroup v2 内存控制与 OOM Killer：原理、观测与容器化实践</title><link>https://blog.waihost.com/posts/linux-cgroup-v2-memory-oom-killer/</link><pubDate>Thu, 16 Jul 2026 00:00:00 +0800</pubDate><guid>https://blog.waihost.com/posts/linux-cgroup-v2-memory-oom-killer/</guid><description>&lt;img src="https://blog.waihost.com/images/covers/linux-cgroup-v2-memory-oom-killer.svg" alt="Featured image of post Linux cgroup v2 内存控制与 OOM Killer：原理、观测与容器化实践" /&gt;&lt;p&gt;线上最棘手的一类故障，往往不是“服务报了明确业务错误”，而是进程突然消失：容器退出码 &lt;code&gt;137&lt;/code&gt;、Pod 状态里出现 &lt;code&gt;OOMKilled&lt;/code&gt;，或者主机 &lt;code&gt;dmesg&lt;/code&gt; 里留下一行 &lt;code&gt;Out of memory: Killed process&lt;/code&gt;。表象是“内存不够”，根因通常落在 &lt;strong&gt;内存如何被记账、如何被限制、以及内核如何选择牺牲者&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本文以 Linux &lt;strong&gt;cgroup v2 memory 控制器&lt;/strong&gt; 与 &lt;strong&gt;OOM Killer&lt;/strong&gt; 为主线，结合 Docker / Kubernetes 的常见映射，把“限多少、什么时候开始回收、什么时候杀进程、怎么排”讲清楚。&lt;/p&gt;
&lt;h2 id="一先建立两层模型全局-oom-vs-cgroup-oom"&gt;&lt;a href="#%e4%b8%80%e5%85%88%e5%bb%ba%e7%ab%8b%e4%b8%a4%e5%b1%82%e6%a8%a1%e5%9e%8b%e5%85%a8%e5%b1%80-oom-vs-cgroup-oom" class="header-anchor"&gt;&lt;/a&gt;一、先建立两层模型：全局 OOM vs cgroup OOM
&lt;/h2&gt;&lt;p&gt;Linux 里至少要区分两种“内存不够”：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;典型触发&lt;/th&gt;
					&lt;th&gt;影响范围&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;全局内存压力&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;整机可用内存 + 可回收页不够，分配失败&lt;/td&gt;
					&lt;td&gt;OOM killer 在系统范围内按启发式选进程&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;cgroup 内存上限&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;某 cgroup 的 &lt;code&gt;memory.max&lt;/code&gt; 触顶且回收失败&lt;/td&gt;
					&lt;td&gt;OOM 只发生在该 cgroup 内（不会跨出该 cgroup 去杀别人）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这解释了一个常见错觉：&lt;strong&gt;给容器设了 &lt;code&gt;-m 512m&lt;/code&gt;，为什么还会拖垮宿主机？&lt;/strong&gt;&lt;br&gt;
因为：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;没设硬限制时，容器与宿主机共享整机内存；&lt;/li&gt;
&lt;li&gt;即使设了 limit，仍可能有内核开销、page cache 统计差异、swap 配置、以及 &lt;strong&gt;宿主级其他进程&lt;/strong&gt; 的压力；&lt;/li&gt;
&lt;li&gt;Docker 默认会尽量保护 daemon 自身，但 &lt;strong&gt;不会&lt;/strong&gt; 自动把所有容器都“隔离成绝对安全沙箱”。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因此工程上要同时看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进程/容器是否撞到了 &lt;strong&gt;自己的 limit&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;节点是否发生了 &lt;strong&gt;系统级 OOM / kubelet 驱逐&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二cgroup-v2-的内存阶梯min--low--high--max"&gt;&lt;a href="#%e4%ba%8ccgroup-v2-%e7%9a%84%e5%86%85%e5%ad%98%e9%98%b6%e6%a2%afmin--low--high--max" class="header-anchor"&gt;&lt;/a&gt;二、cgroup v2 的内存阶梯：min / low / high / max
&lt;/h2&gt;&lt;p&gt;cgroup v2 memory 控制器把控制面拆成“保护、限速、硬顶”几层。官方接口里最核心的是这些文件（单位均为字节）：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;接口&lt;/th&gt;
					&lt;th&gt;角色&lt;/th&gt;
					&lt;th&gt;关键语义&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;memory.current&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;观测&lt;/td&gt;
					&lt;td&gt;当前 cgroup 及其后代已用内存&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;memory.min&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;硬保护&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;在 effective min 内，内存&lt;strong&gt;不会被回收&lt;/strong&gt;；若系统没有其他可回收内存，可能直接触发 OOM&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;memory.low&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;尽力保护&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;在 effective low 内，尽量不被回收；只有无保护可回收内存时才可能被碰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;memory.high&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;节流线&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;超高后进程被 throttling，并承受很重的 direct reclaim；&lt;strong&gt;不会&lt;/strong&gt;因此调用 OOM killer&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;memory.max&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;硬上限&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;用量到顶且无法压回时，&lt;strong&gt;在该 cgroup 内调用 OOM killer&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;memory.oom.group&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;策略&lt;/td&gt;
					&lt;td&gt;设为 &lt;code&gt;1&lt;/code&gt; 时，把 cgroup 当不可分割工作负载：要么一起杀，要么都不杀（&lt;code&gt;oom_score_adj=-1000&lt;/code&gt; 的任务例外）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;memory.events&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;事件计数&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;high&lt;/code&gt; / &lt;code&gt;max&lt;/code&gt; / &lt;code&gt;oom&lt;/code&gt; / &lt;code&gt;oom_kill&lt;/code&gt; 等，是最好的“快撞墙”信号&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;memory.peak&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;峰值&lt;/td&gt;
					&lt;td&gt;自创建或重置以来的最大用量&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;可以把它理解成一条阶梯：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usage
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ memory.min ── 硬保护（尽量不回收；保护过猛可能反噬）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ memory.low ── 软保护（有余量时优先回收别人）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ memory.high ── 开始重压回收 + 节流（通常还不杀）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ memory.max ── 硬顶；回收失败 → cgroup OOM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="1-为什么要有-high而不是只设-max"&gt;&lt;a href="#1-%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e6%9c%89-high%e8%80%8c%e4%b8%8d%e6%98%af%e5%8f%aa%e8%ae%be-max" class="header-anchor"&gt;&lt;/a&gt;1. 为什么要有 &lt;code&gt;high&lt;/code&gt;，而不是只设 &lt;code&gt;max&lt;/code&gt;？
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;memory.max&lt;/code&gt; 是“悬崖”：到顶就可能杀进程。&lt;br&gt;
&lt;code&gt;memory.high&lt;/code&gt; 是“缓坡”：先让工作负载变慢、开始回收，给外部控制器（或人）反应时间。内核文档明确：&lt;code&gt;high&lt;/code&gt; 越界 &lt;strong&gt;never invokes the OOM killer&lt;/strong&gt;，极端情况下甚至可能被短暂突破。&lt;/p&gt;
&lt;p&gt;生产里更健康的模式往往是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;high&lt;/code&gt; 设在“可接受抖动”的水位；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max&lt;/code&gt; 设在“绝对不可越过”的水位；&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;memory.events&lt;/code&gt; 的 &lt;code&gt;high&lt;/code&gt;/&lt;code&gt;max&lt;/code&gt; 做告警，而不是等进程死了再看。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-minlow-保护不是免费的"&gt;&lt;a href="#2-minlow-%e4%bf%9d%e6%8a%a4%e4%b8%8d%e6%98%af%e5%85%8d%e8%b4%b9%e7%9a%84" class="header-anchor"&gt;&lt;/a&gt;2. &lt;code&gt;min&lt;/code&gt;/&lt;code&gt;low&lt;/code&gt; 保护不是免费的
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;memory.min&lt;/code&gt; 是硬保护：保护区内页面在“任何条件下”都不应被回收；如果系统已经没有未保护可回收内存，就可能 &lt;strong&gt;直接 OOM&lt;/strong&gt;。&lt;br&gt;
&lt;code&gt;memory.low&lt;/code&gt; 是 best-effort：优先保护，但仍可能在全局极端压力下被回收。&lt;/p&gt;
&lt;p&gt;因此：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保护值叠加超过父 cgroup/整机能力时，会发生 &lt;strong&gt;overcommit of protection&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;effective 边界还会受祖先 cgroup 限制；&lt;/li&gt;
&lt;li&gt;把所有关键服务都设成很高的 &lt;code&gt;min&lt;/code&gt;，等于在内存不够时更容易触发“保谁都保不住”的 OOM。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三oom-killer它到底怎么选人"&gt;&lt;a href="#%e4%b8%89oom-killer%e5%ae%83%e5%88%b0%e5%ba%95%e6%80%8e%e4%b9%88%e9%80%89%e4%ba%ba" class="header-anchor"&gt;&lt;/a&gt;三、OOM Killer：它到底怎么选人
&lt;/h2&gt;&lt;h3 id="1-评分oom_score-与-oom_score_adj"&gt;&lt;a href="#1-%e8%af%84%e5%88%86oom_score-%e4%b8%8e-oom_score_adj" class="header-anchor"&gt;&lt;/a&gt;1. 评分：&lt;code&gt;oom_score&lt;/code&gt; 与 &lt;code&gt;oom_score_adj&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;当内核决定必须杀进程腾内存时，会给候选任务打 badness 分。man-pages 对 &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/oom_score&lt;/code&gt; / &lt;code&gt;oom_score_adj&lt;/code&gt; 的说明可概括为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分数大致落在 &lt;strong&gt;0（几乎不杀）到 1000（优先杀）&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;主要依据是任务相对其 &lt;strong&gt;allowed memory&lt;/strong&gt; 的用量比例（RSS/swap 等估计）；&lt;/li&gt;
&lt;li&gt;用满允许内存 ≈ 1000，用一半 ≈ 500；&lt;/li&gt;
&lt;li&gt;root 进程额外获得约 &lt;strong&gt;3%&lt;/strong&gt; 的“更宽容”额度；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;oom_score_adj&lt;/code&gt; 范围 &lt;strong&gt;-1000 ~ +1000&lt;/strong&gt;，在启发式结果上再加减；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;oom_score_adj = -1000&lt;/code&gt; 表示 OOM 保护（基本不会被选中）&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;“allowed memory”取决于 OOM 上下文：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系统全局 OOM → 整机可分配资源；&lt;/li&gt;
&lt;li&gt;cgroup/limit 触顶 → 该 limit 本身；&lt;/li&gt;
&lt;li&gt;cpuset / mempolicy 节点耗尽 → 对应节点集合。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-系统级可调旋钮procsysvm"&gt;&lt;a href="#2-%e7%b3%bb%e7%bb%9f%e7%ba%a7%e5%8f%af%e8%b0%83%e6%97%8b%e9%92%aeprocsysvm" class="header-anchor"&gt;&lt;/a&gt;2. 系统级可调旋钮（&lt;code&gt;/proc/sys/vm/*&lt;/code&gt;）
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;参数&lt;/th&gt;
					&lt;th&gt;默认（文档）&lt;/th&gt;
					&lt;th&gt;作用&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;oom_dump_tasks&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;OOM 杀进程时是否打印系统任务摘要（pid/rss/oom_score_adj 等），便于事后定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;oom_kill_allocating_task&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0&lt;/code&gt;：扫描任务列表按启发式选“更该杀”的；&lt;code&gt;1&lt;/code&gt;：直接杀触发分配失败的那个任务（省扫描）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;panic_on_oom&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0&lt;/code&gt; 杀进程求生；&lt;code&gt;1&lt;/code&gt; 全局 OOM 可 panic（节点局部耗尽未必）；&lt;code&gt;2&lt;/code&gt; 连 memory cgroup OOM 也整机 panic&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;overcommit_memory&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0&lt;/code&gt; 启发式拒绝明显 overcommit；&lt;code&gt;1&lt;/code&gt; 几乎总是允许，直到真正用完；&lt;code&gt;2&lt;/code&gt; never overcommit 策略&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;大多数业务机保持默认即可；&lt;strong&gt;集群 failover / 取证&lt;/strong&gt; 场景才会认真考虑 &lt;code&gt;panic_on_oom&lt;/code&gt; + kdump。&lt;br&gt;
不要把 &lt;code&gt;oom_kill_allocating_task=1&lt;/code&gt; 当成“优化”随手打开：它可能杀掉“刚好申请最后一页”的 innocuous 任务，而放过真正的内存黑洞。&lt;/p&gt;
&lt;h3 id="3-cgroup-内-oom-的边界"&gt;&lt;a href="#3-cgroup-%e5%86%85-oom-%e7%9a%84%e8%be%b9%e7%95%8c" class="header-anchor"&gt;&lt;/a&gt;3. cgroup 内 OOM 的边界
&lt;/h3&gt;&lt;p&gt;cgroup v2 文档强调两点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;触达 &lt;code&gt;memory.max&lt;/code&gt; 且无法回收时，OOM killer &lt;strong&gt;在该 cgroup 内&lt;/strong&gt;被调用；&lt;/li&gt;
&lt;li&gt;一旦在某个 cgroup 触发 OOM，&lt;strong&gt;不会去杀该 cgroup 外的任务&lt;/strong&gt;（与祖先 &lt;code&gt;memory.oom.group&lt;/code&gt; 取值无关）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;memory.oom.group=1&lt;/code&gt; 适合“多进程必须同生共死”的工作负载（例如某个多 worker 服务希望要么整组重启，要么都不半残）。&lt;br&gt;
但要注意：被 &lt;code&gt;-1000&lt;/code&gt; 保护的任务仍是例外。&lt;/p&gt;
&lt;h2 id="四工程映射docker-与-kubernetes"&gt;&lt;a href="#%e5%9b%9b%e5%b7%a5%e7%a8%8b%e6%98%a0%e5%b0%84docker-%e4%b8%8e-kubernetes" class="header-anchor"&gt;&lt;/a&gt;四、工程映射：Docker 与 Kubernetes
&lt;/h2&gt;&lt;h3 id="1-docker把-limit-落到-cgroup"&gt;&lt;a href="#1-docker%e6%8a%8a-limit-%e8%90%bd%e5%88%b0-cgroup" class="header-anchor"&gt;&lt;/a&gt;1. Docker：把 limit 落到 cgroup
&lt;/h3&gt;&lt;p&gt;Docker 官方资源限制文档给出了与内存相关的关键选项：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 硬上限（最小允许约 6m）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d --name demo -m 512m your-image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 内存 + swap 总预算（细节依赖 --memory-swap 语义）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -m 512m --memory-swap 1g your-image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 软预留（争用时更“敏感”，不保证不越界）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -m 1g --memory-reservation 512m your-image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一般不要关 OOM killer；若关闭，必须同时设置 -m&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -m 512m --oom-kill-disable your-image
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-m/--memory&lt;/code&gt;&lt;/strong&gt;：容器可用内存上限；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--memory-reservation&lt;/code&gt;&lt;/strong&gt;：软限制，需小于 &lt;code&gt;--memory&lt;/code&gt;，争用时生效，&lt;strong&gt;不保证&lt;/strong&gt;永不越界；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--oom-kill-disable&lt;/code&gt;&lt;/strong&gt;：禁用容器内 OOM killer；文档要求 &lt;strong&gt;仅在同时设置了 &lt;code&gt;-m&lt;/code&gt; 时使用&lt;/strong&gt;，否则可能把压力转嫁给宿主机，拖垮整机；&lt;/li&gt;
&lt;li&gt;Docker daemon 会调整自身 OOM 优先级，降低“杀 daemon 导致全盘崩溃”的概率；&lt;strong&gt;容器进程默认没有这种优待&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-kubernetesrequest--limit--qos--驱逐"&gt;&lt;a href="#2-kubernetesrequest--limit--qos--%e9%a9%b1%e9%80%90" class="header-anchor"&gt;&lt;/a&gt;2. Kubernetes：request / limit / QoS / 驱逐
&lt;/h3&gt;&lt;p&gt;Kubernetes 文档把资源语义拆成两层：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;调度与预留&lt;/strong&gt;：&lt;code&gt;requests&lt;/code&gt; 供 &lt;code&gt;kube-scheduler&lt;/code&gt; 选型，kubelet 也会为容器预留至少 request 量；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运行时强制&lt;/strong&gt;：&lt;code&gt;limits&lt;/code&gt; 由 kubelet/容器运行时落到 cgroup；&lt;strong&gt;memory limit 由内核通过 OOM kill 强制&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;与 CPU 不同：CPU 超限通常是节流；&lt;strong&gt;内存超限更可能直接被内核杀掉&lt;/strong&gt;。文档也提醒：OOM 是 &lt;strong&gt;反应式&lt;/strong&gt; 的——容器可能短暂超过 limit，但在内核感知到压力后才被终止。&lt;/p&gt;
&lt;p&gt;QoS 类（Guaranteed / Burstable / BestEffort）主要影响 &lt;strong&gt;节点资源压力下的驱逐优先级&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;节点资源不足时，通常先考虑驱逐 &lt;strong&gt;BestEffort&lt;/strong&gt;，再 &lt;strong&gt;Burstable&lt;/strong&gt;，最后 &lt;strong&gt;Guaranteed&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;因资源压力驱逐时，候选对象通常是 &lt;strong&gt;超过 request&lt;/strong&gt; 的 Pod；&lt;/li&gt;
&lt;li&gt;Guaranteed（各容器 request=limit 且都 &amp;gt;0 的经典条件）最不容易被驱逐，但 &lt;strong&gt;不等于永远不被 OOM&lt;/strong&gt;：一旦超过自己的 memory limit，仍可能 &lt;code&gt;OOMKilled&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个可复现的排查入口：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl describe pod &amp;lt;pod&amp;gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -n &lt;span class="s1"&gt;&amp;#39;/Last State/,/Events/p&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 常见：Reason: OOMKilled, Exit Code: 137&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="五可复现观测别等-dmesg-再救火"&gt;&lt;a href="#%e4%ba%94%e5%8f%af%e5%a4%8d%e7%8e%b0%e8%a7%82%e6%b5%8b%e5%88%ab%e7%ad%89-dmesg-%e5%86%8d%e6%95%91%e7%81%ab" class="header-anchor"&gt;&lt;/a&gt;五、可复现观测：别等 dmesg 再救火
&lt;/h2&gt;&lt;h3 id="1-先确认-cgroup-v2-与容器路径"&gt;&lt;a href="#1-%e5%85%88%e7%a1%ae%e8%ae%a4-cgroup-v2-%e4%b8%8e%e5%ae%b9%e5%99%a8%e8%b7%af%e5%be%84" class="header-anchor"&gt;&lt;/a&gt;1. 先确认 cgroup v2 与容器路径
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 多数现代发行版默认 cgroup v2 统一层级&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount &lt;span class="p"&gt;|&lt;/span&gt; grep cgroup
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;stat -fc %T /sys/fs/cgroup
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 看某个进程属于哪个 cgroup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pidof java &lt;span class="p"&gt;|&lt;/span&gt; head -n1 &lt;span class="p"&gt;|&lt;/span&gt; xargs -I&lt;span class="o"&gt;{}&lt;/span&gt; cat /proc/&lt;span class="o"&gt;{}&lt;/span&gt;/cgroup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-读-memory-接口容器内或宿主机-cgroup-路径"&gt;&lt;a href="#2-%e8%af%bb-memory-%e6%8e%a5%e5%8f%a3%e5%ae%b9%e5%99%a8%e5%86%85%e6%88%96%e5%ae%bf%e4%b8%bb%e6%9c%ba-cgroup-%e8%b7%af%e5%be%84" class="header-anchor"&gt;&lt;/a&gt;2. 读 memory 接口（容器内或宿主机 cgroup 路径）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/sys/fs/cgroup &lt;span class="c1"&gt;# 或容器对应的子路径，如 /sys/fs/cgroup/system.slice/docker-&amp;lt;id&amp;gt;.scope&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="nv"&gt;$CG&lt;/span&gt;/memory.current
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="nv"&gt;$CG&lt;/span&gt;/memory.max
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="nv"&gt;$CG&lt;/span&gt;/memory.high
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="nv"&gt;$CG&lt;/span&gt;/memory.peak
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="nv"&gt;$CG&lt;/span&gt;/memory.events
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 关注：high / max / oom / oom_kill 是否持续上涨&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解释事件：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;code&gt;memory.events&lt;/code&gt; 字段&lt;/th&gt;
					&lt;th&gt;含义（工程视角）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;high&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;触碰 high 边界，被节流/强制回收的次数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;max&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;用量几乎要越过 max；若 direct reclaim 失败，将进入 OOM 状态&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;oom&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;已到 limit，分配即将失败&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;oom_kill&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;实际发生了 OOM kill&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="3-看谁更容易被杀"&gt;&lt;a href="#3-%e7%9c%8b%e8%b0%81%e6%9b%b4%e5%ae%b9%e6%98%93%e8%a2%ab%e6%9d%80" class="header-anchor"&gt;&lt;/a&gt;3. 看谁更容易被杀
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 分数越高越危险&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps -eo pid,user,comm,rss,oom_score,oom_score_adj --sort&lt;span class="o"&gt;=&lt;/span&gt;-oom_score &lt;span class="p"&gt;|&lt;/span&gt; head
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 某个关键守护进程是否被错误保护/错误牺牲&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /proc/&lt;span class="k"&gt;$(&lt;/span&gt;pidof dockerd&lt;span class="k"&gt;)&lt;/span&gt;/oom_score_adj
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-对照内核日志"&gt;&lt;a href="#4-%e5%af%b9%e7%85%a7%e5%86%85%e6%a0%b8%e6%97%a5%e5%bf%97" class="header-anchor"&gt;&lt;/a&gt;4. 对照内核日志
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dmesg -T &lt;span class="p"&gt;|&lt;/span&gt; egrep -i &lt;span class="s1"&gt;&amp;#39;out of memory|killed process|oom&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;journalctl -k -b --no-pager &lt;span class="p"&gt;|&lt;/span&gt; egrep -i &lt;span class="s1"&gt;&amp;#39;out of memory|killed process&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;若 &lt;code&gt;oom_dump_tasks=1&lt;/code&gt;（默认），日志里通常能看到候选任务的 rss、&lt;code&gt;oom_score_adj&lt;/code&gt; 等信息，用来回答“为什么杀的是 A 不是 B”。&lt;/p&gt;
&lt;h2 id="六常见坑与排查清单"&gt;&lt;a href="#%e5%85%ad%e5%b8%b8%e8%a7%81%e5%9d%91%e4%b8%8e%e6%8e%92%e6%9f%a5%e6%b8%85%e5%8d%95" class="header-anchor"&gt;&lt;/a&gt;六、常见坑与排查清单
&lt;/h2&gt;&lt;h3 id="坑-1只设-request不设-limit"&gt;&lt;a href="#%e5%9d%91-1%e5%8f%aa%e8%ae%be-request%e4%b8%8d%e8%ae%be-limit" class="header-anchor"&gt;&lt;/a&gt;坑 1：只设 request，不设 limit
&lt;/h3&gt;&lt;p&gt;调度时“看起来能放下”，运行时可以吃爆节点；最终变成 &lt;strong&gt;节点级压力 + 驱逐/全局 OOM&lt;/strong&gt;，故障面比单容器 OOM 更大。&lt;/p&gt;
&lt;h3 id="坑-2limit-设太紧没有-high-缓冲与观测"&gt;&lt;a href="#%e5%9d%91-2limit-%e8%ae%be%e5%a4%aa%e7%b4%a7%e6%b2%a1%e6%9c%89-high-%e7%bc%93%e5%86%b2%e4%b8%8e%e8%a7%82%e6%b5%8b" class="header-anchor"&gt;&lt;/a&gt;坑 2：limit 设太紧，没有 &lt;code&gt;high&lt;/code&gt; 缓冲与观测
&lt;/h3&gt;&lt;p&gt;应用启动峰值、JVM 堆外、page cache、临时解压都可能把 &lt;code&gt;current&lt;/code&gt; 顶到 &lt;code&gt;max&lt;/code&gt;。&lt;br&gt;
结果是频繁 &lt;code&gt;OOMKilled&lt;/code&gt; 重启，而不是平滑降速。优先补：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;真实峰值观测（&lt;code&gt;memory.peak&lt;/code&gt;、容器监控）；&lt;/li&gt;
&lt;li&gt;合理 limit；&lt;/li&gt;
&lt;li&gt;能用 high 水位告警就不要只用死亡事件告警。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="坑-3把-oom_score_adj-1000-到处贴"&gt;&lt;a href="#%e5%9d%91-3%e6%8a%8a-oom_score_adj-1000-%e5%88%b0%e5%a4%84%e8%b4%b4" class="header-anchor"&gt;&lt;/a&gt;坑 3：把 &lt;code&gt;oom_score_adj=-1000&lt;/code&gt; 到处贴
&lt;/h3&gt;&lt;p&gt;保护数据库/核心 agent 合理；若把内存泄漏服务也保护起来，OOM killer 只能去杀更无辜的进程，整机稳定性更差。&lt;/p&gt;
&lt;h3 id="坑-4--oom-kill-disable-却没有硬上限"&gt;&lt;a href="#%e5%9d%91-4--oom-kill-disable-%e5%8d%b4%e6%b2%a1%e6%9c%89%e7%a1%ac%e4%b8%8a%e9%99%90" class="header-anchor"&gt;&lt;/a&gt;坑 4：&lt;code&gt;--oom-kill-disable&lt;/code&gt; 却没有硬上限
&lt;/h3&gt;&lt;p&gt;Docker 文档明确警告：关 OOM killer 时必须配合 &lt;code&gt;-m&lt;/code&gt;。否则容器可把宿主内存吃穿。&lt;/p&gt;
&lt;h3 id="坑-5混淆kubelet-驱逐与cgroup-oom"&gt;&lt;a href="#%e5%9d%91-5%e6%b7%b7%e6%b7%86kubelet-%e9%a9%b1%e9%80%90%e4%b8%8ecgroup-oom" class="header-anchor"&gt;&lt;/a&gt;坑 5：混淆“kubelet 驱逐”与“cgroup OOM”
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;现象&lt;/th&gt;
					&lt;th&gt;更像&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Pod 事件里有 eviction、磁盘/内存 pressure&lt;/td&gt;
					&lt;td&gt;kubelet 驱逐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Container &lt;code&gt;Last State: OOMKilled&lt;/code&gt; / exit 137&lt;/td&gt;
					&lt;td&gt;cgroup/内核 OOM&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;宿主 &lt;code&gt;dmesg&lt;/code&gt; 出现 Killed process，且受害进程不一定是容器&lt;/td&gt;
					&lt;td&gt;全局 OOM 或选中了别的任务&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="坑-6用错内存用量口径"&gt;&lt;a href="#%e5%9d%91-6%e7%94%a8%e9%94%99%e5%86%85%e5%ad%98%e7%94%a8%e9%87%8f%e5%8f%a3%e5%be%84" class="header-anchor"&gt;&lt;/a&gt;坑 6：用错“内存用量”口径
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;RSS&lt;/code&gt;、cgroup &lt;code&gt;memory.current&lt;/code&gt;、容器运行时 working set、JVM heap used &lt;strong&gt;不是同一个数&lt;/strong&gt;。&lt;br&gt;
排 OOM 时以 &lt;strong&gt;cgroup 记账 + kernel 日志&lt;/strong&gt; 为准，再用进程级工具交叉验证。&lt;/p&gt;
&lt;h2 id="七一套可执行的生产建议"&gt;&lt;a href="#%e4%b8%83%e4%b8%80%e5%a5%97%e5%8f%af%e6%89%a7%e8%a1%8c%e7%9a%84%e7%94%9f%e4%ba%a7%e5%bb%ba%e8%ae%ae" class="header-anchor"&gt;&lt;/a&gt;七、一套可执行的生产建议
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;每个有状态/高风险服务都要有 memory limit&lt;/strong&gt;，并基于压测峰值留 20%–40% 余量（按语言运行时特性调整）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优先监控 &lt;code&gt;memory.events&lt;/code&gt; 与 working set 趋势&lt;/strong&gt;，把 &lt;code&gt;high/max&lt;/code&gt; 当预警，把 &lt;code&gt;oom_kill&lt;/code&gt; 当事故。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;K8s 上让关键链路尽量 Guaranteed 或至少 request≈实际稳态&lt;/strong&gt;；limit 不要拍脑袋抄 CPU 倍数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保护面要窄&lt;/strong&gt;：&lt;code&gt;-1000&lt;/code&gt; 只给真正的系统关键路径；业务进程靠 limit 与弹性，而不是全局免死金牌。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复盘时固定三件套&lt;/strong&gt;：&lt;code&gt;memory.current/max/events&lt;/code&gt; + &lt;code&gt;oom_score(_adj)&lt;/code&gt; + &lt;code&gt;dmesg/journal&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要默认改 &lt;code&gt;panic_on_oom&lt;/code&gt; / &lt;code&gt;oom_kill_allocating_task&lt;/code&gt;&lt;/strong&gt;，除非你清楚故障域与取证目标。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="八总结"&gt;&lt;a href="#%e5%85%ab%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;八、总结
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;cgroup v2 用 &lt;code&gt;min/low/high/max&lt;/code&gt; 把内存控制从“一刀切 hard cap”扩展成“保护 + 节流 + 硬顶”。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;high&lt;/code&gt; 负责让系统先变慢并回收；&lt;code&gt;max&lt;/code&gt; 才是 OOM 悬崖。&lt;/li&gt;
&lt;li&gt;OOM killer 按 badness/&lt;code&gt;oom_score_adj&lt;/code&gt; 选人；cgroup OOM 默认 &lt;strong&gt;杀在组内&lt;/strong&gt;，&lt;code&gt;memory.oom.group&lt;/code&gt; 可改变是否整组同生共死。&lt;/li&gt;
&lt;li&gt;Docker 的 &lt;code&gt;-m&lt;/code&gt;、K8s 的 &lt;code&gt;limits.memory&lt;/code&gt; 最终都落到内核 cgroup；&lt;strong&gt;CPU 超限多半被节流，内存超限更可能被杀&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;可观测性的关键不是“死了没有”，而是 &lt;strong&gt;&lt;code&gt;memory.events&lt;/code&gt; 是否在反复逼近上限&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;把内存限制当成“开关”只会得到随机的 137；把它当成“阶梯 + 评分 + 事件流”，才能在容器化环境里稳定控风险。&lt;/p&gt;
&lt;h2 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Linux Kernel Docs — &lt;em&gt;Control Group v2&lt;/em&gt;（&lt;code&gt;memory.current&lt;/code&gt; / &lt;code&gt;min&lt;/code&gt; / &lt;code&gt;low&lt;/code&gt; / &lt;code&gt;high&lt;/code&gt; / &lt;code&gt;max&lt;/code&gt; / &lt;code&gt;oom.group&lt;/code&gt; / &lt;code&gt;events&lt;/code&gt;）: &lt;a class="link" href="https://docs.kernel.org/admin-guide/cgroup-v2.html" target="_blank" rel="noopener"
 &gt;https://docs.kernel.org/admin-guide/cgroup-v2.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Linux Kernel Docs — &lt;em&gt;Documentation for /proc/sys/vm/&lt;/em&gt;（&lt;code&gt;oom_dump_tasks&lt;/code&gt;、&lt;code&gt;oom_kill_allocating_task&lt;/code&gt;、&lt;code&gt;panic_on_oom&lt;/code&gt;、&lt;code&gt;overcommit_memory&lt;/code&gt;、&lt;code&gt;swappiness&lt;/code&gt;）: &lt;a class="link" href="https://docs.kernel.org/admin-guide/sysctl/vm.html" target="_blank" rel="noopener"
 &gt;https://docs.kernel.org/admin-guide/sysctl/vm.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;man-pages — &lt;code&gt;proc_pid_oom_score(5)&lt;/code&gt;: &lt;a class="link" href="https://man7.org/linux/man-pages/man5/proc_pid_oom_score.5.html" target="_blank" rel="noopener"
 &gt;https://man7.org/linux/man-pages/man5/proc_pid_oom_score.5.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;man-pages — &lt;code&gt;proc_pid_oom_score_adj(5)&lt;/code&gt;: &lt;a class="link" href="https://man7.org/linux/man-pages/man5/proc_pid_oom_score_adj.5.html" target="_blank" rel="noopener"
 &gt;https://man7.org/linux/man-pages/man5/proc_pid_oom_score_adj.5.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Docker Docs — &lt;em&gt;Resource constraints&lt;/em&gt;（memory options、OOME、&lt;code&gt;--oom-kill-disable&lt;/code&gt;）: &lt;a class="link" href="https://docs.docker.com/engine/containers/resource_constraints/" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/engine/containers/resource_constraints/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes Docs — &lt;em&gt;Resource Management for Pods and Containers&lt;/em&gt;: &lt;a class="link" href="https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/" target="_blank" rel="noopener"
 &gt;https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes Docs — &lt;em&gt;Pod Quality of Service Classes&lt;/em&gt;: &lt;a class="link" href="https://kubernetes.io/docs/concepts/workloads/pods/pod-qos/" target="_blank" rel="noopener"
 &gt;https://kubernetes.io/docs/concepts/workloads/pods/pod-qos/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>