Linux 性能优化实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
87256 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
结束语 (1讲)
Linux 性能优化实战
15
15
1.0x
00:00/00:00
登录|注册

08 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(下)

检查 wait() / waitpid() 的调用或 SIGCHLD 信号处理函数的注册
使用 pstree 找出父进程
使用 perf top 或 perf record 进行动态追踪
使用 pidstat 查看进程的 I/O 使用情况
使用 dstat 查看 CPU 和 I/O 资源的使用情况
进程已经退出,但父进程没有回收资源
进程正在跟硬件交互,保护进程数据与硬件一致
分享和交流经验
解决方法的总结和思路
分析不可中断状态进程和僵尸进程问题的根源
检查父进程代码
查找父进程
使用动态追踪工具
分析进程的磁盘读写情况
查询系统的 I/O 情况
僵尸进程
不可中断状态
思考
僵尸进程处理
iowait 分析
不可中断进程和僵尸进程
系统中出现大量不可中断进程和僵尸进程怎么办?

该思维导图由 AI 生成,仅供参考

你好,我是倪朋飞。
上一节,我给你讲了 Linux 进程状态的含义,以及不可中断进程和僵尸进程产生的原因,我们先来简单复习下。
使用 ps 或者 top 可以查看进程的状态,这些状态包括运行、空闲、不可中断睡眠、可中断睡眠、僵尸以及暂停等。其中,我们重点学习了不可中断状态和僵尸进程:
不可中断状态,一般表示进程正在跟硬件交互,为了保护进程数据与硬件一致,系统不允许其他进程或中断打断该进程。
僵尸进程表示进程已经退出,但它的父进程没有回收该进程所占用的资源。
上一节的最后,我用一个案例展示了处于这两种状态的进程。通过分析 top 命令的输出,我们发现了两个问题:
第一,iowait 太高了,导致系统平均负载升高,并且已经达到了系统 CPU 的个数。
第二,僵尸进程在不断增多,看起来是应用程序没有正确清理子进程的资源。
相信你一定认真思考过这两个问题,那么,真相到底是什么呢?接下来,我们一起顺着这两个问题继续分析,找出根源。
首先,请你打开一个终端,登录到上次的机器中。然后执行下面的命令,重新运行这个案例:
# 先删除上次启动的案例
$ docker rm -f app
# 重新运行案例
$ docker run --privileged --name=app -itd feisky/app:iowait

iowait 分析

我们先来看一下 iowait 升高的问题。
我相信,一提到 iowait 升高,你首先会想要查询系统的 I/O 情况。我一般也是这种思路,那么什么工具可以查询系统的 I/O 情况呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Linux系统中出现大量不可中断进程和僵尸进程的情况及解决方法。作者通过分析系统进程状态、使用dstat和pidstat等工具,深入探讨了iowait升高和僵尸进程增多的原因。在分析iowait升高问题时,作者通过dstat观察到磁盘读请求与iowait升高相关,然后使用top和pidstat工具进一步定位导致磁盘读写的进程。在解决僵尸进程增多的问题时,作者提出了重新运行案例并使用docker命令的解决方案。通过这些分析和解决方法,读者可以了解到如何通过工具和命令来诊断和解决系统中出现的进程问题。文章内容详实,适合需要深入了解Linux系统进程问题的读者。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(121)

  • 最新
  • 精选
  • Zecho
    提一个建议,案例的讲解过于简单,与预期有些差距,很多时候我们实际遇到的要比这个复杂,这会带来不是简单的几个命令就可以,特别需要更深入的工具,比如brendan中火焰图,perf-tools,或者systemtab等等;希望能找些实际的案例,谢谢。

    作者回复: 嗯嗯,实际上这里的案例是我故意设计的比较简单,这样初学者可以把重点放到理解当前讲的原理和指标上,而不是看着一堆的新工具和内核函数而感到害怕。当然了,火焰图、perf-tools、systemtap这些工具以后也会讲到,只是还是让我们先把基础的东西铺垫好。 如果你已经对这些比较熟悉了,推荐去把这些思路应用到实际的系统中去分析,然后在这里跟大家分享你的所得。我相信,你有可能会发现不同的理解,甚至是更好的分析思路。

    2018-12-07
    17
    108
  • 王涛
    d8打卡。看完这部分,作为一名运维人员就尴尬了,当开发跟你说机器性能有问题时,这个问题就变成了甩锅问题。开发说代码没问题,你又看不懂开发的代码。。。

    作者回复: 找出进程就可以甩锅了😊 从磁盘IO的角度来说,其实很容易找出那些进程在消耗IO资源。因为这里侧重的是CPU使用的分析,所以IO讲的不是特别深入。后续的IO部分还会有更细致的拆解。

    2018-12-07
    3
    42
  • 姜小鱼
    老师:iowait%生高并不能得出存在io性能的结论,还要继续看io量(dstat)和io并发等情况.那么这个io量到底达到多少才能说明存在性能瓶颈?有一个量化指标吗?期待回复,谢谢

    作者回复: IO部分会讲的

    2018-12-07
    6
  • 我来也
    [D8打卡] 今天又学了两个乖, dstat可以同时看cpu和io. (上篇文章安装后只看了下效果,没想到这一层).strace可以追踪系统调用. 虽然我之前也写过linux c程序,但是看到sys_read/new_sync_read/blkdev_direct_IO确实不知道是正在对磁盘进行直接读, 即使看了代码 也不知道 O_DIRECT 这个参数就是直接读. 还是功力太浅,线索摆在前面也抓不住,哈哈😁. ---- 有些同学问"服务出现僵尸进程时,怎样处理". 其实我也不知道怎么处理,但是我把那个父进程杀掉, 僵尸进程就几乎没有了. 上一篇文章中,老师也提到过[通常,僵尸进程持续的时间都比较短,在父进程回收它的资源后就会消亡;或者在父进程退出后,由 init 进程回收后也会消亡]

    作者回复: 嗯嗯 可以再思考一点,比如假如父进程已经是init了又该怎么办?注意init进程是不会退出的

    2018-12-07
    4
    6
  • 帆帆帆帆帆帆帆帆
    @jeff,数据库一般都有自己的数据缓冲池bufferpool,在合适的时间,数据库会从磁盘读入数据到bufferpool,或者从bufferpool写出数据到磁盘。在这种情况下,再使用文件系统缓存,反而不会有性能的提升,而且数据库写出数据到磁盘的时候,必须写到了磁盘才算真的完成了数据的持久化。

    作者回复: 嗯嗯,谢谢分享

    2018-12-07
    2
    5
  • Apollo
    性能这一块跟着老师走,算是入门了,希望后面有更高阶的教程

    作者回复: 👍

    2018-12-12
    2
  • 路过
    听课程,还会需要有点编程的功底,否则这个问题排查起来只能粗暴简单处理了。把锅丢给开发了。:)

    作者回复: 嗯嗯 了解一些编程的基本功很有帮助,特别是复杂问题的最后很可能要去分析函数调用栈等,更需要一定的编程功底。

    2018-12-07
    2
  • 破晓
    老师想问下关于cpu使用率这块的概念,sytem的cpu使用率,包不包含iowait的?他们之间是什么关系?

    作者回复: 不包括,这是两个不同的指标

    2018-12-07
    2
  • 窝边草
    看到这一节就开始感觉到了,运维工作如果不能看懂开发的代码就很难深入下去,很多时候知道是开发代码有问题,但是不懂代码就没法明确的指出问题。

    作者回复: 嗯嗯,最好是了解应用的工作原理

    2019-04-01
    1
  • 管清麟
    如果是开源软件造成的僵尸进程,使用kill方法可以吗?

    作者回复: 这跟开源不开源没关系,僵尸进程是已经停止的进程,不会响应kill

    2019-02-15
    1
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部