电脑cpu负载过高怎么解决 cpu利用率多少正常


电脑cpu负载过高怎么解决 cpu利用率多少正常

文章插图
电脑cpu负载过高怎么解决 cpu利用率多少正常

文章插图
导读:本文翻译自 Brendan Gregg 去年的一篇博客文章 “CPU Utilization is Wrong”,从标题就能想到这篇文章将会引起争议 。文章一上来就说,我们“人人皆用、处处使用,每个性能监控工具里都在用”的 top 命令里的 “%CPU” 指标,是不对的,其并非用于衡量 CPU 的繁忙程度的正确指标,作者谴责了一下众人(或许也包括你我)的这一行为是具有很大的误导性(deeply misleading)的,而且这种情况还在连年恶化 。对于这么大一顶帽子 , 让我们暂且按下躁动的心,听听作者是怎么深入阐释他的观点的 。
1. 引言可能你认为的 90% CPU 利用率意味着这样的情形:
电脑cpu负载过高怎么解决 cpu利用率多少正常

文章插图
而实际却可能是这样的:
电脑cpu负载过高怎么解决 cpu利用率多少正常

文章插图
CPU 并非 90% 的时间都在忙着,很大一部分时间在等待,或者说“停顿(Stalled)”了 。这种情况表示处理器流水线停顿,一般由资源竞争、数据依赖等原因造成 。多数情况下表现为等待访存操作 , 其中又以读操作为主 。在停顿周期内,不能执行指令,这意味着你的程序不往前走 。
值得注意的是,图中 “Stalled” 状态所占的比例是作者依据生产环境中的典型场景计算而来,具有普遍现实意义 。因此,大多时候 CPU 处于停顿状态 , 而你却不知道,因为 CPU 利用率这个指标没有告诉你真相 。通过进一步分析 CPU 停顿的原因,可以指导代码优化,提高执行效率,这是我们深入理解CPU微架构的动力之一 。
2. CPU 利用率的真实含义是什么?我们通常所说的CPU利用率是指 “non-idle time”:即CPU不执行 idle thread 的时间 。操作系统内核会在上下文切换时记录CPU的运行时间 。假设一个 non-idle thread 开始运行 , 100ms 后结束,内核会认为这段时间内 CPU 利用率为 100% 。这种度量方式源于分时复用系统 。早在阿波罗登月舱的导航计算机中,idle thread 当时被叫做 “DUMMY JOB”,工程师通过比对运行 “DUMMY JOB” 和 “实际任务” 的时间来衡量导航系统的利用率 。那么这个所谓“利用率”的问题在哪儿呢?当今时代,CPU 执行速度远远大于内存访问速度,等待访存的时间成为占用 CPU 时间的主要部分 。当你在 top 中看到很高的 “%CPU”,你可能认为处理器是瓶颈,但实际上却是内存 。在过去很长一段时间内,CPU 频率增长的速度大于 DRAM 访存延时降低的速度(CPU DRAM gap),直到2005年前后,处理器厂商们才开始放弃“频率路线”,转向多核、超线程技术 , 再加上多处理器架构,这些都导致访存需求急剧上升 。尽管厂商通过增大 cache 容量、优化 cache 策略、提升总线带宽来试图缓解访存瓶颈,但我们的程序仍深受 CPU stall 困扰 。
3. 如何真正辨别 CPU 在做些什么?在 PMC(Performance Monitoring Counters) 的帮助下,我们能看到更多的 CPU 运行状态信息 。下图中,perf 采集了10秒内全部 CPU 的运行状态 。
电脑cpu负载过高怎么解决 cpu利用率多少正常

文章插图
这里我们重点关注的核心度量指标是 IPC(instructions per cycle) , 它表示平均每个 CPU cycle 执行的指令数量,很显然该数值越大性能越好 。上图中IPC 为 0.78 , 看起来还不错,是不是 78% busy 呢?现代处理器一般有多条流水线,运行 perf 的那台机器,IPC 的理论值可达到 4.0 。

推荐阅读