本文共 2805 字,大约阅读时间需要 9 分钟。
CPU 使用率是单位时间内 CPU 使用情况的统计,以百分比的方式展示。
为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机一来的节拍数。每发生一次时间中断,Jiffies 的值就加 1。
Linux 通过 /proc 虚拟文件系统,向用户空间提供了系统内部状态的信息,而 /proc/stat 提供的就是系统的 CPU 和任务统计信息。 第一列是 CPU 编号,其他列则表示不同场景下 CPU 的累加节拍数。诸如 top、ps 之类的性能工具展示的 %user、%nice、%system、%iowait、%steal 等等,它们都代表什么意思呢?
而我们通常所说的 CPU 使用率,就是除了空闲时间外的其他时间占总 CPU 时间的百分比,用公式表示就是:
CPU 使用率 = 1 - 空闲时间 / 总 CPU 时间
如果直接用 /proc/stat 的数据计算 CPU 使用率,它记录的是开机以来的节拍数累加值,所以直接算出来的,是开机以来的平均 CPU 使用率,一般参考价值不大。事实上,为了计算 CPU 使用率,性能工具一般都会取间隔一段时间,比如 3 秒,的两次值,作差后,再计算出这段时间内的平均 CPU 使用率。
不同的工具设置的间隔时间可能不同,比如 top 默认使用 3 秒时间间隔,而 ps 使用的是进程的整个生命周期。
top 或者 pidstat 这类的工具。pidstat 可以详细查看进程的用户态 CPU 和内核态 CPU。
通过 top、ps、pidstat 等工具,能够轻松找到 CPU 使用率过高的进程。接下来就要分析 占用 CPU 的到底是代码里的哪个函数呢?找到后才能更高效、更针对性地进行优化。
GDB 并不适合在性能分析的早期应用,GDB 调试程序的过程会中断程序运行,这在线上环境往往是不允许的,所以 GDB 只适合在性能分析的后期,当你找到了出问题的大致函数后,线下再借助它来进一步调试函数内部的问题。
最推荐的工具是 perf。perf 是 Linux 2.6.31 以后内置的性能分析工具,它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题。两种常见用法:
第一种是 perf top,类似 top,它能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数,使用界面如下: 第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事件总数量(Event count)。比如这个例子中,peft 总共采集了 747 个 CPU 时钟事件,而总事件数为 174906250。采样数如果过少,那下面的排序和百分比就没什么实际参考价值了。第二种常见用法是,perf record
和 perf report
。perf top
实时展示了系统的性能信息,但它的缺点是并不保存数据,也就无法用于离线或者后序分析。而 perf record
则提供了保存数据的功能,保存后的数据,需要你用 peft report
解析展示。
对进程进行跟踪分析其调用:
perf top -g -p <pid>
CPU 使用率是最直观和最常用的系统性能指标,更是我们在排查系统性能问题时,通常会关注的第一个指标。所以我们更要熟悉它的含义,尤其要弄清楚用户(%usr)、Nice(%ni)、系统(%sy)、等待I/O(%wa)、中断(hi)以及软中断(si)这几种不同 CPU 的使用率。比如说:
碰到 CPU 使用率升高的问题,可以借助 top、pidstat 等工具,确认引发 CPU 性能问题的来源;再使用 perf 等工具,排查出引起性能问题的具体函数。
转载地址:http://vquoi.baihongyu.com/