清理僵尸進程

ps aux | awk '{print $8}' | grep -c Z
678

678 個僵尸進程的緊急處理

  1. 先確認是誰"生"了這些僵尸
# 查看僵尸進程的父進程 PID 分布
ps -e -o ppid,stat | grep Z | awk '{print $1}' | sort | uniq -c | sort -rn

  600 12345
   78 67890

第一列是數量,第二列是父進程 PID。數量最多的那個父進程就是罪魁禍首。

  1. 找到父進程是什么
# 假設上一步發(fā)現父進程 PID 是 12345
ps -p 12345 -o pid,comm,cmd
  1. 根據父進程類型采取行動
父進程類型   處理方式
業(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é)點
  1. 如果不能重啟進程,強制回收僵尸
    僵尸進程無法被 kill -9(因為已經死了),只能殺死或重啟它們的父進程。
# 殺死父進程(謹慎!確認不是 kubelet/systemd 等關鍵進程)
kill -TERM <父進程PID>
# 如果不行
kill -KILL <父進程PID>
  1. 快速定位并打印需要殺死的父進程
# 一條命令:找出產生僵尸最多的父進程 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),根據不同排查場景,以下幾類文件需要重點關注:

  1. 排查高負載、卡頓、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。
  1. 排查內存泄漏、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)清零內存統計,用于測量增量內存變化。
  1. 排查文件描述符耗盡 (too many open files)
文件  關注原因
fd/ 直接看。ls -l fd/ 可見當前打開的所有文件描述符。數量超 limits 會報錯。
fdinfo/ 每個fd的詳細信息(文件位置、flags、事件)。
limits  你剛才看了,確認Max open files軟硬限制。
cwd 當前工作目錄(可能阻止umount)。
root    根目錄(chroot場景)。
  1. 排查進程卡死、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需要關注。
  1. 排查參數/配置/資源限制
文件  關注原因
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)先級。
  1. 快速診斷(日常運維常用)
文件  一句話用途
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  容器/限流問題。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容