ps aux | awk '{print $8}' | grep -c Z
678
678 個僵尸進程的緊急處理
- 先確認是誰"生"了這些僵尸
# 查看僵尸進程的父進程 PID 分布
ps -e -o ppid,stat | grep Z | awk '{print $1}' | sort | uniq -c | sort -rn
600 12345
78 67890
第一列是數量,第二列是父進程 PID。數量最多的那個父進程就是罪魁禍首。
- 找到父進程是什么
# 假設上一步發(fā)現父進程 PID 是 12345
ps -p 12345 -o pid,comm,cmd
- 根據父進程類型采取行動
父進程類型 處理方式
業(yè)務容器進程(如 java、python、node) 重啟該 Pod:kubectl delete pod <pod名> -n <命名空間>
containerd-shim 或 docker-containerd 重啟 containerd:systemctl restart containerd(會影響節(jié)點上所有容器)
kubelet 重啟 kubelet:systemctl restart kubelet(相對安全,Pod 會重建)
systemd (PID 1) 極少見,需要重啟節(jié)點
- 如果不能重啟進程,強制回收僵尸
僵尸進程無法被 kill -9(因為已經死了),只能殺死或重啟它們的父進程。
# 殺死父進程(謹慎!確認不是 kubelet/systemd 等關鍵進程)
kill -TERM <父進程PID>
# 如果不行
kill -KILL <父進程PID>
- 快速定位并打印需要殺死的父進程
# 一條命令:找出產生僵尸最多的父進程 PID
ps -e -o ppid,stat | grep Z | awk '{print $1}' | sort | uniq -c | sort -rn | head -1 | awk '{print $2}'
拿到這個 PID 后,確認它是什么:
ps -p <那個PID> -o pid,comm,cmd
在 /proc/[pid] 目錄下(你列出的 PID 2630184),根據不同排查場景,以下幾類文件需要重點關注:
- 排查高負載、卡頓、CPU問題
文件 關注原因
stat 進程CPU時間、狀態(tài)(R/S/D)、優(yōu)先級、nice值。是top/ps的數據源。
schedstat CPU調度統計,含等待CPU的時間(run_delay),可判斷是否CPU饑餓。
sched 調度策略與優(yōu)先級詳情。
task/ 進程內各線程信息,每個線程子目錄內同樣有stat、sched。
- 排查內存泄漏、OOM、內存占用高
文件 關注原因
smaps 最重要。每段內存映射的詳細分布:PSS、RSS、臟頁、匿名內存。定位內存泄漏。
smaps_rollup 匯總版,直接給出PSS/RSS/USS/PSS_Anon。
statm 簡潔版內存統計:大小、駐留、共享、文本、庫、數據、臟頁。
maps 內存映射布局(共享庫、heap、stack、mmap)。
numa_maps NUMA節(jié)點上的內存分布,多核系統排查跨節(jié)點訪問。
oom_score & oom_score_adj 進程被OOM Killer殺死的風險分數。值越高越容易被殺。
clear_refs 動態(tài)清零內存統計,用于測量增量內存變化。
- 排查文件描述符耗盡 (too many open files)
文件 關注原因
fd/ 直接看。ls -l fd/ 可見當前打開的所有文件描述符。數量超 limits 會報錯。
fdinfo/ 每個fd的詳細信息(文件位置、flags、事件)。
limits 你剛才看了,確認Max open files軟硬限制。
cwd 當前工作目錄(可能阻止umount)。
root 根目錄(chroot場景)。
- 排查進程卡死、D狀態(tài)、僵尸、掛起
文件 關注原因
stack 內核調用棧。進程卡在不可中斷(D)狀態(tài)時,看stack找到在內核哪里阻塞(如磁盤I/O、fuse、NFS)。
wchan 進程等待的內核函數名稱。非0表示在等某個內核事件。
syscall 當前正在執(zhí)行的系統調用(如果在內核態(tài))。
status 易讀的匯總:State、Tgid、FDSize、VmRSS、Threads、Capabilities。
stat (state列) R(運行) / S(睡眠) / D(不可中斷) / Z(僵尸) / T(停止)。D或Z需要關注。
- 排查參數/配置/資源限制
文件 關注原因
limits 你已看過。確認open files、stack size、core size、memlock。
cmdline 啟動命令行參數(是否帶了異常配置)。
environ 環(huán)境變量(包含LD_PRELOAD、JAVA_OPTS等)。
cgroup 進程所屬cgroup,是否受cpu/memory限制(容器內常用)。
cpuset 綁定的CPU核心。
oom_adj / oom_score_adj 調整OOM殺手的優(yōu)先級。
- 快速診斷(日常運維常用)
文件 一句話用途
status 一次看狀態(tài)、內存、線程、FD配額、Capabilities。
stat 快速得CPU時間、nice、優(yōu)先級、進程狀態(tài)。
fd/ + limits 解決“too many open files”。
smaps 解決內存泄漏、PSS高。
stack 解決D狀態(tài)卡死、內核阻塞。
cgroup 容器/限流問題。