如何理解CPU利用率(译文)

以下这段文字翻译自技术大牛Brendan Gregg和Jim Mauro 2011年的著作:《DTrace: Dynamic Tracing in Oracle Solaris, Mac OS X and FreeBSD》第三章《System View》里关于CPU利用率的一个介绍(56页)。个人觉得写得很清晰,就把它翻译出来,希望能让更多人对CPU利用率有正确的理解。翻译有错之处,还希望大家批评指正。

在信息技术领域,CPU利用率作为一个重要能力度量指标已经有了很多年的历史了,它可以通过很多传统的“stat”工具得到(像Solaris的vmstat(1M)命令,等等)。随着处理器技术的演进,CPU利用率作为一个度量指标的实际意义和满意度正在减弱。拥有多个处理器的系统,拥有多核的处理器,拥有多个线程的处理器核,拥有多个执行单元(整数,浮点数)并允许多个线程并发地执行指令的处理器核等等这些因素,都会使我们对CPU利用率真正含义产生曲解,而不管CPU运行何种操作系统。

一个具体的例子是内存总线访问。当等待内存总线完成数据传输时,CPU的“装载”和“存储”指令也许会使CPU停下来。而这些停下来时耗费时钟周期发生在执行一条CPU指令期间,所以会被算作利用率,虽然可能和人们期待的不一样(虽然在使用却是在等待!)。

应用程序的并行化程度也是一个影响因素;一个单线程程序可以让一个CPU的利用率达到百分之百,却让其它CPU处于空闲状态。在一个拥有多个CPU的系统上,这种情况将使统计工具显示很低的系统级别的CPU利用率,而这很可能使你不会去深入了解CPU状态。一个充满竞争锁的多线程程序也许会使多个CPU的用率达到百分之百,而其中很多线程都在竞争锁,而不是真正地处理它们应该完成的任务。因此仅仅通过CPU利用率,并不足以让我们确定CPU本身是不是真正的性能问题。

清楚地了解CPU正在做什么(处理指令或是等待内存访问完成,正在执行用户应用程序还是操作系统内核程序)对我们将是很有益的。