--oom-score-adj 用于调整容器进程被 OOM Killer 杀死的优先级,数值越低越不易被杀,但必须配合 --memory 才生效;默认值为 0,-500 适合核心服务,-1000 需特权且慎用。
直接用 --oom-score-adj 控制容器被内核 oom killer 杀死的难易程度,数值越低越不容易被杀,但必须配合 --memory 才真正生效。
理解 oom-score-adj 的作用逻辑
Linux 内核在内存耗尽时,会根据每个进程的 oom_score_adj 值决定“先杀谁”。Docker 容器里主进程(PID 1)的该值默认为 0,和宿主机普通进程一样。你调低它,就是告诉内核:“这个容器很重要,请尽量别动它”;调高它,则是主动让出生存优先级。
注意:oom_score_adj 不是独立开关,它不控制是否触发 OOM,只影响“杀谁”的顺序。没有 --memory 限制,内核根本不会启动 OOM Killer,这个参数也就没意义。
常用取值与对应场景
- -500:适合数据库、核心 API 等关键服务,显著降低被终止概率,推荐生产环境主力服务使用
- 0:默认值,无额外保护,适用于一般业务容器
- +300~+500:适合日志收集、数据导出、定时批处理等临时性任务,内存紧张时优先回收
-
-1000:完全豁免 OOM Killer —— 仅限特权容器(
--privileged),且需内核开启CONFIG_OOM_DISABLE,慎用
正确配置示例与验证方法
启动一个受保护的 Redis 容器:
docker run -d \ --name redis-prod \ --memory=2g \ --oom-score-adj=-500 \ redis:7-alpine
验证是否生效:
docker exec redis-prod cat /proc/1/oom_score_adj
应返回 -500。若返回 0 或其他值,说明参数未被识别(常见于 Docker 版本低于 20.10)或未配 --memory。
容易踩的坑
- 单独设置
--oom-score-adj却不设--memory:参数被忽略,容器仍可能因系统级 OOM 被杀 - 设了
--oom-score-adj=-1000但没加--privileged:启动失败或值被截断为 -999 - 混淆
--oom-score-adj和--oom-kill-disable:后者是全局禁用 OOM Killer(也需特权),风险极高,不推荐替代优先级调整 - 忽略宿主机 swap 配置:若
--memory-swap未显式设置,Docker 默认禁用 swap,可能导致内存压力更早触发 OOM











