是什么让“pulseaudio”进程能够达到 -11 的好水平?

yut*_*tie 3 d-bus real-time priority nice pulseaudio

我注意到pulseaudio我的 Gentoo Linux 机器上的一个进程的良好级别为 -11。但我不知道它是如何获得如此高的优先级,而不管它是否为普通用户所拥有。

我知道非 root 用户只能使用该nice命令启动优先级低于 0 的程序,如果我们尝试为进程赋予高于 0 的优先级,它会显示“权限被拒绝”。

因为pulseaudio进程归我(非root用户)所有,所以我认为如果没有任何特殊处理,它无法获得如此高的优先级。

所以,我的问题是什么“治疗”确实能够pulseaudio降低友好值。

zua*_*azo 7

PulseAudio 需要比其他桌面程序更高的优先级,主要是为了避免延迟问题并获得无跳过的音频播放。但是让PulseAudio拥有更高优先级的过程相当复杂。

为了获得这个特殊的优先权,它使用了RealtimeKit ( rtkit-daemon) 进程。这个 D-Bus 服务允许一些用户程序使用实时调度并强制执行一些严格的策略来防止滥用:

  • 只有设置了 RLIMIT_RTTIME 的客户端才会获得 RT 调度。
    • RLIMIR_RTIME指定在实时调度策略下调度的进程在不进行阻塞系统调用的情况下可以消耗的 CPU 时间量的限制
  • RT 调度只会分发给设置了 SCHED_RESET_ON_FORK 的进程,以保证调度设置不会“泄漏”到子进程,从而确保“RT fork 炸弹”不能用于绕过 RLIMIT_RTTIME 并关闭系统。
    • SCHED_RESET_ON_FORK如果设置这将确保当进程分叉 a) 调度优先级重置为 DEFAULT_PRIO 如果它更高 b) 调度策略重置为 SCHED_NORMAL 如果它是 SCHED_FIFO 或 SCHED_RR。
  • 对所有用户可控资源实施限制,只有最大数量的用户、进程、线程可以同时请求 RT 调度。
  • 在特定时间范围内只能将有限数量的线程设为 RT。
  • 客户端授权通过PolicyKit进行验证。

[...] 它包括一个基于 Canary 的看门狗,尽管上面指出了逻辑,但如果系统过载,它会自动将所有实时线程降级到 SCHED_OTHER。有关基于 Canary 的 RT 看门狗的 更多信息[...]

更多相关信息:


Ran*_*832 5

@zuazo 的回答特别适用于pulseaudio。为了完整起见,我会注意到,在一般情况下,有四种情况会导致不属于 root 的进程具有高优先级:

  1. 正在运行的程序是setuid-root,给自己高优先级,然后改变了它的uid。
  2. 进程有能力CAP_SYS_NICE(并且可能会或可能不会在给自己高优先级后放弃它)。
  3. 该进程被另一个以 root 身份运行或有CAP_SYS_NICE能力的进程赋予了高优先级。
    • 这是适用于 PulseAudio 的情况,如其他答案所述。您还可以运行sudo renice以赋予任何进程更高的优先级。
  4. 该进程是另一个进程的子进程,该进程已经具有高优先级,但尚未SCHED_RESET_ON_FORK设置。

还有其他微妙之处:当你说一个进程是你“拥有的”时,你可能是在谈论真正的 UID 或有效的 UID——有效的 UID 决定它是否是 root,目的是能够给予自己高优先级,而真正的 UID 是它如何知道这样做后要改回什么 UID。