在不同的 CPU 之间分配工作负载

在不同的 CPU 之间分配工作负载

在我的 Ubuntu 16.04 上,我正在运行一个 CPU 使用率相对较高的程序。它需要相当长的时间才能完成,因此其他任务(如浏览网页)的速度会变慢。我正在寻找一种方法来提高计算能力(如果可能的话),同时更好地了解我的笔记本电脑中正在发生的事情。

通过这个,我发现,如果我询问top,我正在运行的程序显示 CPU 使用率为 100%,而当我打开时,选项卡System monitor中的 CPU 使用率仅为 ~25% Processes。此外,Resources系统监视器中的选项卡显示 4 个 CPU,每个 CPU 的使用率从 ~5 到 ~100% 变化:

CPU 使用率

结果lscpu是:

@C:~$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 142
Model name:            Intel(R) Core(TM) i5-7200U CPU @2.50GHz
Stepping:              9
CPU MHz:               3099.937
CPU max MHz:           3100,0000
CPU min MHz:           400,0000
BogoMIPS:              5423.81
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

我可以做些什么来改善这种情况,比如在 4 个 CPU 之间分散工作量?使用nice似乎不能解决我的情况。

我知道这可能是一个一般性的问题,取决于我正在运行的程序类型(假设它是一个Python脚本),但我在这里尝试获取一般知识。

答案1

我能做些什么来改善这种情况吗,比如在 4 个 CPU 之间分散工作量?使用 nice 似乎不能解决我的情况。

简而言之:不是。该程序是单线程的。

Top 可以通过两种方式显示 CPU 使用情况:每个 CPU 的饱和度或总份额。如果您有四核系统,top 可能会显示 Irix 模式:

对于多处理器环境,如果 Irix 模式关闭,top 将在 Solaris 模式下运行,其中任务的 CPU 使用率将除以 CPU 总数。您可以使用“I”交互命令切换 Irix/Solaris 模式。

您可以通过在顶部按 I 来切换。由于您有四个 CPU 核心,因此使用率除以四,您将显示 25%。如果您打开 Irix 模式,它将显示 100%。

您的应用程序是单线程的。它在一个 CPU 核心上执行顺序线程。如果您有源代码,您可以改变这一点。然而,这通常不是一项简单的任务,并且根据任务的不同,可能无法实现。

Linux 有一个调度程序,它将正在运行的线程分配到不同的 CPU/核心。

答案2

100% 与 25% CPU 使用率

根据lscpu,您的 CPU 中有四个核心:

On-line CPU(s) list:   0-3

top每个核心使用 100%,所以如果你有一个四核处理器,那就是 400%。你完全使用了其中一个核心,所以 400% 中占了 100%。系统监视器对所有核心都使用 100%(或者可能是每个实际 CPU,我不确定)。一个核心是四个可用核心的四分之一,所以它在系统监视器中显示为 25% 的使用率。

使用一个核心时速度明显减慢

如果系统速度有点慢,可能只是 CPU 占用高,除了提高工作负载进程的 niceness 值之外,你对此无能为力。

如果速度减慢到远低于四分之三的速度,则可能是因为使用了大量的 I/O,导致其他应用程序无法快速执行 I/O,无论是使用文件还是网络,或者在系统中 RAM 不足的情况下进行交换,这些都会显示在系统监视器应用程序中。文件使用情况和交换也以 表示sudo iotop

更改任务的优先级

您可以使用nice较高的值(例如 15)让该任务让位于其他需要 CPU 的任务:

nice -n 15 the-program its-arguments

放慢任务速度

您可以尝试将nice程序设置为高值(例如 15),并使用该cpulimit程序(在cpulimitAPT 包中)在允许运行时减少 CPU 使用率。

the-program its-arguments降低CPU 使用率至 60% 并使用 niceness 值 15 的示例:

cpulimit -q -z -l 60 -- nice -n 15 the-program its-arguments

使用多个核心

有几种方法可以拆分工作负载以使用更多核心。如果你想在电脑上做其他事情,这可能不是你想要做的,因为它会占用处理能力来更快地完成任务。

一种方法是运行该进程四次,每次运行四分之一的工作负载(如果有某种方法可以在运行时指定工作负载)。在某些情况下,一种有用的可能性是使用4 个内核在每个内核上一次xargs -n ## -P 4 command处理项目。##

另一种方法是重写应用程序,使用四个左右的线程,而不是一个。如果您的应用程序中有大量 I/O 等待或类似情况,您可以将其增加到远远超过四个线程。

还有其他可能性。

结合使用多个核心、减慢任务速度和设置精细度值

您可以将使用多个核心与减慢任务速度或更改任务优先级相结合。这将使您能够更快地完成任务,但不会妨碍其他进程。

相关内容