在我的 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 之间的工作?Usingenice
似乎不能解决我的情况。
我知道这可能是一个普遍的问题,取决于我正在运行的程序类型(假设它是一个Python
脚本),但我想在这里获得一般知识。
简而言之:没有。该程序是单线程的。
Top 可以通过两种方式显示 cpu 使用情况:每个 CPU 的饱和度或总份额。如果你有一个四核系统,top 可能会显示 Irix 模式:
您可以通过按顶部的 I 来切换它。由于您有四个 CPU 内核,因此使用量除以四,您将显示 25%。如果打开 Irix 模式,它将显示 100%。
您的应用程序是单线程的。它在一个 CPU 内核上执行顺序线程。如果你有源代码,你可以改变它。然而,这通常不是一项微不足道的任务,并且根据任务的不同,这可能是不可能的。
Linux 有一个调度程序,它将运行线程分配到不同的 CPU/内核。
100% 与 25% 的 CPU 使用率
根据
lscpu
,您的 CPU 中有四个内核:top
每个内核使用 100%,所以如果你有一个四核处理器,那就是 400%。您完全使用了一个核心,所以这是 400% 中的 100%。系统监视器对所有内容都使用 100%(或者可能是每个实际的 CPU,我不确定)。一个核心是四个可用核心的四分之一,因此它在系统监视器中显示为 25% 的使用率。使用一个核心显着放缓
如果系统变慢了一点,可能只是 CPU 使用率,除了提高工作负载进程的 niceness 值之外,您无能为力。
如果它的速度下降到远低于四分之三的速度,它可能使用了大量的 I/O,因此其他应用程序无法非常快速地执行 I/O,无论是使用文件还是网络,或者如果没有则交换系统中有足够的 RAM,这些都显示在系统监视器应用程序中。文件使用和交换也用
sudo iotop
.更改任务的优先级
您可以使用
nice
像 15 这样的高值来使任务让位于需要 CPU 的其他任务:减缓任务
您可以尝试
nice
将程序设置为 15 之类的高值,并使用该cpulimit
程序(在cpulimit
APT 包中)在允许运行时减少 CPU 使用率。the-program its-arguments
将CPU 使用率降至 60% 并使用 niceness 值 15的示例:使用多核
有几种方法可以继续拆分工作负载以使用更多内核。如果您尝试在计算机上执行其他操作,这可能不是您想要做的,因为它会消耗更多的处理能力来更快地完成任务。
如果在运行时有某种方法可以指定工作负载,则一种是使用四分之一的工作负载运行该过程四次。在某些情况下有用的一种可能性是使用 4 个内核在每个内核上一次
xargs -n ## -P 4 command
处理项目。##
另一种是重写应用程序以使用四个左右的线程而不是一个。如果您的应用程序中有大量 I/O 等待或类似情况,您可以将其增加到远远超过四个线程。
还有其他可能性。
将使用多个核心与减慢任务速度和设置 niceness 值相结合
您可以结合使用多个内核来减慢任务或更改任务的优先级。这将使您能够更快地完成任务,但不会妨碍其他流程。