进程监控分析


进程状态

  • 通过top和ps都可以获取到进程的状态,其中top的S列输出为进程状态,各自代表的含义如下:
    • 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 的缩写,表示进程处于暂停或者跟踪状态。向一个进程发送 SIGSTOP 信号,它就会因响应这个信号变成暂停状态(Stopped);再向它发送 SIGCONT 信号,进程又会恢复运行(如果进程是终端里直接启动的,则需要你用 fg 命令,恢复到前台运行);
    • X,也就是 Dead 的缩写,表示进程已经消亡,所以你不会在 top 或者 ps 命令中看到它。

image.png

  • 在ps中会出现Ss+和D+状态的进程,分别表示
    • s 表示这个进程是一个会话的领导进程,会话是指共享同一个控制终端的一个或多个进程组;
      • 表示前台进程组,进程组表示一组相互关联的进程,比如每个子进程都是父进程所在组的成员。
  • 进程状态统计,top命令

image.png

进程资源

  • 进程使用的cpu资源
    • 通过ps -aux | sort -k 3 -r (通过sort排序第三列的cpu百分比)

image.png

  • 通过top交互下按'P'排序cpu使用率

image.png

  • 进程使用的mem资源
    • 通过ps -aux | sort -k 4 -r

image.png

  • 通过top交互按键'M'排序mem使用率

image.png

不可中断进程分析

  • 现象:系统负载和CPU iowait很高
  • 工具:能同时显示cpu和io信息,vmstat,iostat,dstat
    • dstat

image.png

  • vmstat(bi:每秒读取的块数(读磁盘),bo:每秒写入的块数(写磁盘))

image.png

  • iostat

image.png

  • 监控结果:磁盘IO和CPU iowait变化相关
  • 进一步确认进程
    • 通过top查看,是否有D状态(不可中断进程)的进程(这里用dd命令模拟io操作)

image.png

  • 记录D状态进程PID后
    • 使用pidstat查看进程对应的IO操作

image.png

  - 使用pidstat查看系统哪些进程进行IO操作

image.png

  • 通过strace追踪进程

image.png

  • 通过上面输出看出:进程11432正在进行以512b大小的重复的读写
  • 这与进程11432实际做的事情是一致的(同过dd模拟的场景)

image.png

  • 通过perf追踪进程调用
    • perf record -g 录制15秒左右
    • perf report 回放录制

image.png

  • 找到进程dd,按回车展开,可以看到调用系统写函数或者库(swapper 是内核中的调度进程,可以先忽略掉)

image.png

僵尸进程

  • 僵尸进程是因为父进程没有回收子进程的资源而出现的
  • 要解决掉僵尸进程,就要找到他们的父进程,然后在父进程里解决
  • 查找父进程的命令pstree (Centos上的包为psmisc)
    • -a : 输出命令行选项
    • p : 进程PID
    • s :指定进程的父进程

image.png

  • 查找对应父进程对于子进程清理的方法