“nice”命令在 macOS 上不起作用

T. *_*eed 7 macos nice

我正在尝试使用nice运行一个使用所有处理器时间的特定进程:

sudo nice -n 20 someProcess
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并没有改变任何事情。在 Activity Monitor 中,CPU 利用率仍为 99%。

我怀疑这可能是因为没有发生太多事情,所以它完全能够使用那么多时间,所以我尝试使用以下方法进行压力测试:

是 > /dev/null & yes > /dev/null & yes > /dev/null & yes > /dev/null &

即使使用了 Nice -n 20,相关进程也使用了 99% 的 CPU,将四个“是”进程的利用率从 99% 降低到了 60% 左右。

我应该注意到,我也尝试将“nice”与一个“yes”进程类似地使用,并发现它根本没有区别......“yes”进程使用与所有其他进程一样多的处理器时间。

这是怎么回事?“美好”被打破了吗?这是在 macOS 10.12.5 上完成的。

小智 6

不幸的是,原始海报是正确的,而 SEB 并不完全正确。

在不同的操作系统上,处理调度优先级的工作方式可能不同。

例如,在 Windows 上,如果优先级较高的进程需要足够的 CPU,则可以排除优先级较低的进程。例如,在四核系统上,以“正常”优先级运行的 4 个 CPU 密集型进程(或线程)可以完全排除“低于正常”或“低”优先级 CPU 密集型进程,但“低”优先级进程可以获得如果没有其他人想要,则 100% 的 CPU。我喜欢这种行为,因为我可以以“低”优先级运行 CPU 密集型进程,只要我所有其他(交互式)进程以“正常”优先级运行,我什至不会注意到它的存在。(假设没有一个进程占用太多内存——那就是另一回事了)。

在我使用过的所有 Unix 系统(包括 Linux)上,唯一可用的“优先级”方案是“nice”值,并且它比 Windows 上的系统要少一些严酷:具有高“nice”值的进程可以获得 100% 的优先级。 CPU 并不是其他什么都在使用 CPU,但他们会逐渐获得更少的 CPU 和更高的性能,但他们永远不会被完全排除在外。例如,根据我的经验,如果我有一个 4 核系统和 8 个受 CPU 限制的进程,那么如果它们都具有相同的好值,那么每个进程几乎都能获得一个核心的 50%。然而,如果 4 个是非 niced 的,而 4 个是 Niced 的,那么“nice'd”的 CPU 将获得越来越少的 CPU,并且好感度越来越高,但它们永远不会被完全排除:即使在最大好值19 个(或在某些系统上为 20 个),它们仍将获得每个核心的至少 30-40%,平均而言,非 niced 核心将获得约 60-70%。这与Windows不同,但仍然合理。

另一方面,据我所知,在 MacOS 上“nice”绝对没有任何作用。我有一台 4 核 Mac,如果我运行上面的 8 个进程,其中一半是好的……每个进程获得的 CPU 量绝对没有差异。这太愚蠢了。MacOS 在这里完全搞砸了,尽管他们有一个“好的”程序,尽管操作系统告诉我们好的值是什么(“ps -l”)。在我看来,他们要么诚实地完全删除功能,要么添加功能,以便“好的”值实际上意味着某种东西。

注意:如果有人能指出我的错误,并向我展示是否有办法真正降低我想在后台运行的进程的 CPU 优先级,我会感到欣喜若狂。


小智 1

答案是“你期望Nice做一些它没有做的事情”。

尼斯不是这样运作的。Nice 所做的只是改变流程的“优先级”。这意味着,如果有两个进程需要 CPU,则将已“正常”的进程放在第二位置,而不是简单地以 FIFO 方式执行进程。这些参数都是关于确定系统应该以什么顺序为处理器调度什么。

因此,如果没有其他进程请求 CPU,那么您的“好进程”就会得到它。这意味着即使所有进程都“正常”,CPU 仍然可以 100% 运行。

如果您希望某个进程不将 CPU 利用率推至 100%,则它必须具有内置机制以防止其不断请求执行其命令。睡眠和暂停等待用户输入等可以做到这一点。