如何在 Linux 上使用 nice 和 renice 设置进程优先级

nicerenice 命令允许你通过调整进程优先级来优化内核对进程的处理方式。本文将指导你如何在 Linux 和 macOS 等类 Unix 操作系统中使用这两个命令。

进程管理的核心

在你的 Linux 或类 Unix 系统中,即使在你启动任何应用程序之前,就有许多进程在后台运行。 这些进程大部分是 Linux 系统自身的重要组成部分或图形桌面环境的辅助进程。 计算机系统幕后运行着大量的操作。 然而,可用的系统资源和 CPU 时间是有限的。 Linux 内核负责管理所有这些进程。

内核必须决定哪些进程当前应该获得关注和资源,哪些进程需要等待。 内核会不断处理进程及其优先级,以确保计算机尽可能流畅地运行,并且所有进程都能获得适当的资源。 有些进程会获得优先待遇,因为它们对于计算机的正常运行至关重要,所以它们的需求会优先于你的浏览器等其他应用。

理解 Nice 值

内核决定如何处理进程的关键标准之一是 Nice 值。 每个进程都有一个 Nice 值,它是一个介于 -19 到 20 之间的整数。默认情况下,所有新启动的进程的 Nice 值都是零。

关键在于,Nice 值越高,该进程对其他进程就越“友好”。也就是说,较高的 Nice 值告诉内核,该进程可以等待。相反,负的 Nice 值则表示不友好,负值越大,该进程越“自私”,它会尽可能地占用 CPU 时间,而不考虑其他进程的需求。

我们可以使用 nice 命令来设置进程启动时的 Nice 值,也可以使用 renice 命令来调整正在运行的进程的 Nice 值。 你可以点击这里查看 nicerenice 命令的详细文档。

nice 命令的用法

nice 命令可以在程序启动时调整其 Nice 值。这使我们可以增加或减少内核赋予该进程的优先级,使其相对于其他进程更受重视或被忽略。

例如,假设一位程序员编写了一个名为 ackermann 的程序,用于计算 阿克曼函数。这个程序是 CPU 和内存密集型的。程序员可以使用以下命令来启动它:

./ackermann

可以使用 top 命令查看正在运行的程序。

top

top 的输出中,我们可以看到 ackermann 程序的详细信息。其 Nice 值在“NI 列”中显示,正如预期的那样,它的默认值为零。

现在,让我们重新启动 ackermann 程序,并设置一个更高的 Nice 值,让它对其他进程更“友好”。我们将 ackermann 程序的 Nice 值设置为 15。在命令中,首先输入 nice,然后是一个空格,然后是 -15,再一个空格,最后是要启动的程序的名称。在这个例子中,程序员要运行 ./ackermann

nice -15 ./ackermann

请注意,这里的 -15 不是负十五,而是正十五。 - 符号用于表示我们正在传递一个参数。如果要表示负数,则必须使用两个 - 字符。

如果我们现在再次运行 top,我们可以看到 ackermann 程序的行为发生了变化。

top

ackermann 的 Nice 值为 15 时,它消耗的 CPU 时间明显减少。GNOMERhythmbox 等其他进程则消耗了更多的 CPU 时间。通过调整 Nice 值,我们稍微控制了 ackermann 程序的优先级。

现在,让我们反过来,给 ackermann 一个负的 Nice 值。 请注意,我们需要使用两个 - 字符。要让应用程序变得更“自私”和不友好,你需要使用 sudo 命令。任何用户都可以让他们的应用程序更“友好”,但只有超级用户(root)才能让应用程序更“自私”。

sudo nice --10 ./ackermann

再次运行 top 命令,看看有什么不同。

top

现在,ackermann 的 Nice 值是 -10。 它又回到了列表顶部,并且比之前消耗了更多的 CPU 时间。

renice 命令的用法

renice 命令允许我们调整正在运行的进程的 Nice 值。 我们无需停止进程并使用 nice 命令重新启动它,可以即时设置新的 Nice 值。

renice 命令需要进程的进程 ID (PID) 作为命令行参数。我们可以从 top 命令的“PID”列中获取进程 ID,也可以使用 psgrep 命令找到它,如下所示。当然,你需要将 dave 替换为你的用户名,并将 ackermann 替换为你感兴趣的进程名称。

ps -eu dave | grep ackermann

现在我们有了 PID,可以将其与 renice 命令一起使用。例如,我们将 ackermann 进程的 Nice 值设置为 5,使其行为更“友好”。要更改正在运行的进程的 Nice 值,你需要使用 sudo 命令。请注意,在表示正数 5 时,不需要 - 符号。负数只需要一个 - 符号,而不是两个。

sudo renice -n 5 2339

输出显示,renice 命令已经成功更改了 Nice 值。它显示了旧值和新值。

通常,内核在处理进程优先级和分配 CPU 时间和系统资源方面做得很好。但是,如果你要运行一个耗时的 CPU 密集型任务,并且你不太关心它的完成时间,那么为该任务设置一个较高的 Nice 值会让你的计算机运行更流畅,这对每个人都有好处。