清理僵尸进程

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. 找到父进程是什么
# 假设上一步发现父进程 PID 是 12345
ps -p 12345 -o pid,comm,cmd
  1. 根据父进程类型采取行动
父进程类型   处理方式
业务容器进程(如 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) 极少见,需要重启节点
  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时间、状态(R/S/D)、优先级、nice值。是top/ps的数据源。
schedstat   CPU调度统计,含等待CPU的时间(run_delay),可判断是否CPU饥饿。
sched   调度策略与优先级详情。
task/   进程内各线程信息,每个线程子目录内同样有stat、sched。
  1. 排查内存泄漏、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  动态清零内存统计,用于测量增量内存变化。
  1. 排查文件描述符耗尽 (too many open files)
文件  关注原因
fd/ 直接看。ls -l fd/ 可见当前打开的所有文件描述符。数量超 limits 会报错。
fdinfo/ 每个fd的详细信息(文件位置、flags、事件)。
limits  你刚才看了,确认Max open files软硬限制。
cwd 当前工作目录(可能阻止umount)。
root    根目录(chroot场景)。
  1. 排查进程卡死、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需要关注。
  1. 排查参数/配置/资源限制
文件  关注原因
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杀手的优先级。
  1. 快速诊断(日常运维常用)
文件  一句话用途
status  一次看状态、内存、线程、FD配额、Capabilities。
stat    快速得CPU时间、nice、优先级、进程状态。
fd/ + limits    解决“too many open files”。
smaps   解决内存泄漏、PSS高。
stack   解决D状态卡死、内核阻塞。
cgroup  容器/限流问题。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容