「杀不掉的」僵尸(zombie)进程

淘仇恕(张云开)

感谢淘宝内核组的帮助,Google Drive原文

Linux的进程,有以下几种状态(摘自本文):

State

Description

D

Uninterruptible sleep (usually IO)

R

Running or runnable (on run queue)

S

Interruptible sleep (waiting for an event to complete)

T

Stopped, either by a job control signal or because it is being traced.

W

Paging (not valid since the 2.6.xx kernel)

X

Dead (should never be seen)

Z

Defunct ("zombie") process, terminated but not reaped by its parent.

当一个进程处于Z状态,我们称之为zombie进程,如下所示:

#top -b -p 56249
 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                          
56249 ats       20   0     0    0    0 Z  0.0  0.0   5914:36 [ET_NET 0] <defunct>

正常情况下,处于zombie状态的进程,会很快地被它的父进程回收,以致于我们根本不会注意到zombie进程的存在。可在实践过程中,却有一些无法使用kill -9命令杀掉的zombie进程,这常常令我们束手无策。

如果某个进程一直处于zombie状态,可能会带来一些严重的问题,例如,假设这个进程没有正确地close掉socket,就会导致这些socket处于close_wait状态,这些socket将会占用系统的ip/port资源,将导致其他程序无法创建特定socket。

当出现「杀不掉」的zombie进程,我们常常归咎于kernel的bug,不了了之,但其实还有一种情况常常被忽略。让我们看看上面的这个zombie进程内部,是否还有其他线程(使用top命令的-H参数):

#top -b -H -p 56249
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                         
56249 ats       20   0     0    0    0 Z  0.0  0.0 253:54.05 [ET_NET 0] <defunct>                                                                            
56337 ats       20   0     0    0    0 D  0.0  0.0  38:53.67 [ET_AIO 0]                                                                                      
56338 ats       20   0     0    0    0 D  0.0  0.0  38:48.24 [ET_AIO 1]

由上图可见,虽然[ET_NET 0](pid=56249)进程处于zombie状态,但它其实是一个多线程的程序,该程序中的其他线程,如[ET_AIO 0](pid=56337)等,处于D(Uninterruptible sleep)状态,因为D状态的进程(在Linux中,线程只是特殊的进程)无法被中断,因此kill -9无法杀掉D状态的进程。也正因为这些D状态的进程的存在,导致父进程无法顺利的回收它们。

通常,我们还需要分析处于D状态的进程卡在了哪里。可通过/proc文件系统查看D状态进程的调用栈:

#cat /proc/56337/stack
[<ffffffff811b372e>] __blockdev_direct_IO_newtrunc+0x6fe/0xb90
[<ffffffff811b3c1e>] __blockdev_direct_IO+0x5e/0xd0
[<ffffffff811b1317>] blkdev_direct_IO+0x57/0x60
[<ffffffff81113543>] generic_file_aio_read+0x793/0x870
[<ffffffff81177c3a>] do_sync_read+0xfa/0x140
[<ffffffff81178635>] vfs_read+0xb5/0x1a0
[<ffffffff81178962>] sys_pread64+0x82/0xa0
[<ffffffff8100b0f2>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

由上图可见,该进程卡在了磁盘的read操作中,很可能是磁盘坏了。

「杀不掉的」僵尸(zombie)进程相关推荐

  1. 如何查找僵尸进程并Kill之,杀不掉的要查看父进程并杀之

    用ps和grep命令寻找僵尸进程 #ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 命令注解: -A 参数列出所有进程 -o 自定义输出字段 我们设定显示字段为 ...

  2. mysql 僵尸进程_如何查找僵尸进程并Kill之,杀不掉的要查看父进程并杀之

    用ps和grep命令寻找僵尸进程 #ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 命令注解: -A 参数列出所有进程 -o 自定义输出字段 我们设定显示字段为 ...

  3. Android 手机运存越来越大,为什么后台应用还是会被「杀」?

    不知不觉间 Android 陷入了一个关于「后台」的怪圈:一边各大厂商陆续推出了 12G RAM 的手机,另一边你刚刚放到后台的下载任务没有如预期那样后台挂机下载,打开微信发现还得陪启动画面的孤独小人 ...

  4. 阿里女员工遭遇「杀猪盘」背后的思考

    昨天还是情人节,这边朋友圈的狗粮撒满了一地,那边网上就爆出了12位阿里女员工遭遇了情感「杀猪盘」,被一个初中学历的骗财骗色,累计被骗了 1940 万人民币,外加100多万美元. 杀猪盘听得多了,但这事 ...

  5. iOS13.2频繁「杀」后台,微信给出建议

    编辑|排版| @宅哥技术 转载请联系商务合作给你开白名单 来源:宅哥技术(zg_jishu) ---------♥--------- iOS13.2 咱们都知道升级iOS13.2后会杀后台,「杀」后台 ...

  6. 还有kill -9杀不掉的进程?kill命令详解

    我们很多人对kill -9 非常熟悉,在工作中也经常用到.特别是你去重启服务的时候.但是所有的服务都能用kill -9来处理吗?kill -9能杀掉所有的进程吗? 首先我们来了解一下 kill -n ...

  7. 如何设计 Web App 应用架构?「两分钟了解 IOING」

    IOING 在做些什么? IOING 在你的代码和浏览器之间架设了一个中间解释层,该解释层提供了一套新的语法来填补浏览器所不具备的能力. SPA 开发痛点 开发一个 SPA 应用的痛点是不同模块页面的 ...

  8. 火爆全网,却只有4页!ICLR爆款论文「你只需要Patch」到底香不香?

    来源:新智元 [导读]顶会投稿竟只写4页?拳打ViT,脚踢MLP,Patch到底能不能成为ALL YOU NEED? 金秋十月,又到了ICLR截稿的季节! 一篇「Patches are all you ...

  9. 「斐波那契」投稿法不好使了:IJCAI 2020出台新规,隐瞒「拒稿重投」者将被一票否决...

    点击上方"深度学习技术前沿",选择"星标"公众号 资源干货,第一时间送达 投稿被拒是一件非常令人沮丧的事情,但过来人一般会这样劝你:「没关系,改改再投其他家就好 ...

最新文章

  1. 说一说安装sklearn遇到的坑
  2. [Android]第四次作业
  3. 新系统如何测试软件,怎样检测电脑能否升级到最新的Windows11系统?官方检测工具帮你一招搞定!...
  4. pearson相关系数_使用gbdt我们到底应该怎么用相关系数?
  5. 科研|饶毅:科学在被淘汰的博士后引领下狂奔
  6. linux打if语句如何换行,如何在Linux中的列内换行
  7. 聚合天气--ajax 通过城市名取数据
  8. ztree 异步展开节点显示不出来_用户管理、角色管理、模块管理、zTree的使用
  9. Mesos超配:让集群利用率可以达到100%
  10. 晶振封装(绝对实用)
  11. yolov4 火焰检测 火焰识别 代码 数据集 开源
  12. pdf文件转图片的两种方法
  13. element-ui MessageBox 弹框判断确认和取消
  14. c++ atuo_ptr 的实现原理
  15. 一些货币政策及金融术语简介
  16. Winform contextmenustrip 隐藏图标区域
  17. python exe文件反编译_[原创]python exe文件解包方法总结
  18. 揭秘沃尔玛、腾讯、京东、浙商银行的供应链管理方案
  19. 欲善其事,先利其器——青龙面板依赖安装教程
  20. 基于可编程图形处理器的骨骼动画算法及其比较

热门文章

  1. 计算机网络 标性能指标
  2. 对话:与印度第一大IT教育培训公司CEO谈软件
  3. 江苏计算机报名时间2021年上半年,关于2021年春季江苏省计算机等级考试报名的通知...
  4. 清理Xcode占用的Mac硬盘空间
  5. cocos2dx3.X shader使图片置灰
  6. linux怎么找网卡驱动,linux系统下如何安装网卡驱动
  7. ppt生成eps文件_如何将AI/EPS格式文件转为ppt格式
  8. 【高效工具】分享几个高质量PPT模板
  9. java毕业设计猎头公司业务管理系统的设计与实现源码+lw文档+mybatis+系统+mysql数据库+调试
  10. python+django+layUI+MySQL搭建4G设备管理平台项目(一)