journalctl 不主动监控资源耗尽,而是通过读取内核、systemd-oomd、cgroup 等产生的结构化日志来发现和定位内存、cpu、磁盘等资源临界状态,关键信号包括 oom 杀进程记录、systemd-oomd 压力预警、/proc/pressure/memory 指标及磁盘空间耗尽日志,并需配置持久化存储和正确查询方式。

journalctl 本身不主动监控资源耗尽,而是帮你发现、定位和响应系统资源(内存、CPU、磁盘、压力指标)濒临或已达临界点时留下的关键日志痕迹。真正起作用的是内核、systemd 组件(如 systemd-oomd)、cgroup 压力接口等产生的结构化日志,journalctl 是你读取它们的“放大镜”。
? 关键路径:哪些日志能反映资源耗尽?
不是所有“资源紧张”都会写日志,但以下几类是真实、可查、有预警价值的关键信号源:
-
内核 OOM 杀进程记录
这是内存彻底耗尽后的最终动作,日志在内核环缓冲区,由journald自动采集:- 关键词:
Out of memory,Killed process,oom_kill_process,memory: exhausted - 正确查询方式:
sudo journalctl -k -f | grep -i -E "out.of.memory|Killed process|oom_kill_process"
- 关键词:
-
systemd-oomd 的压力预警(最实用的“前兆”)
它基于 PSI(Pressure Stall Information)持续监测内存压力,在真正 OOM 前发出notice级日志:- 示例日志:
Notice: Memory pressure on /sys/fs/cgroup/system.slice high (10s avg: 92%) - 实时跟踪:
journalctl -u systemd-oomd -p notice -f
- ✅ 前提:确保已启用
sudo systemctl enable --now systemd-oomd
- 示例日志:
-
/proc/pressure/memory 的压力指标(非日志,但必须配合看)
虽然它不产生 journal 日志,但它是systemd-oomd和内核判断的依据,需同步监控:watch -n 1 'cat /proc/pressure/memory | grep -E "some|full"'
- 当
some avg10 > 10或full avg10 > 0.5持续出现,OOM 很可能在几分钟内发生。
- 当
-
磁盘空间耗尽相关日志(常被忽略)
内核或服务(如rsyslog,journald自身)会在No space left on device时记录warning或err:- 可查关键词:
journalctl -p warning..err --since "24 hours ago" | grep -i "no space\|disk full\|write error"
- 可查关键词:
⚙️ 让这些日志真正可用:三步基础配置
没有合理配置,关键日志可能被丢弃或查不到:
-
开启持久化存储
编辑/etc/systemd/journald.conf:[Journal] Storage=persistent Compress=yes MaxRetentionSec=4week SystemMaxUse=1G
然后创建目录并重启:
sudo mkdir -p /var/log/journal && sudo systemctl restart systemd-journald -
确保 systemd-oomd 已启用且运行
systemctl is-active systemd-oomd # 应返回 active systemctl status systemd-oomd # 查看是否加载了自定义配置(如 PressureLimit)
避免日志级别过滤误杀关键信息
-p notice不会捕获 OOM 日志(它们多为info/notice,但关键词比级别更可靠);
别依赖单一优先级,用-k+grep组合才是查 OOM 的黄金标准。
? 实用命令速查(复制即用)
| 场景 | 命令 |
|---|---|
| 实时盯住 OOM 杀进程信号 | sudo journalctl -k -f \| grep -i -E "out.of.memory\|Killed process" |
| 实时看 systemd-oomd 预警 | journalctl -u systemd-oomd -p notice -f |
| 查最近 1 小时磁盘满相关错误 | journalctl -p err..warning --since "1 hour ago" \| grep -i "no space\|disk full" |
| 同时看 nginx + oomd + 内核压力日志(调试期) | journalctl -u nginx -u systemd-oomd -k -p notice..err -f |
不复杂但容易忽略:日志有价值的前提,是它被记录下来、没被清掉、并且你能用对方式捞出来。











