前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊性能指标CPU利用率如何计算的

聊聊性能指标CPU利用率如何计算的

原创
作者头像
@派大星
发布于 2024-06-26 01:42:35
发布于 2024-06-26 01:42:35
6890
举报
文章被收录于专栏:性能指标性能指标

CPU 利用率,又称 CPU 使用率。顾名思义,CPU 利用率用于描述 CPU 的运行情况,反映了一段时间内 CPU 被程序占用的情况。使用率越高,表示计算机在该时间段内运行了更多的程序,反之则较少。CPU 的利用率与其性能直接相关。

现代操作系统如 WindowsLinuxMacOS 都是多用户、多任务的分时操作系统。这意味着多个用户可以在同一时间“同时”进行多项操作,这已经成为我们日常生活的一部分,显得非常普遍。然而,在单个 CPU 计算机中,实际上同一时间只能处理一项任务。

为了实现看似“同时处理多项任务”的效果,分时操作系统将 CPU 时间划分为长度基本相同的时间片段,也就是“时间片”。操作系统通过管理这些时间片,依次分配给各个用户使用。

如果某个作业在其分配的时间片结束前没有完成,该作业会被暂停,释放 CPU,等待下一个时间片再继续执行。此时 CPU 会被分配给另一个作业使用。由于计算机处理速度非常快,适当设置时间片的长度使得用户在时间片间隙感知不到停顿,仿佛整个系统是在独占 CPU 一样。

因此,我们提到的 CPU 占用率通常指的就是 CPU 在时间片内被占用的情况。

查看 CPU 利用率

在 Linux 系统中,确实可以使用一些命令来查看系统的负载情况和 CPU 利用率。这些命令包括:

  1. uptime: 显示系统的运行时间以及平均负载。
  2. top: 实时显示系统中各个进程的资源占用情况,包括 CPU 利用率、内存占用等。
  3. w: 显示当前登录用户和各用户的活动信息,包括登录时间、运行的命令等。
  4. vmstat: 报告系统的虚拟内存统计信息,包括 CPU 利用率、内存利用率、磁盘 I/O 等。

这些命令在终端中执行后,可以帮助管理员实时监控系统的性能和资源使用情况,从而及时进行调整和优化。

vmstat 命令

vmstat 命令是 Linux/Unix 系统中常见的监控工具,能够展示在指定时间间隔内服务器的各种状态值,包括 CPU 利用率、内存使用情况、虚拟内存交换情况以及 IO 读写情况。

代码语言:shell
AI代码解释
复制
  ~ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  1      0 2446260      0 3202312  0    0   201 16304    1    6  0  0 84  5 1

从上述结果中,我们可以获取大量信息,但本文重点关注 CPU 部分的指标。

代码语言:shell
AI代码解释
复制
us sy id wa st
0  0  84  5 1

以上几个指标是当前 CPU 的占用情况。

  • %us: 用户进程执行时间百分比。
  • %sy: 内核系统进程执行时间百分比。
  • %id: 空闲时间百分比。
  • %wa: IO 等待时间百分比。
  • %st: 虚拟 CPU 等待实际 CPU 的时间百分比。

当%us 较高时,表示用户进程占用了大量 CPU 时间。然而,如果长期超过 50%,则需要考虑优化程序算法或加速处理。

高%sy 表明系统内核消耗了大量 CPU 资源,这不利于系统正常运行,应当寻找问题根源。

%wa 的高值表示 IO 等待较为严重,可能是由于磁盘随机访问频繁或磁盘性能瓶颈引起的块操作问题。

通常使用 vmstat 工具时,需要指定两个数值参数。第一个参数表示采样的时间间隔,单位为秒;第二个参数表示采样的次数。

代码语言:shell
AI代码解释
复制
➜  ~ vmstat 2 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 2479444    0 3165172    0    0   196 15905    2    8  0  0 84  5 11
 0  0      0 2479404    0 3165176

以上命令表示采集两次数据,每隔 2 秒采集一次。

top 命令

top 命令是 Linux 系统下常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况,类似于 Windows 中的任务管理器。

代码语言:shell
AI代码解释
复制
~ top
top - 10:58:07 up 18:13,  1 user,  load average: 0.32, 0.24, 0.19
Tasks:  64 total,   1 running,  63 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 92.8%id,  0.1%wa,  0.0%hi,  0.0%si,  6.8%st
Mem:   8388608k total,  5928076k used,  2460532k free,        0k buffers
Swap: 16777216k total,        0k used, 16777216k free,  3181996k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  2393 admin     20   0 5056m 2.2g  56m S  4.3 27.6  79:06.21 java
  1054 root      20   0  338m 9760 5112 S  0.3  0.1   2:37.30 logagent

从上述打印信息中,我们可以看到第三行反映了当前 CPU 的整体情况。

此外,我们还能观察到 ID 为 2393 的 Java 进程当前内存使用率最高,约占 4.3%。

由于 Java 是多线程的,有时候我们希望能够查看一个 Java 进程中所有线程的 CPU 使用情况,这也可以通过 top 命令来实现。

代码语言:shell
AI代码解释
复制
  ~ top -Hp 1893
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
19163 admin     20   0 5056m 2.2g  56m S  1.7 27.6  17:39.97 java
10649 admin     20   0 5056m 2.2g  56m S  0.7 27.6   4:07.64 java
5884 admin     20   0 5056m 2.2g  56m S  0.3 27.6   2:18.19 java
10650 admin     20   0 5056m 2.2g  56m S  0.3 27.6   1:24.77 java

通过执行top -Hp 1893命令,我们可以发现,当前进程 ID 为 1893 的 Java 进程中,线程 ID 为 19163 的线程占用 CPU 最高,大约达到 1.7%。

PS:top 命令的输出结果是动态变化的,会随着系统情况的变化实时更新。

CPU 使用率的计算逻辑

描述系统 CPU 使用情况主要包括以下几个方面:

  • user: 自系统启动以来,CPU 处于用户态运行的时间,不包括 nice 值为负的进程。
  • nice: 自系统启动以来,CPU 中 nice 值为负的进程占用的时间。
  • system: 自系统启动以来,CPU 处于内核态运行的时间。
  • idle: 自系统启动以来,CPU 除了 iowait 以外的空闲等待时间。
  • iowait: 自系统启动以来,CPU 等待 IO 操作完成的时间。
  • irq: 自系统启动以来,CPU 处理硬中断花费的时间。
  • softirq: 自系统启动以来,CPU 处理软中断花费的时间。
  • steal: 自系统启动以来,CPU 被其他虚拟环境中的操作系统“偷走”的时间。
  • guest: 自系统启动以来,CPU 运行在通过 Linux 内核控制的客户操作系统上的虚拟 CPU 的时间。
  • guest_nice: 自系统启动以来,CPU 运行在通过 Linux 内核控制的客户操作系统上的 nice 值为负的虚拟 CPU 的时间。

理解了以上参数的含义,计算某段时间内的 CPU 使用率并不复杂。假设我们有两个时间点,t1 和 t2,可以通过以下公式来计算 CPU 在这段时间内的总使用时间:

代码语言:shell
AI代码解释
复制
( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2 + steal2 + guest2 + guest_nice2 ) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1 + steal1 + guest1 + guest_nice1)

CPU 的空闲时间:

代码语言:shell
AI代码解释
复制
(idle2 -idle1)

CPU 在 t1 和 t2 时间内的使用率:

代码语言:shell
AI代码解释
复制
CPU非空闲时间/CPU总时间*100%=(1-CPU的空闲时间/CPU总时间)*100%

则:

代码语言:shell
AI代码解释
复制
CPU(t1,t2)使用率:1-(idle2-idle1)/(( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2 + steal2 + guest2 + guest_nice2 ) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1 + steal1 + guest1 + guest_nice1))

CPU 利用率和负载

很多朋友常常分不清楚 CPU 利用率和负载之间的区别与联系。

CPU 利用率是对某一时间段内 CPU 使用情况的统计,通过这个指标可以了解 CPU 在特定时间段内被使用的情况。

而 CPU 负载(Load)则是对某一时间段内 CPU 正在处理和等待处理的进程数之和的统计信息,也可以理解为 CPU 使用队列的长度统计。

可以用一个比喻来解释,将 CPU 的使用比作排队打电话:

我们可以将 CPU 比喻为一个电话亭,每一个进程就像是需要打电话的人。假设有一个单核计算机,现在有 10 个人需要使用电话(代表 10 个进程)。电话使用规则是管理员按顺序给每个人分配 1 分钟的通话时间。如果一个人在 1 分钟内完成通话,他可以将电话交还给管理员。但如果在 1 分钟内没有完成通话,他需要重新排队等待再次分配。在电话亭使用过程中,会有人打完电话离开,有人没打完电话选择重新排队,也会有新人来排队,这种人数的变化就相当于任务数的增减。

CPU 负载统计了一段时间内所有正在使用电话的人以及等待分配电话的人数的平均值。为了得到平均负载情况,我们每 5 分钟统计一次人数,并在第 1、5、15 分钟时取平均值,从而得到 1、5、15 分钟的平均负载。

而 CPU 利用率则统计了进程实际使用电话的时间与在电话亭内停留的总时间的比率。例如,一个用户获得了 1 分钟的使用权,在 10 秒内打了电话,接着花了 20 秒查电话簿,剩下的 30 秒又打了一个电话。那么他的利用率就是(10+30)/60。

Java Web 应用 CPU 使用率飙高排查思路

当发现系统的 CPU 使用率突然升高,首先需要确定是哪个进程造成了 CPU 负载的增加。在 Java 代码中,导致 CPU 占用高的原因可能包括以下几点:

  1. 内存泄漏导致大量 Full GC:例如典型的 Java 1.7 之前的 String.subString 方法可能会导致内存泄漏问题,进而引发频繁的 Full GC 操作。
  2. 代码中存在死循环:特别是在多线程场景下,使用不当的数据结构如 HashMap 可能导致死循环,使得某些线程消耗大量 CPU 资源。

解决这些问题的基本步骤是首先定位占用 CPU 较多的进程和线程,然后通过相应的命令查看这些线程的执行情况,并分析代码以定位问题。

关键在于熟练使用 jstack、jstat 以及 jmap 等工具来定位和解决 Java 进程中的问题。

那么如何在真实环境中排查 CPU 飙高的问题呢?由于本篇幅过长,感兴趣的小伙伴可以关注,下期出。

如有问题,欢迎微信搜索【码上遇见你】。

好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。


我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于Linux性能调优中系统CPU监测信息统计的一些笔记
人总是害怕去追求自己最重要的梦想,因为他们觉得自己不配拥有,或者觉得自己没有能力去完成。——保罗.柯艾略《牧羊少年奇幻之旅》
山河已无恙
2023/03/02
9140
关于Linux性能调优中系统CPU监测信息统计的一些笔记
性能测试必备知识(7)- 深入理解“CPU 使用率”
https://www.cnblogs.com/poloyy/category/1806772.html
小菠萝测试笔记
2020/07/30
3.7K0
性能测试必备知识(7)- 深入理解“CPU 使用率”
grafana展示的CPU利用率与实际不符的问题探究
最近看了一个虚机的CPU使用情况,使用mpstat -P ALL命令查看系统的CPU情况(该系统只有一个CPU core),发现该CPU的%usr长期维持在70%左右,且%sys也长期维持在20%左右:
charlieroro
2023/02/25
1.3K0
grafana展示的CPU利用率与实际不符的问题探究
CPU负载与CPU使用率可不是一回事
存储、内存和 CPU(中央处理器)等系统资源不足会极大地影响应用程序的性能。因此,监控这些组件至关重要。
IT运维技术圈
2022/06/27
4320
Linux 性能观测之CPU平均负载
99%的焦虑都来自于虚度时间和没有好好做事,所以唯一的解决办法就是行动起来,认真做完事情,战胜焦虑,战胜那些心里空荡荡的时刻,而不是选择逃避。不要站在原地想象困难,行动永远是改变现状的最佳方式
山河已无恙
2024/08/29
2100
Linux 性能观测之CPU平均负载
计算 Linux CPU 利用率
在 Linux 系统中的 /proc/stat 文件中存储了CPU 活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。不同内核版本中该文件的格式可能不大一致,以下通过实例来说明数据该文件中各字段的含义。
宋天伦
2020/07/16
2.2K0
CPU负载与CPU使用率之区别
1、简介 存储、内存和 CPU(中央处理器)等系统资源不足会极大地影响应用程序的性能。因此,监控这些组件至关重要。
名字是乱打的
2022/07/17
2K0
某个应用的 CPU 使用率居然达到 100%,我该怎么办?
通过前两节对平均负载和 CPU 上下文切换的学习,我相信你对 CPU 的性能已经有了初步了解。不过我还是想问一下,在学这个专栏前,你最常用什么指标来描述系统的 CPU 性能呢?我想你的答案,可能不是平均负载,也不是 CPU 上下文切换,而是另一个更直观的指标—— CPU 使用率。
米开朗基杨
2019/08/29
2.4K0
某个应用的 CPU 使用率居然达到 100%,我该怎么办?
LINUX下查看CPU使用率的命令
今天就来好好学习下Linux下如何查看CUP的使用率: 监控CPU的性能一般包括以下3点:运行队列、CPU使用率和上下文切换。 对于每一个CPU来说运行队列最好不要超过3,例如,如果是双核CPU就不要超过6。如果队列长期保持在3以上,说明任何一个进程运行时都不能马上得到cpu的响应,这时可能需要考虑升级cpu。另外满负荷运行cpu的使用率最好是user空间保持在65%~70%,system空间保持在30%,空闲保持在0%~5% 。
软测小生
2019/07/05
50.3K0
LINUX下查看CPU使用率的命令
linux性能分析60秒
掌握一些性能优化工具和方法,这就需要在工作中不断地积累;计算机基础知识很重要,比如说网络知识、操作系统知识等等,掌握了基础知识才能让你在优化过程中抓住性能问题的关键,也能在性能优化过程中游刃有余。
没有故事的陈师傅
2021/08/13
1K0
Linux CPU监控
负载为1表示当前单核CPU全部占用,如果一台机器有3个CPU,每个CPU都是双核的,这是负载最大值为1×2×3=6。如果5分钟以及15分钟的负载指标的大于CPU个数×CPU核数×0.7,并且长时间比较高,说明CPU不够用。
顾翔
2020/06/01
10.8K0
Linux CPU监控
聊聊 top 命令中的 CPU 使用率
平常我们使用 top 命令来查看系统的性能情况,在 top 命令中可以看到很多不同类型的 CPU 使用率,如下图红框中标出部分:
用户7686797
2021/06/15
4.9K0
聊聊 top 命令中的 CPU 使用率
CPU状态信息us,sy等含义
比如一秒内有100个cpu时间片,这个cpu时间片就是cpu工作的最小单位。那么这100个cpu时间片在不同的区域和目的进行操作使用,就代表这个区域所占用的cpu时间比。也就是这里得出的cpu时间百分比。
陈不成i
2021/05/24
7.7K0
top命令输出详解
Linux下的top命令我相信大家都用过,自从我接触Linux以来就一直用top查看进程的CPU和MEM排行榜。但是top命令的其他输出结果我都没有了解,这些指标都代表什么呢,什么情况下需要关注呢?以及top命令输出结果的来源数据是什么呢,又是怎么一个计算原理呢?
用户2937493
2019/08/29
2.2K0
Linux常用系统性能监控命令
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写, 是实时系统监控工具。该命令通过使用knlist子程序和/dev/kmen伪设备驱动器访问这些数据,输出信息直接打印在屏幕。vmstat反馈的与CPU相关的信息包括:
知忆
2021/06/12
8060
五分钟带你掌握Linux系统查看CPU使用率、内存使用率、磁盘使用率
%us:表示用户空间程序的cpu使用率(没有通过nice调度) %sy:表示系统空间的cpu使用率,主要是内核程序。 %ni:表示用户空间且通过nice调度过的程序的cpu使用率。 %id:空闲cpu %wa:cpu运行时在等待io的时间 %hi:cpu处理硬中断的数量 %si:cpu处理软中断的数量 %st:被虚拟机偷走的cpu 注:99.0 id,表示空闲CPU,即CPU未使用率,100%-99.0%=1%,即系统的cpu使用率为1%。
不吃小白菜
2021/03/02
19.5K0
Linux服务器性能分析之CPU利用率
合理值:60-85%,如果在一个多用户系统中us+sy时间超过85%,则进程可能要花时间在运行队列中等待,响应时间和业务吞吐量会受损害;us过大,说明有用户进程占用很多cpu时间,需要进一步的分析其它软硬件因素;sy过大,说明系统管理方面花了很多时间,说明该系统中某个子系统产生了瓶颈,需要进一步分析其它软硬件因素。
Bug开发工程师
2019/05/05
3.6K0
Linux服务器性能分析之CPU利用率
计算CPU利用率
一般来说对于需要大量cpu计算的进程,当前端压力越大时,CPU利用率越高。但对于I/O网络密集型的进程,即使请求很多,服务器的CPU也不一定很到,这时的服务瓶颈一般是在磁盘的I/O上。比较常见的就是,大文件频繁读写的cpu开销远小于小文件频繁读写的开销。因为在I/O吞吐量一定时,小文件的读写更加频繁,需要更多的cpu来处理I/O的中断。 在Linux/Unix下,CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是
三丰SanFeng
2018/01/16
5.2K0
深入 Nodejs 源码探究 CPU 信息的获取与利用率计算
在 Linux 下我们通过 top 或者 htop 命令可以看到当前的 CPU 资源利用率,另外在一些监控工具中你可能也遇见过,那么它是如何计算的呢?在 Nodejs 中我们该如何实现?
五月君
2020/05/19
1.8K0
如何查看Linux系统的CPU使用率?
top 命令是一个动态查看系统进程和资源使用情况的工具。它可以显示系统的整体资源使用情况,包括CPU使用率。
用户11163528
2025/03/05
8290
相关推荐
关于Linux性能调优中系统CPU监测信息统计的一些笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档