有没有办法真正确定进程的优先级或让 Linux 尊重它们的优先级?

有没有办法真正确定进程的优先级或让 Linux 尊重它们的优先级?

我知道有像其他操作系统一样的进程优先级,从 -20(最多 prio)到 19(较少 prio),但 Linux 似乎忽略它们。

现在我正在后台构建内核(尽管make进程的优先级为 0),由于花了相当长的时间,所以我决定看一些东西。因此,我在 VLC 中打开了一个要求相当高的 H264 视频(大约是 Core2 2.6GHz CPU 时间的 30%),却发现存在撕裂、帧丢失、视觉伪像(我推测是由之前的视频造成的),尽管音频似乎是美好的。

所以我决定改变 VLC 使用的优先级renice,具体地看到 PulseAudio-11我决定将其放在同等位置,所以我这样做了sudo renice -11 -p VLC_PROC_#

同样的事情不断发生,所以我继续将其设置为 -20,但我仍然不断看到视觉伪影。

所以我想知道,为什么 Linux 实际上没有将 -20 进程优先于某些 0 进程并为其提供所需的任何内容?有什么方法可以真正确定 Linux 中进程的优先级吗?

以防万一,我在这里运行 64 位 Arch,XFCE 作为桌面环境。

编辑:内核编译是在/tmp我拥有tmpfs它的源代码的情况下执行的,并且所有内容都已经在 RAM 中。 RAM 使用率甚至没有达到 60%,并且没有进行分页操作。

上面详细描述的场景只是一个测试用例,我更感兴趣的是为什么 Linux 会这样执行,以及是否有任何方法可以获得真正的优先级。

答案1

renice确实会影响进程的优先级。但正如您所经历的那样,仅仅因为进程具有更高的优先级并不意味着它将拥有所需的所有资源。更高的优先级只会让进程有更大的机会获取资源。

renice只影响CPU时间。因此,只有当两个或多个进程竞争 CPU 时间时,它才会产生影响。如果限制因素不是CPU时间而是I/O带宽,则nice值没有影响。也许在你的情况下,编译使用了大量的磁盘带宽,并且 vlc 无法足够快地从磁盘读取数据。尝试ionice代替或补充nice

如果您经常这样做,如果视频和编辑位于不同的磁盘上,您将获得更好的结果。此外,如果将视频预加载到磁盘缓存中(cat /path/to/video.file >/dev/nulltail -c +456m | head -c 123m /path/to/video.file >/dev/null从偏移量 456MB 开始读取 123MB),您可能会获得更好的结果 - 但除非您有大量 RAM,否则编译可能会收回缓存空间。如果您想确保内存中有视频,请制作一个虚拟磁盘并将视频复制到其中。

答案2

当您尝试调整时,进程优先级并不是唯一发挥作用的因素用户体验。编译内核是一件 I/O 繁重的事情 - 大量从小文件中读取/写入,这可能会大大拉伸文件系统(有时会出现这种情况是有原因的)单独用作基准),特别是在多处理器机器上。如果您有足够的 RAM,我建议您尝试在 tmpfs 中编译内核 - 至少部分地:要么将源代码树放在那里(这将有效地将其预取到缓存中),要么使用以下命令将输出发送到那里

make O=/dev/shm ...

或者在您决定将tmpfs实例安装得足够大以容纳内核对象文件的任何地方 - 这很容易在千兆字节范围内)。

除此之外,您还可以检查 VLC 是否具有缓存功能(我猜测它具有,例如 MPlayer 有选项-cache),您可以使用该功能请求在内部缓存数据。然后,它不需要在需要时获取数据,而是在数据可用时获取数据。

另一件事是显示是通过 X 服务器完成的 - 它的优先级也必须提高(请参阅 Wumpus Q. Wumbley 在该问题下的评论)。

另外两个选项是使用 cgroups 和/或 RT 调度程序(第一个选项请参见使用 cgroup 控制应用程序的优先级,对于后者,请参见例如Gentoo说明)。

最后一件事是,您可能想通过关闭不必要的服务来稍微优化您的系统。就我个人而言,我认为 PulseAudio 是首选。

然而,您所描述的听起来更像是发生了一些高优先级 I/O - 我的猜测是,您经历了一些繁重的交换 - 您确定您的 tmpfs 没有被迫被换出吗?那样的话,恐怕至少iorenice不会有太大帮助。

答案3

正如其他人所说,系统的许多部分都会受到影响,包括内存带宽,并且系统的这些其他部分也将有自己的调度和优先级。

您始终可以使用chrt -i 0给编译真正的空闲优先级。 http://linux.die.net/man/1/chrt

或者使用 cgroup 限制编译。 http://kennystechtalk.blogspot.co.uk/2015/04/throttle-cpu-usage-with-linux-cgroups.html

或者把一切都扔给它:

eatmydata cgexec -g cpu:throttled chrt -i 0 ionice -c3 nice -n19 /path/to/compile-script >/dev/null

注意:使用nice -n19时不会有任何影响chrt -i 0,但也不会造成任何伤害。

我古老的 P4 可以做同样的事情,而 VLC 不会感到不安。

相关内容