常用的检查cpu的使用情况的命令就是**top
**。
或者**mpstat
**
从下图中可以看到%Cpu那一行每一字段的含义
理解:
us
: 代表用户态的CPU Usage,普通程序的代码,只要不涉及系统调用那么cpu的消耗时间就属于us.
sy
: 内核态的时间:在系统调真正执行前需要做的准备(例如read文件之前需要与vfs打交道的逻辑)
wa
: iowait, 系统等待IO的cpu时间(这个时间不计入进程时间), 在这个过程中进程处于**TASK_UNINTERRUPTIBLE
**状态。例如read系统调用向block layer发出IO request,触发真正的读取磁盘的请求。当磁盘返回数据的时候,进程在内核态拿到数据,仍然是内核态的cpu使用时间,所以在wa后面还是sy。最后进程从内核态切换到用户态,用户态得到文件数据,这里的cpu时间就是us了。 这里可以关注read的实现
id
: idle 代表系统处于空闲状态,没有其他的需要运行的进程了。
hi
:cpu处理硬件中断的开销。硬中断当网卡收到数据包的时候,就会产生一个硬中断, 具体是如何处理的
‣ 可以参考这篇文章。
si
:cpu处理软件中断的开销。
注意hi和si的处理时间不会计入到任何进程。这个处理过程不属于任何一个进程。
ni
: 是nice的缩写, 这里表示如果进程的nice值是1-19, 表示优先级较低的进程运行时占用的CPU。
st
:steal的缩写,是在虚拟机里用的一个CPU类型,表示有多少时间是被同一个宿主机上其他的虚拟机抢走的。
cgroup的限制主要是在us和ni这两个位置,而对于wa,hi,si则不会做限制。