如何获取启用多核超线程的 CPU 的真实使用情况?
例如,让我们考虑一个 2 核 CPU,表示 4 个虚拟核心。
单线程工作负载现在将显示为 100% top
,因为虚拟核心中的一个核心已完全使用。CPU 和top
工作正常,就像有 4 个真实核心一样。
但是,如果有两个线程,事情就变得棘手了:如果一切正常,它们会平衡到两个真实核心,因此我们得到了 200% 的使用率:两倍 100% 和两个空闲虚拟核心,并且正在使用所有可用的 CPU 功率。在我看来还不错。
但是,如果两个线程在一个真实内核上运行,则它们会显示使用两倍 100% 的资源,即虚拟内核使用率为 200%。但实际上,一个内核会将其能力共享给两个线程,因此这两个线程仅使用了总 CPU 能力的一半。
因此显示的使用率数字top
不能用来衡量总体 CPU 工作量。
我还想知道超线程如何在真实核心上平衡两个虚拟核心。如果两个线程占用不同的周期数,虚拟核心是否会“适应”,以便即使实际负载不同,两个核心都显示 100% 负载?
答案1
Oracle 的 Martin Tegtmeier 去年写了一篇关于此问题的有趣博客文章: https://blogs.oracle.com/solaris/cpu-utilization-of-multi-threaded-architectures-explained-v2
简短的回答是:超线程确实会影响 top 报告总体 CPU 利用率/CPU 空闲百分比的能力。
在最坏的情况下,2 核 4 虚拟核 CPU 以 100% 的每核利用率运行 2 个线程,几乎会使 CPU 饱和。(取决于执行端口使用情况;只有使用 CPU 上完全不同的计算资源的线程才能运行,而不会影响当前线程的性能。)但是,在这种情况下,top 仍会报告 50% 的空闲率。
答案2
核心利用率与系统负载有很大不同。核心利用率仅显示核心计算或等待指令的时间。它可以是 100%,这对应于 CPU 计算某事的任何给定时间。
但负载是另一回事,负载通常用于确定任何进程是否必须等待任何资源。如果进程没有等待任何资源,您将看到一个性能非常高的系统。但有时您会看到系统运行缓慢但 CPU 利用率低。这通常意味着某些进程正在等待资源而不释放 CPU。对于这种情况,您不会看到高 CPU 利用率,但系统可能远远超出其容量。
在 Linux 系统中,平均负载是一个计算值,用于衡量系统的整体性能。平均负载的值应与并行计算资源(具体来说是核心)进行比较。因此,如果具有 4 个物理核心的系统的平均负载为 4 或更多,我们可以肯定地说某些进程将等待资源。
CPU 利用率是 100% 还是 10% 并不重要。平均负载可能高达 200 或 300,在这种情况下系统几乎不会响应。
在正常运行条件下,服务器平均负载不应长时间超过核心数。我认为短暂的峰值并不重要。您将在输出中看到的 3 个数字w
是 1/5/15 分钟的平均负载。
答案3
我认为以上答案都不令人满意。
我认为以下链接中提到的文章可以很好地回答这个问题: http://perfdynamics.blogspot.ch/2014/01/monitoring-cpu-utilization-under-hyper.html
引用:
HT 背后的想法是,当当前正在运行的应用程序由于分支预测错误、管道中的气泡等原因而停滞时,允许不同的应用程序线程运行。要实现这一点,必须有另一个端口或 AS 寄存器。启用 HT 后,该寄存器对操作系统可见。但是,操作系统(以及所有食物链上游到您使用的任何性能工具)现在认为处理器容量是可用的两倍,即每个 AS 端口的 CPU 为 100%。
但在引擎盖下,仍然只有一执行单元:在启用 HT 之前您开始使用的单个物理核心。不同之处在于它以某种方式在 2 个 AS 端口之间共享。单个核心如何在两个端口之间切换非常复杂,但最容易理解的是轮询队列。我在 GCaP 课程中详细介绍了这一层次。
我进行的最佳测试测量表明,每个 HT 端口的平均繁忙程度不能超过 75%,或者操作系统所预期的总容量 200% 的 150%。我之前提到的“缺失”的 50% 容量是一种假象。英特尔声称,对于一般应用程序,可以预期 120% 到 130% 的容量。
事实上,我非常确定操作系统在每个虚拟核心上都可以达到 100%,这一点毫无疑问。我刚刚做了:
mvn clean install -DskipTests -T 5
我可以向你保证,我的 8 个虚拟核心和 4 个物理核心的 CPU 利用率都达到了 100%。而我的机器上绝对没有 8 个核心。
长话短说,如果总 CPU 负载超过 100%,您可以假设以下情况:您最多(而且很可能非常准确地)使用了 100% 的物理核心。这意味着,如果您将物理核心 1 分为操作系统 CPU 1 和 CPU 2。并且 CPU 1 的总使用率为 50%,CPU 2 的总使用率为 50%,那么在现实生活中,您很可能对该 CPU 施加了 100% 的总使用压力。您已经将其最大化了。
但是,操作系统的系统监控工具当然不知道它正在向您出售幻觉。从操作系统及其资源管理方式的角度来看,它只会认为这两个虚拟核心中的每一个仍有 50% 的空闲时间,因此如果有更多任务要运行,它会尝试将它们均匀地分配到这两个核心上。因此,当 CPU 利用率超过 100% 时,在 CPU 使用率期间,总会有排队的工作要在该时间段内运行,而这些工作从未有机会获得 CPU 的时间片。最终它会得到它,但总会有一些线程实际上甚至没有运行,即使它们被安排运行。
谢谢