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


13

众所周知,单个处理器上的1.00负载意味着有100%的负载。类似地,四核上的4.00负载为100%

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

Answers:


17

不确定,但大多数情况下1.00*n_cpu

负载表示以下内容:如果单CPU系统上有多个进程,则它们似乎在并行运行。但这不是真的。实际上发生了什么:内核给进程一个1/100秒的时间,然后通过中断中断其运行。并将下一1/100秒分配给另一个进程。

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

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

负载说明:当前有多少个进程在等待下一个1/100秒的时间范围。当然,这是平均值。这是因为您可以在中看到多个数字cat /proc/loadavg

多CPU系统中的情况要复杂一些。有多个cpus,其时间范围可以分配给多个进程。这使任务调度有些复杂,但不会太多。但是情况是一样的。

内核是智能的,它尝试共享系统资源以实现最佳效率,而内核就在那附近(有一些小的优化事项,例如,如果一个进程在同一时间运行尽可能长的时间会更好。 cpu是出于缓存方面的考虑,但在那里没有关系)。这是因为如果负载为8,则意味着:实际上有8个进程在等待下一个时间片。如果我们有8个cpus,则可以将这些时间片一对一地分配给cpus,这样我们的系统将得到最佳使用。

如果看到top,则可以看到实际正在运行的进程数量惊人地低:它们是在R那里标记的进程。即使在不是真正核心的系统上,它也经常低于5。这部分是因为等待来自磁盘或网络的数据的进程也被挂起(S在顶部标记)。负载仅显示cpu使用情况。

还有一些工具可以测量磁盘负载,恕我直言,它们至少应作为cpu使用情况监视的重要工具,但在我们专业的sysadmin领域,它在某种程度上并不为人所知。


Windows工具通常将负载除以cpus的实际数量。这导致某些专业的Windows系统管理员在这种按CPU划分的意义上使用系统负载。他们说的不对,在您向他们解释后可能会更快乐。


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

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

但是从我们当前的角度来看-确定系统负载的因素-也没有关系。


4

由于超线程实际上不是第二个内核,因此永远不会占用200%的内核,但对于某些工作负载,它将超过100%。

因此,您的最大负载约为4到6之间的未知数

(当然,当过载时,它会上升得更多,因为它实际上对可运行的进程进行计数,尤其是当它们等待IO时)


4

平均负载并不意味着您认为的意思。这与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内核的困境不会给您带来任何好处。



2

我在我们的24核Xeon系统(2个插槽x 12核)上做了一些实验。在这种情况下,由于Linux设置超线程的方式,最大负载为48.0。

但是,您无法获得相当于48个核心的吞吐量。我观察到的是,在前24个逻辑处理器中,即在负载达到24.0的情况下,您可以获得大约90%的吞吐量。然后,对于其余的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阻塞,那么结果可能会有所不同。

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

两种情况下的负载都应报告为48.0。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.