解释 4 核 8 线程处理器上系统负载的正确方法

解释 4 核 8 线程处理器上系统负载的正确方法

众所周知,1.00在单个处理器上意味着有大量的100%. 类比一下4.00四核上的负载是100%

我应该如何解释 4 核 8 线程处理器上的负载?我什么时候达到 CPU 的最大容量?4.00或者8.00

答案1

不一定,但主要是1.00*n_cpu

负载意味着:如果单 CPU 系统上有多个进程,它们似乎并行运行。但事实并非如此。实际发生的情况是:内核将 1/100 秒的时间分配给一个进程,然后通过中断中断其运行。并将接下来的 1/100 秒的时间分配给另一个进程。

实际上,“哪个进程应该获得我们的下一个 1/100 秒间隔?”这个问题将由复杂的启发式方法决定。它被命名为任务 调度

当然,被阻塞的进程(例如正在等待从磁盘读取的数据)不受此任务调度的影响。

load 表示:当前有多少进程正在等待下一个 1/100 秒的时间帧。当然,这是一个平均值。这是因为您可以在 中看到多个数字cat /proc/loadavg

多 CPU 系统中的情况稍微复杂一些。有多个 CPU,它们的时间帧可以分配给多个进程。这使得任务调度稍微复杂一些(但不会太复杂)。但情况是一样的。

内核是智能的,它会尝试共享系统资源以实现最佳效率,并且它已经接近于此(有一些小的优化,例如,出于缓存考虑,最好让一个进程在同一个 CPU 上运行尽可能长的时间,但这些都不重要)。这是因为,如果我们有负载 8,则意味着:实际上有 8 个进程正在等待下一个时间片。如果我们有 8 个 CPU,我们可以将这些时间片一一分配给 CPU,这样我们的系统就会得到最佳利用。

如果您看到top,则可以看到实际运行的进程数出奇地低:它们是标记为 的进程R。即使在不是真正硬核的系统上,它通常也低于 5。部分原因是等待从磁盘或网络获取数据的进程也被暂停(S在顶部标记为 )。负载仅显示 CPU 使用率。

还有一些工具可以测量磁盘负载,在我看来它们至少应该和 CPU 使用率监控一样重要,但不知何故,在我们的专业系统管理员世界中它并不那么出名。


Windows 工具经常用实际的 CPU 数量来划分负载。这导致一些专业的 Windows 系统管理员以这种除以 CPU 的方式使用系统负载。他们并不正确,在您向他们解释这一点后,他们可能会更高兴。


多核 CPU 实际上是同一硅片上的多个 CPU。没有区别。

对于超线程 CPU,有一个有趣的副作用:加载 CPU 会使超线程对变慢。但这发生在正常任务调度处理的更深层次上,尽管它可以(并且应该)影响调度程序的进程移动决策。

但从我们目前的观点来看 - 什么决定了系统负载 - 这也并不重要。

答案2

由于超线程实际上不是第二个核心,它永远不会使核心达到 200%,但对于某些工作负载,它会使核心超过 100%。

因此,您的最大负载大约在 4 到 6 之间

(当然,当过载时,这个数字可能会更高,因为它实际上计算了可运行的进程,特别是当它们正在等待 IO 时)

答案3

平均负载并不意味着你认为的那样。它不是即时 CPU 使用率,而是有多少进程正在等待运行。通常这是因为很多东西都需要 CPU,但并非总是如此。一个常见的罪魁祸首是等待 IO 的进程 - 磁盘或网络。

尝试运行ps -e v并寻找进程状态标志。

state    The state is given by a sequence of characters, for example, "RWNA". The      first character indicates the run state of the process:
D    Marks a process in disk (or other short term, uninterruptible) wait.
I    Marks a process that is idle (sleeping for longer than about 20 seconds).  
L    Marks a process that is waiting to acquire a lock.
R    Marks a runnable process.
S    Marks a process that is sleeping for less than about 20 seconds.
T    Marks a stopped process.
W    Marks an idle interrupt thread.
Z    Marks a dead process (a "zombie").

这是来自ps手册页,因此您可以在其中找到更多详细信息 -R并且D流程可能特别令人感兴趣。

您可能会因为各种原因而出现平均负载“峰值”,因此它们实际上并不是衡量“这个系统是否繁忙”以外的任何指标的良好指标。陷入将平均负载映射到 CPU 核心的困境不会给您带来任何好处。

答案4

我对我们的 24 核 Xeon 系统(2 插槽 x 12 核)进行了一些实验。由于 Linux 设置超线程的方式,本例中的最大负载为 48.0。

但是,您无法获得与 48 个内核相当的吞吐量。据我观察,前 24 个逻辑处理器的吞吐量约为 90%,即负载达到 24.0 时。然后,剩余 24 个逻辑处理器的吞吐量将增加约 10%(负载达到 48.0)。另一种思考方式是,如果您在 24 个内核上运行 48 个线程,启用超线程与不启用超线程相比,吞吐量将提升约 10-20%。这并不是营销人员所暗示的 100% 的提升。

例如,测试此观察结果的一种方法是让一个进程运行 48 个线程(例如使用 TBB 或手动线程模型),然后运行

time numactl --physcpubind=0-23  ./myprocess

然后运行

time numactl --physcpubind=0-47  ./myprocess

后者的运行时间应减少约 10-20%。如果您的进程 I/O 阻塞严重,则结果可能会有所不同。

前者将通过仅允许线程在单个逻辑处理器(每个核心)上运行来禁用超线程,而后者将通过允许线程在 2 个逻辑处理器(每个核心)上运行来启用超线程。

两种情况下的负载都应报告为 48.0...如您所见,这是非常具有误导性的。

相关内容