文章目录
- CPU使用率
- 概念
- CPU使用率的重要指标
- 计算公式
- 查看CPU使用率
- CPU 使用率过高
- 总结
CPU使用率
概念
单位时间内CPU使用情况的统计,以百分比方式显示
Linux是一个多任务操作系统,将每个CPU的时间划分为很短的时间片,通过调度器轮流分配给各个任务使用,因此会造成多任务同时运行的错觉。
为了维护CPU时间,Linux会通过实现定义节拍率(内核中表示为HZ)触发时间中断,使用全局变量Jiffies记录开机以来的节拍数。每一次时间中断,Jiffies值加1。
节拍率HA是内核的可配选项,可以设置为100、250、1000等,不同系统可能设置不同的数值,代表每秒钟触发了多少次时间中断。
因为节拍率 HZ 是内核选项,所以用户空间程序并不能直接访问。为了方便用户空间程序,内核还提供了一个用户空间节拍率 USER_HZ,它总是固定为 100,也就是 1/100 秒。
Linux 通过 /proc 虚拟文件系统,向用户空间提供了系统内部状态的信息,而 /proc/stat 提供的就是系统的 CPU 和任务统计信息 ,只关注CPU可以执行下面命令:
//todo 实际操作一下看下
$ cat /proc/stat | grep ^cpu
cpu 280580 7407 286084 172900810 83602 0 583 0 0 0
cpu0 144745 4181 176701 86423902 52076 0 301 0 0 0
cpu1 135834 3226 109383 86476907 31525 0 282 0 0 0
- 第一列表示的是 CPU 编号,如 cpu0、cpu1
- 其他列则表示不同场景下 CPU 的累加节拍数,它的单位是 USER_HZ,也就是 10 ms(1/100 秒),所以这其实就是不同场景下的 CPU 时间。
- 第一行没有编号的 cpu ,表示的是所有 CPU 的累加。
CPU使用率的重要指标
- user(us) : 用户态CPU时间,不包括nice时间,包含guest时间
- nice(ni) : 低优先级用户态CPU时间,进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
- system(sys) : 内核态CPU时间
- idle(id) : 空闲时间,不包括等待IO的时间(iowait)
- iowait(wa) : 等待IO的CPU时间
- irp(hi) : 处理硬中断的 CPU 时间
- softirq(si) : 处理软中断的 CPU 时间
- steal(st) : 系统运行在虚拟机中时,被其他虚拟机占用CPU的时间
- guest(guest) : 通过虚拟化运行其他操作系统的时间,运行虚拟机的CPU时间
- guest-nice(gnice) : 以低优先级运行虚拟机的时间
计算公式
CPU 使用率,就是除了空闲时间外的其他时间占总 CPU 时间的百分比
用 /proc/stat 计算出来的是开机以来平均使用率,没有参考价值,一般计算方式如下:
性能工具一般都会取间隔一段时间(比如 3 秒)的两次值,作差后,再计算出这段时间内的平均 CPU 使用率,即
Linux 也给每个进程提供了运行情况的统计信息,也就是 /proc/[pid]/stat
要查看 CPU 使用率,不需要先读取 /proc/stat 和 /proc/[pid]/stat和信息计算,直接使用性能工具就好,但是需要注意不同工具的时间间隔。
top 和 ps 这两个工具报告的 CPU 使用率,默认的结果很可能不一样,因为 top 默认使用 3 秒时间间隔,而 ps 使用的却是进程的整个生命周期。
查看CPU使用率
- top 显示了系统总体的 CPU 和内存使用情况,以及各个进程的资源使用情况。
- ps 则只显示了每个进程的资源使用情况
top 并没有细分进程的用户态 CPU 和内核态 CPU,但pidstat命令工具可以
pidstat 命令,间隔 1 秒展示了进程的 5 组 CPU 使用率,可以区分用户态和内核态
- 用户态 CPU 使用率 (%usr);
- 内核态 CPU 使用率(%system);
- 运行虚拟机 CPU 使用率(%guest);
- 等待 CPU 使用率(%wait);
- 总的 CPU 使用率(%CPU)。
CPU 使用率过高
使用perf工具进行性能分析
//-g 开启调用关系的采 样
perf top -g
- Samples:采样数
- event:事件类型
- Event count:事件总数量
perf 总共采集了 833 个 CPU 时钟事件,总事件数则为 97742399。
- Overhead :是该符号的性能事件在所有采样中的比例,用百分比来表示。
- Shared :是该函数或指令所在的动态共享对象(Dynamic Shared Object), 如内核、进程名、动态链接库名、内核模块名等。
- Object :是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动 态链接库,而 [k] 则表示内核空间。
- Symbol :是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
perf top 实时展示系统的性能信息,缺点是并不保存数据,无法用于离线或者后续的分析,所以perf record 则提供了保存数据的功能,保存后的数据,需要你用 perf report 解析展示。
总结
-
用户 CPU 和 Nice CPU 高,说明用户态进程占用了较多的 CPU,所以应该着重排查进程的性能问题。
-
系统 CPU 高,说明内核态占用了较多的 CPU,所以应该着重排查内核线程或者系统调用的性能问题。
-
I/O 等待 CPU 高,说明等待 I/O 的时间比较长,所以应该着重排查系统存储是不是出现了 I/O 问题。
-
软中断和硬中断高,说明软中断或硬中断的处理程序占用了较多的 CPU,所以应该着重排查内核中的中断服务程序。