在双核机器中使用“nice”实用程序不会降低 CPU 使用率

在双核机器中使用“nice”实用程序不会降低 CPU 使用率

为了观察 Linux 中“nice”实用程序的实际工作情况,我编写了一个 Python 脚本来不间断地计算 SHA512。

-准备-

  • 一台双核 Linux 机器,一台单核 Linux 机器(实际上,它们都是云实例)

  • 一个不停计算SHA512的python脚本,单独运行时消耗100%的CPU时间。

-实验-

  • 在单核机器上

    正常启动该脚本,然后nice -n 15 python load_generator.py赋予第二个 python 进程低优先级。

  • 在双核机器上

    因为仅启动两个进程无法证明这一点,所以我通常启动 2 个进程,然后再启动nice -n 15 python load_generator.py一个新进程。

-预期结果-

nice正常启动的 python 进程比两台机器上已启动的进程占用更多的 CPU 时间/使用率百分比。

-实际结果-

在单核机器上,经过测试,结果确实如此,一个使用了 97%,另一个使用了 3%。但是在双核机器上,nice实用程序似乎不起作用。使用创建的进程的 CPU 使用率没有减少nice。它们每个都使用相同数量的 CPU 时间。

-附录:所用脚本-

# load_generator.py
import hashlib, binascii
import random

while True:
    dk = hashlib.pbkdf2_hmac('sha512', 
str(random.random())+str(random.random()), b'salt', 2000000)
    print(binascii.hexlify(dk))

答案1

根据 Marco 的建议,我将我的评论重新粘贴为答案,并对其进行扩展(不知道是否有更好的方法)

您误解了该nice命令的工作原理。它在多线程环境中工作,告诉内核进程调度程序某个进程的优先级应低于其他进程(或更高 - 取决于参数)。当您只有一个进程占用了所有的 CPU,而同时没有其他进程需要它时 - nice 设置不会产生任何实际结果。当您将两个 CPU 密集型进程放在一个 CPU 核心上时,它们会争夺它,因此具有积极的 nice级别将会陷入困境,因为调度程序将以比其他级别更低的速率为其提供 CPU 时间。

如果有足够的核心来处理所有进程,那么情况就会发生变化,每个进程都有相同的机会获得 CPU 时间,请记住,仍然有大量后台应用程序在运行操作系统和其他任务。在这种情况下不错的水平不会对进程产生巨大的影响 - 它只会在其他进程请求 CPU 时间来完成工作时发挥作用,但如果它不是 CPU 密集型的和/或很快完成,您将不会按照预期的方式在系统指标上观察到它。

你可以将nice优先处理某一流程比作商店里的孕妇。如果她在结账时比其他顾客有优先权,这并不会让她更快,只是意味着其他人必须等到她结账完毕。

您可以在 wiki 上阅读有关 nice 的更多信息
https://en.wikipedia.org/wiki/Nice_(Unix)

您要找的是cpulimit将睡眠插入正在运行的进程的命令,从而以此方式限制其性能。当一个进程处于睡眠状态时,另一个进程可以获得它的 CPU 时间,这样您就可以减速进程。由于此命令的本质是抑制正在运行的进程,因此您只能使用它来减慢任务速度。

相关内容