CPU使用率是描述系统CPU性能的最常用索引。
CPU使用率是单位时间CPU使用率的统计信息,以百分比显示。那么,** CPU使用率是如何精确计算的呢?然后有%user,%nice,%system,%iowait,%steal等。它们之间有什么区别吗?
CPU使用率
Linux作为多任务操作系统,将每个CPU的时间划分为很短的时间片,然后通过调度程序将它们分配给每个任务,从而产生了多个任务同时运行的错觉。
为了维持CPU时间,Linux通过预定义的心跳率(在内核中表示为HZ)触发时间中断,并使用全局变量Jiffies记录自启动以来的心跳数。每次发生时间中断,Jiffies的值都会增加一。
节拍率HZ是内核的可配置选项,可以将其设置为10 0、 25 0、 1000,依此类推。不同的系统可能会设置不同的值。您可以通过查询/ boot / config内核选项来检查其配置值。示例如下:
$ grep CONFIG_HZ= /boot/config-$(uname -r)
CONFIG_HZ=250
因为拍频HZ是内核选项,所以用户空间程序无法直接访问它。为了方便用户空间程序,内核还提供了用户空间跳动速率USER_HZ,该速率始终固定为100,即1/100秒。这样,用户空间程序不必关心内核中设置了多少HZ,因为它始终会看到固定值USER_HZ。
Linux通过/ proc虚拟文件系统为用户空间提供有关系统内部状态的信息,而/ proc / stat提供系统的CPU和任务统计信息。例如,如果仅关注CPU,则可以执行以下命令:
# 只保留各个CPU的数据
$ 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编号,例如cpu 0、 cpu1,第一行中没有数字的cpu代表所有CPU的累加。其他列表示在不同情况下CPU的累积节拍数。它的单位是USER_HZ,它是10毫秒(1/100秒),因此这实际上是不同情况下的CPU时间。
man proc可以理解特定含义,以了解特定指标的含义。在这里,我们重点关注以下指标的含义:

根据此公式,您可以根据/ proc / stat中的数据轻松计算CPU使用率。当然,也可以将每个场景的CPU时间除以总CPU时间,以计算每个场景的CPU使用率。
直接使用/ proc / stat的数据来计算自启动以来节拍数的累积值,因此直接计算是自启动以来的平均CPU使用率,通常没有参考值。
为了计算CPU使用率,性能工具通常每隔一段时间(例如3秒)取两个值,并且在计算出差异之后,在此时间段内的平均CPU使用率计算得出,即:
此公式是各种性能工具看到的CPU使用率的实际计算方法。
现在我知道系统CPU使用率的计算方法,该过程如何?与系统指示器类似,Linux还提供有关每个进程的运行状态的统计信息,即/ proc / [pid] / stat。但是,此文件中包含的数据更丰富,共有52列数据。需要时,只需检查man proc。
回头看,是否意味着要检查CPU使用率,必须首先读取两个文件/ proc / stat和/ proc / [pid] / stat,然后根据上述公式进行计算?
当然不是。各种性能分析工具已经为我们进行了计算。但是,应注意,性能分析工具会按时间间隔给出平均CPU使用率,因此请注意间隔时间的设置,尤其是在使用多个工具进行比较和分析时,必须确保它们使用相同的时间。间隔时间。
例如,比较两个工具top和ps报告的CPU使用率。默认结果可能会有所不同,因为top默认情况下使用3秒间隔,而ps使用过程的整个生命周期。
如何查看CPU使用率
top和ps是最常用的性能分析工具:
例如,top的输出格式为:

# 默认每3秒刷新一次
$ top
top - 11:58:59 up 9 days, 22:47, 1 user, load average: 0.03, 0.02, 0.00
Tasks: 123 total, 1 running, 72 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8169348 total, 5606884 free, 334640 used, 2227824 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 7497908 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 78088 9288 6696 S 0.0 0.1 0:16.83 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
...
但是,应该注意,默认情况下top显示所有CPU的平均值。此时,您只需按数字1即可切换到每个CPU的利用率。
空白行是进程的实时信息之后,每个进程都有一个%CPU列,该列指示该进程的CPU使用率。它是用户模式和内核模式CPU使用率的总和,包括进程用户空间使用的CPU,通过系统调用执行的内核空间CPU和等待在就绪队列中运行的CPU。在虚拟化环境中,它还包括正在运行的虚拟机占用的CPU。
top没有用于细分进程的用户模式CPU和内核模式CPU。如何检查每个过程的细节? pidstat是一个专用于分析每个进程的CPU使用率的工具。
例如,以下pidstat命令以1秒为间隔显示该进程的5组CPU使用率,包括:
最后的“平均值”部分中,还将计算5组数据的平均值。
# 每隔1秒输出一组数据,共输出5组
$ pidstat 1 5
15:56:02 UID PID %usr %system %guest %wait %CPU CPU Command
15:56:03 0 15006 0.00 0.99 0.00 0.00 0.99 1 dockerd
...
Average: UID PID %usr %system %guest %wait %CPU CPU Command
Average: 0 15006 0.00 0.99 0.00 0.00 0.99 - dockerd
如果CPU使用率过高怎么办?
通过top,ps,pidstat和其他工具,您可以轻松找到CPU使用率较高(例如100%)的进程。接下来,如何查找代码中的哪个功能正在消耗CPU?只有找到它,我们才能更有效,更具体地对其进行优化。
这里推荐Perf。 Perf是Linux 2. 6. 31之后的内置性能分析工具。它基于性能事件采样,不仅可以分析系统的各种事件和内核性能,还可以用于分析指定应用程序的性能问题。
使用性能分析CPU性能问题。这是两种最常见的用法。
第一个常见用法是perf top

类似于顶部,它可以实时显示占用最多CPU时钟的功能或指令,因此可用于查找常用功能。界面如下:
$ perf top
Samples: 833 of event cpu-clock, Event count (approx.): 97742399
Overhead Shared Object Symbol
7.28% perf [.] 0x00000000001f78a4
4.72% [kernel] [k] vsnprintf
4.32% [kernel] [k] module_get_kallsym
3.65% [kernel] [k] _raw_spin_unlock_irqrestore
...
在输出结果中,第一行包含三个数据,即样本数(Samples),事件类型(event)和事件总数(Event count)。例如,在此示例中,perf总共收集了833个CPU时钟事件,事件总数为97742399。
此外,样本数量需要特别注意。如果样本数量太少(例如只有十二个样本),那么以下排序和百分比将无实际参考价值。
向下看是一个表格数据,每一行包含四列,即:
以上面的输出为例。可以看出,性能工具本身占用的CPU时钟最多,但其比例仅为7. 28%,表明系统没有CPU性能问题。
第二个常见用法是性能记录和性能报告
Perf top实时显示系统性能信息,但缺点是它不保存数据,因此不能用于脱机或后续分析。性能记录提供保存数据的功能。保存数据后,需要使用性能报告进行分析和显示。
$ perf record # 按Ctrl+C终止采样
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.452 MB perf.data (6093 samples) ]
$ perf report # 展示类似于perf top的报告
在实际使用中,通常将-g参数添加到perf top和perf记录中,以实现对调用关系的采样,这便于根据调用链分析性能问题。
摘要
CPU使用率是最直观,最常用的系统性能指标,它是在解决性能问题时通常要注意的第一个指标。因此,请熟悉其含义,尤其要弄清楚用户(%user),尼斯(%nice),系统(%system),等待I / O(%iowait),中断(%irq)和软中断(%softirq )这些不同的CPU的使用率。例如:
当遇到CPU使用率增加的问题时,可以使用诸如top和pidstat之类的工具来确认CPU性能问题的根源。然后使用诸如perf之类的工具找出导致性能问题的特定功能。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-362480-1.html
真是两难
小王子
一定会去看的