CPU 使用率是单位时间内 CPU 使用情况的统计
,以百分比的方式展示。那么,作为最常用也是最熟悉的 CPU 指标,你能说出 CPU 使用率到底是怎么算出来的吗?再有,诸如 top、ps 之类的性能工具展示的 %user、%nice、 %system、%iowait 、%steal 等等,你又能弄清楚它们之间的不同吗?
什么指标来描述系统的CPU性能
CPU使用率
用什么指标来描述系统的 CPU 性能呢 ? 不是平均负载,也不是CPU上下文切换,而是另一个更直观的指标CPU使用
率 ,CPU 使用率是单位时间内 CPU 使用情况的统计,以百分比的方式展示。
节拍率的概念
Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。
为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiwies 记录了开机以来的节拍数。每发生一次时间中断,Jiwies 的值就加 1。
查看系统节拍率
不同的系统可能设置不同数值,你可以通过查询 /boot/config 内核选项来查看它的配置值。
[root@iZwz91q87vgg7bo2ixi9wjZ ~]# grep 'CONFIG_HZ=' /boot/config-$(uname -r)
CONFIG_HZ=1000
1000代表每秒钟触发 1000 次时间中断
用户节拍率
正因为节拍率 HZ 是内核选项,所以用户空间程序并不能直接访问。为了方便用户空间程序,内核还提供了一个用户空间节拍率 USER_HZ,它总是固定为 100,也就是 1/100 秒。这样,用户空间程序并不需要关心内核中 HZ 被设置成了多少,因为它看到的总是固定值 USER_HZ。
CPU使用率公式
CPU使用率,就是除了空闲时间外的其他时间占总CPU时间的百分比,用公式来表示就是
事实上,为了计算机CPU使用率,性能能工具一般都会间隔一段时间(比如 3 秒)的两次值,做差后,再计算出这段时间的平均CPU使用率
这个公式,就是我们用各种性能工具所看到的 CPU 使用率的实际计算方法。
怎么查看CPU使用率
查看 CPU 使用率 top 、ps 和pidstat是最常用的性能分析工具 :
- top 显示了系统总体的 CPU 和内存使用情况,以及各个进程的资源使用情况。
- ps 则只显示了每个进程的资源使用情况。
- pidstat分析每个进程CPU使用情况
top命令
top显示了系统总体的CPU和内存使用情况,以及各个进程的资源使用情况
top命令图解
使用top命令查看系统的当前运行的情况。如图对top命令执行的结果做了简单的图解,下面针对每一项做详细的解释。
top命令的第一行“top - 19:56:47 up 39 min, 3 users, load average: 0.00, 0.00, 0.00”显示的内容依次为“系统当前时间 、系统到目前为止已运行的时间、当前登录系统的用户数量、系统负载(任务队列的平均长度)三个值分别为1分钟、5分钟、15分钟前到现在的平均值【这三个一般会小于1,如果持续高于5,请仔细查看哪个程序影响系统的运行】”
top命令的第二行“Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie”显示的内容依次“所有启动的进程数”、“正在运行的进程数”、“挂起的进程数”、“停止的进程数”、“僵尸进程数”。
top命令的第三行“Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st”显示的内容依次为“用户空间占用CPU百分比”、“内核空间占用CPU百分比”、“用户空间内改变过优先级的进程占用CPU百分比”、“空闲CPU百分比”、“等待输入输出CPU时间百分比”、“CPU服务于硬件中断所耗费的时间总额”、“CPU服务软中断所耗费的时间总额”、“Steal Time”
top命令第四行“Mem: 508820k total, 480172k used, 28648k free, 41944k buffers”显示内容依次为“物理内存总量”、“已使用的物理内存”、“空闲物理内存”、“内核缓存内存量”。
top命令第5行“PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND ”显示内容依次为“进程ID”、“进程所有者”、“优先级”、“nice值,负值表示高优先级,正值表示低优先级”、“进程使用的虚拟内存总量”、“进程使用的、未被换出的物理内存大小”、“共享内存大小”、“进程状态”、“上次更新到现在的CPU时间占用百分比”、“进程使用的物理内存百分比”、“进程使用CPU总时间”、“命令名、命令行”。
pidstat命令
top并没有细分进程的用户态CPU和内核态CPU,通过pidstat分析每个进程CPU使用情况
[root@iZwz91q87vgg7bo2ixi9wjZ ~]# pidstat 1 5
Linux 3.10.0-1160.11.1.el7.x86_64 (iZwz91q87vgg7bo2ixi9wjZ) 2021年11月24日 _x86_64_ (2 CPU)
16时50分32秒 UID PID %usr %system %guest %CPU CPU Command
16时50分33秒 0 1144 0.99 0.00 0.00 0.99 1 AliYunDun
CPU使用率过高怎么办
-
找到CPU使用率过高的进程
通过top、ps 、pidstat等工具 -
找到占用CPU高的到底是代码里的哪个函数
通过perf工具,perf 是 Linux 2.6.31 以后内置的性能分析工具。它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题。
安装perf工具
yum -y install httpd-tools
perf top
第一种常见用法是 perf top,类似于 top,它能够实时显示占用 CPU 时钟最多的函数或者
指令,因此可以用来查找热点函数,使用界面如下所示:
输出结果中,第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事件总数量(Event count)。
另外,采样数需要我们特别注意。如果采样数过少(比如只有十几个),那下面的排序和百分比就没什么实际参考价值了。
再往下看是一个表格式样的数据,每一行包含四列,分别是:
- 第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
- 第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
- 第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
- 最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
perf record / perf report
接着再来看第二种常见用法,也就是 perf record 和 perf report。 perf top 虽然实时展示了系统的性能信息,但它的缺点是并不保存数据,也就无法用于离线或者后续的分析。而perf record 则提供了保存数据的功能,保存后的数据,需要你用 perf report 解析展示。
# -g 开启调用关系分析,-p 指定 php-fpm 的进程号 21515
# 按方向键选择进程 按回车键展开详情
perf top -g -p 21515
perf record # 按 Ctrl+C 终止采样
perf report # 展示类似于 perf top 的报告
在实际使用中,我们还经常为 perf top 和 perf record 加上 -g 参数,开启调用关系的采样,方便我们根据调用链来分析性能问题。