cpu使用的分类

常用的检查cpu的使用情况的命令就是**top**。

Untitled

或者**mpstat**

Untitled

从下图中可以看到%Cpu那一行每一字段的含义

Untitled

理解:

Untitled

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

cgroup的限制主要是在us和ni这两个位置,而对于wa,hi,si则不会做限制