cpu 性能

我们平时使用的CPU利用率方法是极具误导性的,并且一年更甚一年。那么什么是CPU利用率?是你的CPU到底有多忙,是像“% CPU”这样到处在用的指标所显示的那样吗?

在top命令里,你看到90%的CPU利用率是这样:

然而它真正想表达的是这个意思:

Stall(这里译作“怠速”)是说这个处理器没有在跑指令,比如在等待内存I/O的时候。我上图所画的比例(“忙”与“怠速”之间)是我在真实生产环境中遇到的,并且你的CPU也很可能是处于“怠速”状态。

这些对你有什么意义呢?理解CPU怠速多少,会直接影响到你在减少代码或者减少内存I/O的调优工作。

那么真正的CPU利用率怎么算呢?

平时的CPU利用都是非空闲时间,即CPU不运行idle线程(比如Windows里的空闲进程)的时间。你的操作系统那会平时会在上下文切换的时候跟踪它,但是假如一个非idle线程开始运行100毫秒后停止,那内核会认为后面这段时间CPU也在这个非idle线程上。

在老旧的分时系统里,这么算没毛病。阿波罗登月舱的导航系统计算机将这里的idle线程叫做“DUMMY JOB”,工程师用利用它来测算计算机的利用率,可以参考之前我写过的这样一篇文章(链接地址:http://www.brendangregg.com/usemethod.html#Apollo)。

那么它有什么毛病呢?

现在的CPU比内存已经快了很多倍,但等待内存的时间仍然被算进CPU时间中。当你在top命令中看到较高的“%CPU”的时候,你可能认为它到达了一个性能瓶颈,就是散热片和风扇下面的那个CPU,但实际上,这是那一根根内存条的锅。

如何分辨CPU到底在忙啥?

使用性能监测计数器(PMC)——一种能够用perf或者其他工具命令查看的硬件计数器。比如,观测整个系统10秒钟:


# perf  stat -a -- sleep 10

Performance  counter stats for ‘system wide‘:

641398.723351      task-clock  (msec)         #   64.116  CPUs  utilized            (100.00%)

379,651      context-switches                  #    0.592  K/sec                    (100.00%)

51,546      cpu-migrations                      #    0.080  K/sec                    (100.00%)

13,423,039      page-faults                       #    0.021 M/sec

1,433,972,173,374      cycles                         #    2.236  GHz                      (75.02%)

<not  supported>      stalled-cycles-frontend

<not  supported>      stalled-cycles-backend

1,118,336,816,068      instructions              #    0.78  insns  per cycle          (75.01%)

249,644,142,804      branches                    #  389.218  M/sec                    (75.01%)

7,791,449,769      branch-misses               #    3.12% of all  branches          (75.01%)

10.003794539  seconds time elapsed

这里的一个关键指标就是instructions per cylce(IPC,每CPU周期执行指令数),它能够显示每CPU周期内每个CPU运行了多少指令,越高说明效率越高。上述示例中,这一值为0.78,但这并不说明CPU利用率为78%,因为现代CPU的IPC最大值为4.0(新的已经到了5.0),也就是4-wide。CPU在执行指令时,单个指令会被分割为多个步骤,比如取指令、解码、执行、内存访问、写寄存器等,这些命令如果在单个CPU周期内最多执行一个,那么需要5个CPU周期来完成一条命令,IPC就是0.2,如果采用指令流水线,即3~5-wide的CPU,那么完美状态下1个CPU周期就可以完成一条命令,IPC就是1。(译者注:作者文中使用了CPU clock cycle表示通常所说的CPU周期,为了避免与晶振时钟周期混肴我并没有将其译为CPU时钟周期。)

当然,还有数百个其他你可以用来测量的性能计数器。

如果在虚拟化环境中,guest一般不能直接访问PMC,这取决于hypervisor是否支持。我最近写的一篇The PMCsof EC2: Measuring(链接地址:http://www.brendangregg.com/blog/2017-05-04/the-pmcs-of-ec2.html) IPC展示了AWS EC2中基于Xen的虚拟机如何使用PMC。

最佳实践

如果你的IPC小于1.0,你可能遇到了内存操作密集型,软件调优策略可以有减少内存I/O,增强内存本地访问性,尤其是在NUMA系統上。硬件调优策略则是使用CPU cache较大以及更快的内存、总线和内联技术。

如果你的IPC > 1.0,你可能是指令密集型。可以试图减少指令的执行数量,比如消除不必要的工作和缓存操作等,可以用一下CPU火焰图(链接地址:http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html)。硬件调优方面,可以尝试高主频、多核、超线程的CPU。

性能检测产品应该告诉你什么呢?

性能检测工具都应该显示出每个进程的IPC,或者是按照指令周期与怠速周期,比如%INS和%STL,下图为Linux中的tiptop命令:


tiptop  -                  [root]

Tasks:  96  total,   3  displayed                                screen  0: default

PID  [ %CPU] %SYS    P   Mcycle    Minstr   IPC  %MISS  %BMIS  %BUS  COMMAND

3897    35.3  28.5    4   274.06    178.23  0.65   0.06   0.00   0.0 java

1319+   5.5    2.6    6    87.32    125.55  1.44   0.34   0.26   0.0  nm-applet

900    0.9    0.0    6    25.91    55.55  2.14    0.12   0.21   0.0 dbus-daemo

CPU利用率具有误导性的其他理由

  1. 使得这个%CPU指标错误的理由除了CPU在内存的怠速周期外,还有如下因素:
  2. 温度也能使CPU进入怠速;
  3. Turboboost(睿频)引起时钟频率变化;
  4. SpeedStep引起时钟频率变化;
  5. 一分钟内的80%的平均利用率并不能表示100%的突发利用率(类似网络QoS);
  6. 自旋锁:CPU在很严肃地瞎忙;

Update: CPU利用率真的错了吗?

自这篇文章发布以后,留言讨论非常激烈,已经有了上百条了。首先谢谢你们对这话题感兴趣并花时间阅读,但我在这里还是要统一回复:我对disk的iowait并不关心(译者注:PC CPU不能直接操作外部存储),并且文中也已经给出了内存操作密集型的对应调优措施。

然而,CPU利用率到底是从本质上错了还是仅仅是有误导性了?我认为需要人将高CPU利用率视为处理单元的瓶颈的事儿,是错的。那么这个指标的计算方法从技术上讲正确吗?如果CPU在怠速期间不能被其他任何进程使用,那么这不就是所谓的“使用等待”(听起来有点矛盾)。某些情况下,%CPU作为一个操作系统层面的指标是技术正确但是容易误导人的。在超线程中,怠速周期可以被其他线程使用,所以%CPU的算法也会将其算在内,而实际上并没有利用。那样是不对的,这篇文章中我强调的是解释问题并提出对策,并且,这个指标也有技术上的问题。

结论

CPU利用率已成为一个极具误导性的指标:它算进了等待主存的周期,而这类周期在现代的CPU负载中占据不少。如果使用额外指标,你就能搞清楚%CPU到底意味着什么,包括每CPU周期执行指令数(IPC)。IPC < 1.0可能意味着你的应用是内存密集型,而IPC > 1.0则可能是指令密集型。我在之前的一篇文章,显示%CPU的性能监控产品也应该显示PMC测量指标,并给予充分解释,这样才不会误导用户。比如,它们可以一起显示%CPU和IPC,或者指令周期与怠速周期。有了这些指标,开发或管理人员才能在应用和操作系统中选择正确的调优方式。

译者的话

本文翻译自Brendan Gregg的博客文章《CPU Utilization is Wrong》,原文链接为http://www.brendangregg.com/blog/2017-05-09/cpu-utilization-is-wrong.html,就是那本《性能之巅(中译)》的作者,调试工具dtrace的作者,现就职于NetFlix。

PS:为什么要翻译这个文章呢?因为很多时候总感觉PC的这个CPU利用率的百分比显示没能真实反应我的CPU到底忙不忙,在学校的时候用单片机也是算idle,但到了PC后隐约感觉这么算不对,看了BG的文章后才恍然大悟。另外这篇文章之前已经被翻译过,但作者又有更新,也挺有意思的,我就重新翻了一遍,并加了一些弹幕。

时间: 2024-08-11 07:44:48

cpu 性能的相关文章

CPU性能压测

有时候为了项目需求需要对CPU性能做一个压力测试,这里提供一种方法.通过对圆周率位数进行计算进而确定CPU性能,根据定义预计执行时间,具体操作如下: time echo "scale=1000; 4*a(1)" | bc -l -q 通过该命令运行,如果3.4分钟没有出现结果,基本问题就可以定位在CPU上,这里我通过自己的测试机,得出如下数字: "scale=1000; 4*a(1)"这个表达式具体什么意思我没看明白,但是大概意思应该是将该表达式的交给计算器bc来处

笔记本电脑最新CPU性能天梯图

笔记本电脑最新CPU性能天梯图

ARM CPU与Intel x86 CPU性能比较

Qualcomm ARM CPU与Intel x86 CPU性能比较 随着移动互联网时代的到来,Qualcomm(高通).Texas Instruments(德州仪器)等基于ARM架构的CPU受到越来越多人的关注,而昔日王者的Intel x86架构由于功耗问题,在移动互联网似乎举步维艰. Intel x86架构对比于ARM架构来说,性能强大,功耗较高是大家都知道的事实.那Intel x86架构的CPU性能究竟比ARM架构的强多少呢?下面我们对单个Core做一个简单的评测. 我的PC机CPU:In

linux查看CPU性能及工作状态的指令

衡量CPU性能的指标: 1,用户使用CPU的情况:CPU运行常规用户进程CPU运行niced processCPU运行实时进程 2,系统使用CPU情况:用于I/O管理:中断和驱动用于内存管理:页面交换用户进程管理:进程开始和上下文切换 3,WIO:用于进程等待磁盘I/O而使CPU处于空闲状态的比率. 4,CPU的空闲率,除了上面的WIO以外的空闲时间 5,CPU用于上下文交换的比率 6,nice 7,real-time 8,运行进程队列的长度 9,平均负载 Linux中常用的监控CPU整体性能的

intel和AMD CPU性能对比(2016年CPU天梯图)组装电脑必读!

http://www.365pcbuy.com/article-411.html 特别提示:此文已经于2016年10月12日更新!内容变动较大,请细细品鉴! 如何为客户推荐高性价比机型是我站的重要工作.极速站长-pc小虫从1995年2月安装自己第一台386DX/40电脑以来,21年来一直从事电脑软硬件工作,经历了整个家用电脑的发展历程,接触过上万台不同配置机器,精通各类电脑硬件.精通多种软件.服务器配置,拥有专利产品一项,热心传授知识.2003年pc小虫开办了成都第一个无盘网络培训班,2005年

Intel台式机CPU性能对比分析(不定期更新)

Intel台式机CPU性能对比(综合) 双核-四核CPU(综合) 型号 主频/睿频 核心/线程 制程 功耗 三级Cache 核显 内存控制 i7-6700K 4.0/4.2GHz 4/8 14nm 95W 8MB HD 530 DDR4-2133 i7-6700 3.4/4.0GHz 4/8 14nm 65W 8MB HD 530 DDR4-2133 i7-6700T 2.8/3.6GHz 4/8 14nm 35W 8MB HD 530 DDR4-2133 i7-4790K 4.0/4.4GHz

linux查看CPU性能及工作状态的指令mpstat,vmstat,iostat,sar,top

衡量CPU性能的指标: 1,用户使用CPU的情况:CPU运行常规用户进程CPU运行niced processCPU运行实时进程 2,系统使用CPU情况:用于I/O管理:中断和驱动用于内存管理:页面交换用户进程管理:进程开始和上下文切换 3,WIO:用于进程等待磁盘I/O而使CPU处于空闲状态的比率. 4,CPU的空闲率,除了上面的WIO以外的空闲时间 5,CPU用于上下文交换的比率 6,nice 7,real-time 8,运行进程队列的长度 9,平均负载 Linux中常用的监控CPU整体性能的

CPU性能监测介绍

CPU的性能监测包含以下部分: * 检查系统运行队列并确保每个核心上不超过3个可运行进程* 确保CPU利用率的用户时间和系统时间在70/30之间* 当CPU花费更多的时间在system mode上时,更有可能是因过载而试图重新调度优先级* 运行CPU限制型应用比IO限制型应用更易出现性能瓶颈 性能调优是找出系统瓶颈并消除这些瓶颈的过程.很多系统管理员认为性能调优仅仅是调整一下内核的参数即可解决问题,事实上情况并不是这样.性能调优是实现操作系统的各个子系统之间的平衡性,这些子系统包括: * CPU

SylixOS中CPU性能计算

1.概述 本篇主要介绍SylixOS中CPU性能计算方法. 2.简介 BogoMips是SylixOS中衡量CPU运行速度的一种标准,但只能用来粗略计算CPU的性能,并不十分精确. SylixOS中关于CPU性能计算的方法位于内核文件"libsylixos/SylixOS/kernel/interface/CpuPerf.c"中. 3.接口及具体实现 SylixOS内核中定义了用于计算CPU运算速度的相关接口. 3.1 接口介绍 #include <SylixOS.h> U

CPU性能分析

CPU性能分析工具 lscpu:查看CPU硬件信息 lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Thread(s) per core: 1 Core(s) per socket: 1 Socket(s): 4 NUMA node(s): 1 Vendor ID: GenuineIntel CPU fami