经过前面的学习,我们知道一个 task 有如下几种状态,但用top时往往会以缩写的形式展现,这里我们总结下。
- R (TASK_RUNNING),可运行状态。Linux中的 Ready 和 Running 对应的都是TASK_RUNNING标志位,ready 表示进程正处在队列中,尚未被调度;running 则表示进程正在CPU上运行;D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。
是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应。处于 TASK_UNINTERRUPTIBLE 状态的进程不能被信号唤醒,只能由 wakeup 唤醒。既然 TASK_UNINTERRUPTIBLE 不能被信号唤醒,自然也不会响应 kill 命令,就算是必杀 kill -9 也不例外。S (TASK_INTERRUPTIBLE),可中断的睡眠状态。T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态。Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程。
什么是平均负载?
认识一下:
cat /proc/loadavg
0.18 0.94 0.72 1/486 3569
查看当前系统的平均负载,前三个数分别是 1分钟、5分钟、15分钟的平均进程数。第四个的分子是正在运行的进程数,分母是进程总数;最后一个最近运行的进程ID号。
也可以:
uptime
22:32:31 up 9 min, 1 user, load average: 0.18, 0.94, 0.72
load average: 0.18, 0.94, 0.72 //分别是 1分钟、5分钟、15分钟的平均进程数。
我这里的PC是2个cpu,所以这里的负载是比较低的(如果平均负载高于2.0的话说明过载,平均负载低于2.0就是比较正常的。)
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数(即上面的R,D两个状态的平均进程数,很容易忽略D状态的进程),也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。实际的计算比较复杂,感兴趣的同学可以查看源码 https://github.com/torvalds/linux/blob/master/kernel/sched/loadavg.c 。
平均负载不等于CPU使用率
通过上面的介绍我们知道:
平均负载不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。
CPU使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。
比如:
CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。
所以这就是有时通过top发现cpu使用率不是很高,但是cat /proc/loadavg时负载又很大的原因。
常用命令
top
可以查看系统CPU的状态,以百分比的形式显示出来。
Tasks: 251 total, 1 running, 243 sleeping, 0 stopped, 1 zombie
Mem: 2007724k total, 862108k used, 1145616k free, 18560k buffers
Swap: 1505788k total, 0k used, 1505788k free, 415260k cached
400%cpu 16%user 0%nice 6%sys 377%idle 0%iow 0%irq 0%sirq 0%host
PID USER PR NI VIRT RES SHR S[%CPU] %MEM TIME+ ARGS
5628 root 20 0 5.9M 3.1M 2.7M R 19.3 0.1 0:00.07 top
5614 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kworker/u9:0]
5609 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/3:2]
5607 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/u8:2]
5590 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kworker/u9:4]
5585 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/u8:3]
5577 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kworker/u9:2]
5571 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/3:0]
5537 root 20 0 0 0 0 S 0.0 0.0 0:00.05 [kworker/u8:1]
5448 root 20 0 0 0 0 S 0.0 0.0 0:00.67 [kworker/3:1]
- us(user cpu time):用户态使用的cpu时间比。该值较高时,说明用户进程消耗的 CPU 时间比较多,比如,如果该值长期超过 50%,则需要对程序算法或代码等进行优化。sy(system cpu time):系统态使用的cpu时间比。ni(user nice cpu time):用做nice加权的进程分配的用户态cpu时间比id(idle cpu time):空闲的cpu时间比。如果该值持续为0,同时sy是us的两倍,则通常说明系统则面临着 CPU 资源的短缺。wa(wait):等待使用CPU的时间。hi(hardware irq):硬中断消耗时间si(software irq):软中断消耗时间st(steal time):虚拟机偷取时间
vmstat
vmstat用来检测系统的状态,包括CPU和内存,非常方便系统调试使用。
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 1146440 18564 415260 0 0 2 1 0 95 0 0 100 0
0 0 0 1146476 18564 415260 0 0 0 0 0 384 0 0 100 0
0 0 0 1146104 18564 415260 0 0 0 0 0 375 0 0 100 0
0 0 0 1146724 18564 415260 0 0 0 0 0 387 0 0 100 0
0 0 0 1146848 18564 415260 0 0 0 0 0 369 0 0 100 0
参考:
https://mp.weixin.qq.com/s/UzmlGu-5n25B0wNScD50Jg
https://mp.weixin.qq.com/s/E5X9U7QIGnLCd4ETn2Ldlw