stall
当CPU执行时,所需的数据不在寄存器或cache中。需要去内存加载数据,这期间CPU没有工作,等待,称stall。
CPU的利用率的数据包括了CPU的stall。stall通常包含数百 clock cycles。
一般由资源竞争、数据依赖等原因造成。管厂商通过增大 cache 容量、优化 cache 策略、提升总线带宽来试图缓解访存瓶颈,但我们的程序仍深受 CPU stall 困扰。
核心度量指标是 IPC(instructions per cycle)。
如果 IPC < 1.0, 很可能是 Memory stall 占主导,可从软件和硬件两个方面考虑这个问题。软件方面:减少不必要的访存操作,提升 cache 命中率,尽量访问本地节点内存;硬件方面:增加 cache 容量,加快访存速度,提升总线带宽。
如果IPC > 1.0, 很可能是计算密集型的程序。可以试图减少执行指令的数量:消除不必要的工作。火焰图CPU flame graphs,非常适用于分析这类问题。硬件方面:尝试超频、使用更多的 core 或 hyperthread。作者根据PMU相关的工作经验,设定了1.0这个阈值,用于区分访存密集型(memory-bound)和计算密集型(cpu-bound)程序。读者可以根据自己的实际工作平台,合理调整这个阈值。
除了访存导致的 stall 容易让人误解 CPU 利用率外,还有其他一些因素:
温度原因导致处理器 stall;
Turboboost 干扰了时钟速率;
内核使得时钟速率加快;
平均带来的问题:1分钟利用率平均 80%,掩盖了中间 100% 部分;
自旋锁: CPU 一直在被使用,同时 IPC 也很高,但是应用逻辑上并没有任何进展。