linux性能-04 出现大量中断进程和僵尸进程

文章目录

  • 基础知识
    • 系统中进程运行状态
    • 僵尸进程
    • 不可中断进程和僵尸进程的简单定义
  • 问题解决思路
    • 遇到iowait不断增高,并且cpu占用过高的情况解决 思路
    • 僵尸进程问题解决
    • ps 关于iO增高

基础知识

系统中进程运行状态

R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。
D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
Z 是 Zombie 的缩写,如果你玩过“植物大战僵尸”这款游戏,应该知道它的意思。它表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等)。
S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。
I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。前面说了,硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种情况。要注意,D 状态的进程会导致平均负载升高, I 状态的进程却不会。
T/t 则是stopped或者traced的缩写,表示进程处于暂停或者跟踪的状态
x 也就是dead的缩写,表示进程已经死亡,我们不会在top或者ps中看到他

僵尸进程

  • 正常情况下当一个进程创建了子进程后,他应该会通过调用系统调用wait()或者waitpid()等待子进程结束,回收子进程资源。
  • 子进程结束后,会向他的父进程发送sigchld信号,所以父进程还可以注册sigchld信号的处理函数,异步回收资源
  • 如果父进程没有这么做,或者子进程执行的太快,父进程还没来得及处理子进程状态,子进程就已经提前退出了,那这个时候子进程就会变成僵尸进程

不可中断进程和僵尸进程的简单定义

  • 不可中断状态,一般表示进程正在跟硬件交互,为了保护进程数据与硬件一致,系统不允许其他进程或中断打断该进程。
  • 僵尸进程表示进程已经退出,但它的父进程没有回收该进程所占用的资源。

问题解决思路

遇到iowait不断增高,并且cpu占用过高的情况解决 思路

  • 1,用 dststat 找到iowait升高是因为读还是写
  • 2,用 top 命令找到状态为D(不可中断)的进程号
  • 3,指定进程看他的io情况
# -d 展示 I/O 统计数据,-p 指定进程号,间隔 1 秒输出 3 组数据
$ pidstat -d -p 4344 1 3
06:38:50      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
06:38:51        0      4344      0.00      0.00      0.00       0  app
06:38:52        0      4344      0.00      0.00      0.00       0  app
06:38:53        0      4344      0.00      0.00      0.00       0  app
  • 4 看第三步的数据都挺正常,那就直接去掉 -p 看所有的
  • 5 通过第三步或者第四步可以确定导致iowait的进程,然后开始用strace -p pid跟踪进程 或者用perf top 查看进程 的调用栈发现问题

僵尸进程问题解决

  • 找到僵尸进程的Pid然后用pstree找到他的父进程再次进行 分析
# -a 表示输出命令行选项
# p表PID
# s表示指定进程的父进程
$ pstree -aps 3084
systemd,1
  └─dockerd,15006 -H fd://
      └─docker-containe,15024 --config /var/run/docker/containerd/containerd.toml
          └─docker-containe,3991 -namespace moby -workdir...
              └─app,4009
                  └─(app,3084)

ps 关于iO增高

  • 磁盘 I/O 导致了 iowait 升高,不过, iowait 高不一定代表 I/O 有性能瓶颈。当系统中只有 I/O 类型的进程在运行时,iowait 也会很高,但实际上,磁盘的读写远没有达到性能瓶颈的程度。
  • 如果遇到这种问题可以先用 dtstat 和 pidstat 确认 是不是磁盘的问题,然后再跟进相关进程进一步确定

你可能感兴趣的:(linux,linux,僵尸进程,不可中断进程,性能)