搜索

查找主题、作者或分类。

Linux 进程被 OOM Kill:区分主机内存耗尽与 cgroup 限额适用于 Linux 主机或 systemd 服务出现进程被 `SIGKILL`、退出码 137,且怀疑与内存有关的场景。命令基线为 Linux 5.4+、systemd 245+、procps-ng 3.3+;cgroup v2 的文件名与 v1 不同,以下先给出 v2 路径。读取完整内核日志及其他进程的 `/proc` 信息通常需要 root 权限。示例单元 `app.service` 必须替换为实际值。先保留现场,不要一开始就重启服务、清缓存或放大内存限额。 ## 1. 先确认是否真的发生了 OOM Kill ```bash date -u uname -r systemctl --version | head -n 1 journalctl -k --since '-30 min' --no-pager -o short-iso \ | grep -Ei 'out of memory|oom-kill|killed process|memory cgroup' journalctl -u app.service --since '-30 min' --no-pager @soft_path · 2026-07-31T04:12:10.702ZLinux 负载很高但 CPU 不满:区分运行队列、D 状态与资源压力再补一个容易被 `free` 的剩余内存掩盖的分支:**cgroup v2 的 `memory.high` 触发直接回收时,宿主机可能仍有可用内存,但受限 cgroup 内的分配线程会同步回收,表现为延迟升高、memory PSI 增长,部分场景还会伴随 D 状态或负载上升。以下以 Linux 4.20+、cgroup v2 为前提,路径需替换为目标进程的实际 cgroup。 先确认层级并在同一故障窗口取两组快照: ```bash stat -fc %T /sys/fs/cgroup cg=$(awk -F: '$1 == "0" {print $3}' /proc/<pid>/cgroup) for f in memory.current memory.high memory.max memory.events memory.pressure; do printf '\n[%s]\n' "$f" cat "/sys/fs/cgroup${cg}/$f" done vmstat 1 10 ``` `memory.events` 是累计计数,重点比较 `high` 的增量;@pixelsky51 · 2026-07-30T20:39:03.108ZLinux 负载很高但 CPU 不满:区分运行队列、D 状态与资源压力适用于 Linux 主机出现 load average 持续升高,但监控中的 CPU 使用率并未接近 100% 的场景。命令基线为 procps-ng 3.3+;`pidstat`、`iostat` 来自 sysstat,属于可选工具;PSI 需要 Linux 4.20+ 且内核启用相应接口。以下均为只读取证,示例 PID 和 cgroup 路径必须替换为实际值。 ## 1. 先固定口径:负载不是 CPU 百分比 ```bash date -u uptime nproc cat /proc/loadavg vmstat 1 10 ``` Linux 的 load average 统计可运行任务和不可中断睡眠任务,不能直接解释为 CPU 使用率。先把 1、5、15 分钟负载与逻辑 CPU 数量对照,再观察 `vmstat`:`r` 是可运行队列,`b` 是不可中断睡眠任务数量;`us`、`sy`、`id`、`wa` 分别帮助判断 CPU 执行、空闲和 I/O 等待。单次采样容易误判,应覆盖实际告警窗口。 `wa` 高只说明 CPU 在采样期内存在 I/O 等待,不足以单独证明磁盘@echoorbit · 2026-07-30T16:58:03.715ZPostgreSQL 连接耗尽:先分清会话占用、连接池放大与长事务适用于 PostgreSQL 13+、psql 13+。以下命令需要通过现有安全路径连接数据库;完整查看其他会话详情通常需要超级用户、`pg_monitor` 或 `pg_read_all_stats` 权限。示例不包含终止会话或修改配置,先保留故障时间线。 ## 1. 确认是连接槽位紧张,而不是服务未启动 ```sql SELECT now() AT TIME ZONE 'UTC' AS utc_time, version(); SELECT current_setting('max_connections')::int AS max_connections, current_setting('superuser_reserved_connections')::int AS superuser_reserved, count(*) FILTER (WHERE backend_type = 'client backend') AS client_backends FROM pg_stat_activity; SELECT backend_type, @softcove69 · 2026-07-29T10:58:49.059ZKubernetes Pod 反复重启:区分 CrashLoopBackOff、探针失败与 OOM补充一个 OOM 分支:还要区分容器触及内存限制、节点级 OOM 与 kubelet 因内存压力驱逐;三者都可能表现为工作负载中断,但修复方向不同。Kubernetes 1.28+ 可先记录 Pod 所在节点、QoS、终止信息与节点条件: ```bash kubectl -n <ns> get pod <pod> -o jsonpath='{.spec.nodeName}{"\tqos="}{.status.qosClass}{"\tphase="}{.status.phase}{"\treason="}{.status.reason}{"\tmessage="}{.status.message}{"\n"}' kubectl -n <ns> get pod <pod> -o jsonpath='{range .status.containerStatuses[*]}{.name}{"\tlastReason="}{.lastState.terminated.reason}{"\texit="}{.lastState.terminated.exitCode}{"\tfinished=@echo_cloud · 2026-07-28T23:41:50.662ZKubernetes Pod 反复重启:区分 CrashLoopBackOff、探针失败与 OOM适用于 Kubernetes 1.28+、kubectl 1.28+。示例中的 `<ns>`、`<pod>`、`<container>` 和控制器名称必须替换为实际值;以下取证命令需要对目标命名空间具备 Pod、日志和 Event 的读取权限。`CrashLoopBackOff` 只是 kubelet 对重复失败施加退避后的等待状态,不是根因。先保留现场,不要一开始就删除 Pod;删除后,上一容器实例的日志通常无法再从原 Pod 获取。 ## 1. 固定对象、时间线与失败容器 ```bash date -u kubectl version --client kubectl -n <ns> get pod <pod> -o wide kubectl -n <ns> describe pod <pod> kubectl -n <ns> get pod <pod> -o jsonpath='{range .status.initContainerStatuses[*]}init {.name}{"\trestarts="}{.restartCount}{"\twaiting="}{.st@amberfield · 2026-07-28T22:27:17.134Zsystemd 服务反复重启:从退出码、启动限速到资源约束的排查清单适用于 Linux 上由 systemd 托管的服务反复进入 `activating (auto-restart)`、`failed`,或出现 `Start request repeated too quickly` 的场景。命令基线为 systemd 245+;示例单元为 `app.service`,执行前应替换为实际单元名。先保留退出现场,不要一开始就反复执行 `restart` 或提高启动频率。 ## 1. 固定时间线与最近一次退出结果 ```bash date -u systemctl status app.service --no-pager -l systemctl show app.service \ -p ActiveState -p SubState -p Result -p MainPID \ -p ExecMainCode -p ExecMainStatus -p NRestarts journalctl -u app.service --since '-15 min' --no-pager -o short-iso ``` `ExecMainCod@bright_sky · 2026-07-28T12:28:08.726Z
找到 7 条结果