Linux系统篇—CPU使用率是怎么回事

简介: CPU 使用率是最直观和最常用的系统性能指标,更是我们在排查性能问题时,通常会关注的第一个指标。所以我们更要熟悉它的含义。

CPU使用率是怎么回事

CPU 使用率是单位时间内 CPU 使用情况的统计,以百分比的方式展示。Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。

为了维护 CPU 时间,Linux 通过节拍率触发时间中断,进行使用率统计。

相关名词解析

节拍率 HZ: 内核的可配选项,可以设置为 100、250、1000 等(也就是每秒钟触发 100、250、1000次时间中断)。不同的系统可能设置不同数值,可以通过查询 cat /boot/config 内核选项来查看它的配置值。Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数(每发生一次时间中断,Jiffies 的值就加 1)

查看系统内核节拍率

:grep 'CONFIG_HZ=' /boot/config-$(uname -r)
[rootemasterl-admin~]#grep'CONFIG HZ=/boot/config-$(uname -r)
CONFIG_HZ=1000  

USER_HZ (用户空间节拍率) : 因为节拍率 HZ 是内核选项,用户空间程序并不能直接访问。所以内核提供来一个用户空间节拍率 USER_HZ,固定值为100,也就是1/100 秒。这样,用户空间程序并不需要关心内核中 HZ 被设置成了多少,因为它看到的总是固定值 100。

CPU 使用率相关的重要指标

# 查看系统的 CPU 和任务统计信息,只保留各个 CPU 的数据
$ cat /proc/stat | grep ^cpu
复制代码
[ root @ masterl - admin ~ l # cat / proc / stat | grep cpu 
 cpu 4496996318221845523658549242624014702000(Cpu0
)2226230181109727011827233321372089840000cpu12270766137112118511831315821251057180000

第一列表示的是 CPU 编号,第一行没有编号的 cpu ,表示的是所有 CPU 的累加

其他列则表示不同场景下 CPU 的累加节拍数,它的单位是 USER_HZ,也就是 10 ms(1/100 秒),所以这其实就是不同场景下的 CPU 时间。更多列内容含义可以通过man proc查看文档得知

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

CPU 使用率的计算方法

4d502746ba46f187c780063db3b6bea.png

7a969ddfc6ef2ae6b32dc55b1b99f15.png

怎么查看 CPU 使用率

要查看 CPU 使用率,就必须先读取 /proc/stat/proc/[pid]/stat这两个文件,然后再按照上面的公式计算。但现在各种各样的性能分析工具已经帮我们计算好了。

top

top显示了系统总体的 CPU 和内存使用情况,以及各个进程的资源使用情况。top 默认显示的是所有 CPU 的平均值,这个时候你只需要按下数字 1 ,就可以切换到每个 CPU的使用率了

ps

ps 则只显示了每个进程的资源使用情况。

pidstat

pidstat 每个进程的详细情况,

  • 用户态 CPU 使用率 (%usr);
  • 内核态 CPU 使用率(%system);
  • 运行虚拟机 CPU 使用率(%guest);
  • 等待 CPU 使用率(%wait);
  • 以及总的 CPU 使用率(%CPU)。

CPU 使用率过高怎么办?

GDB

有个功能强大的程序调试利器GDB(The GNU Project Debugger), 但GDB 并不适合在性能分析的早期应用。GDB 调试程序的过程会中断程序运行,这在线上环境往往是不允许的。所以,GDB 只适合用在性能分析的后期,当你找到了出问题的大致函数后,线下再借助它来进一步调试函数内部的问题

perf

perf 是 Linux2.6.31 以后内置的性能分析工具。它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题

perf top能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数

Samples: 4K of event 'cpu-clock', 4000 Hz, Event  count(approx.):964312500  lost:0/0 drop:0/0 
Overhead  Shared object Symbol  
13.86%  perf  ... symbols_insert  
6.71% perf  [.] rb next 
2.22号 [kernel]  [k] kallsyms expand symbol.constprop.0  
2.15号 [kernel]  [k] syscall enter from user mode  
1.66% 1.598 perf  [kernel]  [.] rb insert color [k] clear page orig 
第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事件总数量(Event count)。
1. 第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
2. 第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
3. 第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
4. 最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
复制代码

perf record 则提供了保存数据的功能,保存后的数据,需要你用 perf report 解析展示, 加上 -g 参数,可以开启调用关系的采样,方便根据调用链来分析性能问题。

[rootemasterl-admin ~]# perf record
^C[ perf record: Woken up ll times to write data ]
[perfrecord:Captured and wrote 2.929 MB perf.data (58265 samples)I
[rootemasterl-admin ~]# perf report 

总结

  • 用户 CPU 和 Nice CPU 高,说明用户态进程占用了较多的 CPU,所以应该着重排查进程的性能问题。
  • 系统 CPU 高,说明内核态占用了较多的 CPU,所以应该着重排查内核线程或者系统调用的性能问题。
  • I/O 等待 CPU 高,说明等待 I/O 的时间比较长,所以应该着重排查系统存储是不是出现了 I/O 问题。
  • 软中断和硬中断高,说明软中断或硬中断的处理程序占用了较多的 CPU,所以应该着重排查内核中的中断服务程序。
  • 碰到 CPU 使用率升高的问题,你可以借助 top、pidstat 等工具,确认引发 CPU 性能问题的来源;再使用 perf 等工具,排查出引起性能问题的具体函数。
相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
1月前
|
Ubuntu Linux
计算机基础知识:linux系统怎么安装?
在虚拟机软件中创建一个新的虚拟机,并选择相应操作系统类型和硬盘空间大小等参数。将下载的 ISO 镜像文件加载到虚拟机中。启动虚拟机,进入安装界面,并按照步骤进行安装。安装完成后,可以在虚拟机中使用 Linux 系统。
|
1月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
644 10
|
1月前
|
安全 Linux 数据安全/隐私保护
为Linux系统的普通账户授予sudo访问权限的过程
完成上述步骤后,你提升的用户就能够使用 `sudo`命令来执行管理员级别的操作,而无需切换到root用户。这是一种更加安全和便捷的权限管理方式,因为它能够留下完整的权限使用记录,并以最小权限的方式工作。需要注意的是,随意授予sudo权限可能会使系统暴露在风险之中,尤其是在用户不了解其所执行命令可能带来的后果的情况下。所以在配置sudo权限时,必须谨慎行事。
289 0
|
1月前
|
Ubuntu Linux 开发者
国产 Linux 发行版再添新成员,CutefishOS 系统简单体验
当然,系统生态构建过程并不简单,不过为了帮助国产操作系统优化生态圈,部分企业也开始用国产操作系统替代 Windows,我们相信肯定会有越来越多的精品软件登录 Linux 平台。
99 0
|
1月前
|
Ubuntu 安全 Linux
Linux系统入门指南:从零开始学习Linux
Shell脚本是一种强大的自动化工具,可以帮助您简化重复的任务或创建复杂的脚本程序。了解Shell脚本的基本语法和常用命令,以及编写和运行Shell脚本的步骤,将使您更高效地处理日常任务。
183 0
|
1月前
|
Ubuntu Linux 图形学
Linux学习之Linux桌面系统有哪些?
Cinnamon:与MATE类似,Cinnamon 拥有 GNOME 和 Unity 等其它桌面环境所没有的种种功能,是高度可定制的桌面环境,不需要任何外部插件、窗口组件和调整工具来定制桌面。
108 0
|
1月前
|
Ubuntu 安全 Linux
十款常用Linux系统介绍
本文不是什么大盘点。市面上有好几百款发行版,每款发行版在某个方面都与众不同。不可能在此全部罗列,本文只罗列了十款最常见的Linux发行版(世界上只有两种人,一种是懂二进制的,另一种是不懂二进制的)。请宣传Linux的魅力或威力。
|
1月前
|
Ubuntu 安全 Linux
linux系统|Ubuntu 18.10 如期正式发布,新面孔新技术都来了
微软公司也终于沉不住气要在linux开源系统开疆扩土了。mscode这样的工具的确好用,虽然差第一名那么一点儿,但是最老版的公司出版的软件的确很是让人动心!
|
1月前
|
Ubuntu Linux 数据安全/隐私保护
Win10安装Linux子系统教程!如何在Win10系统中安装Ubuntu!
登录系统后,输入cd /返回上一级,然后再输入“ls”查看一下系统文件目录,看看对不对!
|
1月前
|
Web App开发 安全 Linux
Linux 比起其他系统的5 个优点和 5 个缺点
对Linux系统感兴趣的朋友,可以点击下方书籍进行学习。