在我的 Ubuntu 16.04 上,我正在运行一个 CPU 使用率相对较高的程序。它需要相当长的时间才能完成,因此其他任务(如浏览网页)的速度会变慢。我正在寻找一种方法来提高计算能力(如果可能的话),同时更好地了解我的笔记本电脑中正在发生的事情。
通过这个,我发现,如果我询问top
,我正在运行的程序显示 CPU 使用率为 100%,而当我打开时,选项卡System monitor
中的 CPU 使用率仅为 ~25% Processes
。此外,Resources
系统监视器中的选项卡显示 4 个 CPU,每个 CPU 的使用率从 ~5 到 ~100% 变化:
结果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
程序(在cpulimit
APT 包中)在允许运行时减少 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 等待或类似情况,您可以将其增加到远远超过四个线程。
还有其他可能性。
结合使用多个核心、减慢任务速度和设置精细度值
您可以将使用多个核心与减慢任务速度或更改任务优先级相结合。这将使您能够更快地完成任务,但不会妨碍其他进程。