序言

CPU 使用率是最直观和最常用的系统性能指标,更是我们在排查性能问题时,通常会关注的第一个指标。

节拍率

为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数。

为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数。每发生一次时间中断,Jiffies 的值就加 1。

节拍率 HZ 是内核的可配选项,可以设置为 100、250、1000 等。不同的系统可能设置不同数值,每发生一次时间中断,Jiffies 的值就加 1。例如,我们测试机上

adb pull /proc/config.gz .
gzip -C config.gz
cat config | grep CONFIG_HZ
# CONFIG_HZ_PERIODIC is not set
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
CONFIG_HZ_300=y
# CONFIG_HZ_1000 is not set
CONFIG_HZ=300

同时,正因为节拍率 HZ 是内核选项,所以用户空间程序并不能直接访问。

为了方便用户空间程序,内核还提供了一个用户空间节拍率 USER_HZ,它总是固定为 100,也就是 1/100 秒。这样,用户空间程序并不需要关心内核中 HZ 被设置成了多少,因为它看到的总是固定值 USER_HZ。

getconf CLK_TCK
100

使用率

单位时间内 CPU 使用情况的统计,以百分比的方式展示繁忙百分比。

Linux 通过 /proc 虚拟文件系统,向用户空间提供了系统内部状态的信息,而 /proc/stat 提供的就是系统的 CPU 和任务统计信息。比方说,如果你只关注 CPU 的话,可以执行下面的命令:

# cat /proc/stat | grep ^cpu
cpu  234216 27933 319655 17408210 4562 55507 27548 0 0 0
cpu0 49539 7960 70000 2095840 766 17747 6814 0 0 0
cpu1 46158 7493 69829 2102226 919 14273 6062 0 0 0
cpu2 34898 2226 74222 2118598 778 12061 5720 0 0 0
cpu3 33398 2343 72419 2119606 904 9585 8048 0 0 0
cpu4 21543 1631 9387 2238443 136 437 189 0 0 0
cpu5 22054 1652 10093 2237259 127 434 203 0 0 0
cpu6 22313 1711 10588 2236524 129 420 185 0 0 0
cpu7 4308 2914 3114 2259711 798 547 323 0 0 0

这里的输出结果是一个表格。其中,第一列表示的是 CPU 编号,如 cpu0、cpu1 ,而第一行没有编号的 cpu ,表示的是所有 CPU 的累加。其他列则表示不同场景下 CPU 的累加节拍数,它的单位是 USER_HZ,也就是 10 ms(1/100 秒),所以这其实就是不同场景下的 CPU 时间。当然,这里每一列的顺序并不需要背下来。有需要的时候,查询 man proc 就可以。下面,来依次解读一下。

  • user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。
  • nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
  • system(通常缩写为 sys),代表内核态 CPU 时间。
  • idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。
  • iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。
  • irq(通常缩写为 hi),代表处理硬中断的 CPU 时间。
  • softirq(通常缩写为 si),代表处理软中断的 CPU 时间。
  • steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
  • guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。
  • guest_nice(通常缩写为 gnice),代表以低优先级运行虚拟机的时间。

CPU 使用率,就是除了空闲时间外的其他时间占总 CPU 时间的百分比,用公式来表示就是:

根据这个公式,我们就可以从 /proc/stat 中的数据,很容易地计算出 CPU 使用率。当然,也可以用每一个场景的 CPU 时间,除以总的 CPU 时间,计算出每个场景的 CPU 使用率。

不过先不要着急计算,直接用 /proc/stat 的数据,算的是什么时间段的 CPU 使用率吗?这是开机以来的节拍数累加值,所以直接算出来的,是开机以来的平均 CPU 使用率,一般没啥参考价值。

事实上,为了计算 CPU 使用率,性能工具一般都会取间隔一段时间(比如 3 秒)的两次值,作差后,再计算出这段时间内的平均 CPU 使用率,即:

我们知道了系统 CPU 使用率的计算方法,那进程的呢?跟系统的指标类似,Linux 也给每个进程提供了运行情况的统计信息,也就是 /proc/[pid]/stat。不过,这个文件包含的数据就比较丰富了,总共有 52 列的数据。

小结

CPU 使用率是最直观和最常用的系统性能指标,更是我们在排查性能问题时,通常会关注的第一个指标。所以我们更要熟悉它的含义,尤其要弄清楚用户(%user)、Nice(%nice)、系统(%system) 、等待 I/O(%iowait) 、中断(%irq)以及软中断(%softirq)这几种不同 CPU 的使用率。比如说:

  • 用户 CPU 和 Nice CPU 高,说明用户态进程占用了较多的 CPU,所以应该着重排查进程的性能问题。
  • 系统 CPU 高,说明内核态占用了较多的 CPU,所以应该着重排查内核线程或者系统调用的性能问题。
  • I/O 等待 CPU 高,说明等待 I/O 的时间比较长,所以应该着重排查系统存储是不是出现了 I/O 问题。
  • 软中断和硬中断高,说明软中断或硬中断的处理程序占用了较多的 CPU,所以应该着重排查内核中的中断服务程序。

cpu使用率_漫话性能:CPU使用率相关推荐

  1. linux php cpu,获取Linux服务器性能CPU、内存、硬盘等使用率 PHP

    数据库配置文件: conn.php define("MONITORED_IP", "172.16.0.191");  //被监控的服务器IP地址  也就是本机地 ...

  2. 进程用户态 上下文切换需要保存哪些_漫话性能:CPU上下文切换

    序言 表弟:CPU平均负载​zhuanlan.zhihu.com 我们理解了平均负载( Load Average),并用三个案例展示了不同场景下平均负载升高的分析方法.这其中,多个进程(或线程)竞争 ...

  3. android cpu调度策略_「性能优化3.0」Android线程调度异步方式汇总

    线程调度与线程调度模型 任意时刻,只有一个线程占用 CPU,处于运行状态.而多线程并发执行就是轮流获取 CPU 执行权. 分时调用模型 轮流获取 CPU 执行权,均分 CPU 执行时间. 抢占式调度模 ...

  4. c++ 多核cpu序列号_详解CPU几个重点基础知识

    作者 | 骏马金龙 责编 | 阿秃 关于CPU和程序的执行 1.程序的运行过程,实际上是程序涉及到的.未涉及到的一大堆的指令的执行过程. 当程序要执行的部分被装载到内存后,CPU要从内存中取出指令,然 ...

  5. linux监控cpu内存磁盘网络使用率,linux服务器性能——CPU、内存、流量、磁盘使用率的监控...

    4. 什么是AJAX 术语Ajax用来描述一组技术,它使浏览器可以为用户提供更为自然的浏览体验.在Ajax之前,Web站点强制用户进入提交/等待/重新显示范例,用户的动作总是与服务器的"思考 ...

  6. 2018主流服务器cpu,【热门服务器CPU排行榜】2021热门服务器CPU排名_热门服务器CPU排行榜10强-太平洋产品报价...

    TOP 1 Intel Xeon E5-2689 八核 核心数量 2.6GHz 主频 暂无评分 暂无报价 这款Intel Xeon E5-2689是一款性能很稳定的服务器CPU,能够积极响应服务请求并 ...

  7. amd cpu排行_最新AMD CPU排行出炉 E6版3000+夺魁

    据消费调研中心ZDC统计结果显示,2006年3月最受用户关注的前十款AMD CPU中,Athlon64和Sempron两大系列产品平分秋色,各有五款产品入围.具体产品排行如下图所示. (图)2006年 ...

  8. 如何降低ue4 cpu消耗_如何有效降低CPU温度,六个步骤教你如何使用液金导热!...

    经常DIY电脑的小伙伴应该知道,有一些人会对部分CPU进行开盖处理,所谓的开盖处理是指将CPU的后盖打开更换里面的硅脂,那么对于这些人为什么会这样做大家肯定有一定的疑惑,并且大家现在对这个操作难不难还 ...

  9. VB.NET工作笔记015---vb.net获取cpu使用率,内存使用率_未能找到具有指定类别名“Processor”、计数器名“% Processor Time”的性能计数

    vb.net获取系统CPU的使用率,和内存的使用率 获取cpu的使用率,用: performanceCounter1这个控件,一定要记得,写上Processor 这个: counterName cat ...

最新文章

  1. 技术12期:如何设计rowkey使hbase更快更好用【大数据-全解析】
  2. 这25张图,彻底看懂25个复杂的数学公式!
  3. 利用Unity自带的合图切割功能将合图切割成子图
  4. USB 3G驱动和USB HOST驱动加载
  5. kafka同一个gruopid下多个consumer订阅同一个topic,只有一个consumer能消费到数据
  6. [转] GDBT详解
  7. “耳边的AI助理” 出门问问发布TicPods 2系列头控真无线耳机
  8. Eclipse-JAVA版本
  9. CentOS7.6下设置mysql服务开机启动
  10. erroe C1083:无法打开包括文件(源文件)
  11. “头号电脑黑客” 凯文.米特尼克 与 中国台湾的”电脑鬼才“陈盈豪
  12. hive中sql使用英文分号
  13. java运行期类型鉴定
  14. 如何识别英文单词java,自动识别英文单词显示(Android+Java)
  15. 移植鸿蒙系统到STM32L476RG_NUCLEO开发板的一点小经验
  16. 电子信息一班上传文件教程
  17. b站《史上最全unity3D教程》2-6等ppt笔记3
  18. vs 的 tfs 账号更改
  19. vue中的attribute 和 property 是什么意思
  20. 宋浩概率论与数理统计-第一章-笔记

热门文章

  1. “返回指向栈空间的指针”的错误
  2. k8s 组件介绍-API Server
  3. JSON.parse和JSON.stringify 参数详解
  4. IOS_改变UITextField placeHolder颜色、字体
  5. 进制A~Z,全字母26进制转化
  6. boost学习之boost::shared_ptr
  7. 调试LCD反被调戏了
  8. 你想要的江湖,可能不在这时候笑傲
  9. 分号是不是c语言的一部分,问什么C程序里总是提示缺少分号;,而明明有分号?...
  10. c++ doxygen 注释规范_利用Doxygen给C程序生成注释文档