进程状态
- 通过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 命令中看到它。
- 在ps中会出现Ss+和D+状态的进程,分别表示
- s 表示这个进程是一个会话的领导进程,会话是指共享同一个控制终端的一个或多个进程组;
-
- 表示前台进程组,进程组表示一组相互关联的进程,比如每个子进程都是父进程所在组的成员。
- 进程状态统计,top命令
进程资源
- 进程使用的cpu资源
- 通过ps -aux | sort -k 3 -r (通过sort排序第三列的cpu百分比)
不可中断进程分析
- 现象:系统负载和CPU iowait很高
- 工具:能同时显示cpu和io信息,vmstat,iostat,dstat
- vmstat(bi:每秒读取的块数(读磁盘),bo:每秒写入的块数(写磁盘))
- 监控结果:磁盘IO和CPU iowait变化相关
- 进一步确认进程
- 通过top查看,是否有D状态(不可中断进程)的进程(这里用dd命令模拟io操作)
- 使用pidstat查看系统哪些进程进行IO操作
- 通过上面输出看出:进程11432正在进行以512b大小的重复的读写
- 这与进程11432实际做的事情是一致的(同过dd模拟的场景)
- 通过perf追踪进程调用
- perf record -g 录制15秒左右
- perf report 回放录制
- 找到进程dd,按回车展开,可以看到调用系统写函数或者库(swapper 是内核中的调度进程,可以先忽略掉)
僵尸进程
- 僵尸进程是因为父进程没有回收子进程的资源而出现的
- 要解决掉僵尸进程,就要找到他们的父进程,然后在父进程里解决
- 查找父进程的命令pstree (Centos上的包为psmisc)
- -a : 输出命令行选项
- p : 进程PID
- s :指定进程的父进程