CPU 使用率指的是以百分比的形式表示的单位时间内 CPU 使用情况。那它具体是怎么计算出来的,有哪些相关指标,这还得从 Linux 系统的时间片轮说起。
1、Linux 时间片轮
Linux 在宏观上可以在同时执行多个程序,但是从微观上看,一个 CPU 同一时问内是只能处理一个程序,那么在存在多个待执行程序的当下,系统如何公平处理?这就需要时间片轮来使得每个程序轮流执行。简单来说,时间片就是 CPU 分配给各个程序的时间,使得各个程序从表面上看是同时进行的。那一个时间片是多久,如何衡量呢?这就需要引入节拍。
所谓节拍,就像小学生在摄场上做广播体操时候播放的背景音乐用手协调肢体动作一样,系统每到一个节拍便会触发一次中断,内核全局变量 jiffies 就自加一。除此之外,用户层也维护了一个节拍称之为用户层节拍,如用于统计进程时间消耗的 times() 调用就是使用用户层节拍。
用户层节拍和内核节拍取值不一定一致,具体查看方法如下:
内核节拍:cat /boot/config-$(uname -r) | grep CONFIG_HZ
用户层节拍:getconf CLK_TCK
如上内核节拍为 1000,说明每一秒出发 1000 次节拍。重要的是,一个时间片轮等于 N 个节拍。在 /proc/stat 文件中记录着系统开机启动后至今的 CPU 不同场景下 CPU 的累加节拍数:
注:第一行表示所有 CPU 数据的累加(此处只有 cpu0,表明是单核系统)。这些具体场景也对应 Linux 众多性能分析工具的相关指标。
2、CPU 使用率相关指标和计算方法
mpstat 是分析系统 CPU 使用率常见的工具之一,如下检测全部 CPU 使用数据,并以 1 秒间隔输出:
user:用户态 CPU 时间(时间在此处可以理解为时间片轮)
nice:低优先级用户态 CPU 时间
sys:内核态 CPU 时间
iowait:等待 I/O 的 CPU 时间
irq:处理硬中断的 CPU 时间
soft:处理软中断的 CPU 时间
steal:系统运行在虚拟机中时,被其他虚拟机占用的 CPU 时间
guest:通过虚拟化运行其他操作系统虚拟机的 CPU 时间
gnice:低优先级运行虚拟机的 CPU 时间
idle:空闲时间,它不包括 I/O 等待时间
注:上述 CPU 时间实际就是 CPU 的时间片轮。
mpstat 的输出都是带 % 的,即 CPU 使用率的换算公式为:
CPU 使用率 = 1 - CPU 空闲时间 / 总的 CPU 时间
空闲时间和总的 CPU 时间的取值就来自于某个时间段的 /proc/stat 相关的指标数值差。
举个例子:%idle 为80,%usr 为15,%iowait 为 5,那么 CPU 的使用率为 1 - 0.8 / 1 = 0.2,即 CPU 的使用率为 20%。(iowait 升高会导致 CPU 使用率升高,这其中还涉及IO密集型程序和计算密集型程序,后面再讲)
3、CPU 使用率的常用工具
CPU 使用率分析工具除了上述的 mpstat 之外,还有 top:
top 显示了系统总体的 CPU 和内存的使用情况,还有针对各个进程的资源使用情况。需要注意,top 默认显示所有 CPU 的平均值,如上图所示,键入数字 1 之后就可以看到每个 CPU 的使用率了。
需要注意的是,进程的是 %CPU 列显示的是用户态、内核态的 CPU 使用率的总和。
4、本文完
本文首发于微信公众号 「 LinuxOK 」,ID:linux_ok,关注第一时间获取更新!