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。数量最多的那个父进程就是罪魁祸首。
- 找到父进程是什么
# 假设上一步发现父进程 PID 是 12345
ps -p 12345 -o pid,comm,cmd
- 根据父进程类型采取行动
父进程类型 处理方式
业务容器进程(如 java、python、node) 重启该 Pod:kubectl delete pod <pod名> -n <命名空间>
containerd-shim 或 docker-containerd 重启 containerd:systemctl restart containerd(会影响节点上所有容器)
kubelet 重启 kubelet:systemctl restart kubelet(相对安全,Pod 会重建)
systemd (PID 1) 极少见,需要重启节点
- 如果不能重启进程,强制回收僵尸
僵尸进程无法被 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时间、状态(R/S/D)、优先级、nice值。是top/ps的数据源。
schedstat CPU调度统计,含等待CPU的时间(run_delay),可判断是否CPU饥饿。
sched 调度策略与优先级详情。
task/ 进程内各线程信息,每个线程子目录内同样有stat、sched。
- 排查内存泄漏、OOM、内存占用高
文件 关注原因
smaps 最重要。每段内存映射的详细分布:PSS、RSS、脏页、匿名内存。定位内存泄漏。
smaps_rollup 汇总版,直接给出PSS/RSS/USS/PSS_Anon。
statm 简洁版内存统计:大小、驻留、共享、文本、库、数据、脏页。
maps 内存映射布局(共享库、heap、stack、mmap)。
numa_maps NUMA节点上的内存分布,多核系统排查跨节点访问。
oom_score & oom_score_adj 进程被OOM Killer杀死的风险分数。值越高越容易被杀。
clear_refs 动态清零内存统计,用于测量增量内存变化。
- 排查文件描述符耗尽 (too many open files)
文件 关注原因
fd/ 直接看。ls -l fd/ 可见当前打开的所有文件描述符。数量超 limits 会报错。
fdinfo/ 每个fd的详细信息(文件位置、flags、事件)。
limits 你刚才看了,确认Max open files软硬限制。
cwd 当前工作目录(可能阻止umount)。
root 根目录(chroot场景)。
- 排查进程卡死、D状态、僵尸、挂起
文件 关注原因
stack 内核调用栈。进程卡在不可中断(D)状态时,看stack找到在内核哪里阻塞(如磁盘I/O、fuse、NFS)。
wchan 进程等待的内核函数名称。非0表示在等某个内核事件。
syscall 当前正在执行的系统调用(如果在内核态)。
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 环境变量(包含LD_PRELOAD、JAVA_OPTS等)。
cgroup 进程所属cgroup,是否受cpu/memory限制(容器内常用)。
cpuset 绑定的CPU核心。
oom_adj / oom_score_adj 调整OOM杀手的优先级。
- 快速诊断(日常运维常用)
文件 一句话用途
status 一次看状态、内存、线程、FD配额、Capabilities。
stat 快速得CPU时间、nice、优先级、进程状态。
fd/ + limits 解决“too many open files”。
smaps 解决内存泄漏、PSS高。
stack 解决D状态卡死、内核阻塞。
cgroup 容器/限流问题。