我注意到pulseaudio
我的 Gentoo Linux 机器上的进程的良好级别为 -11。但我不知道它是如何获得如此高的优先级的,尽管它是由普通用户拥有的。
我知道非 root 用户只能使用该命令启动优先级低于 0 的程序nice
,如果我们尝试为进程赋予高于 0 的优先级,它会显示“权限被拒绝”。
因为该pulseaudio
进程是我(非 root 用户)所拥有的,所以我认为如果不进行任何特殊处理,它不可能获得如此高的优先级。
所以,我的问题是“治疗”确实可以pulseaudio
降低友善度。
答案1
PulseAudio 需要比其他桌面程序更高的优先级,主要是为了避免延迟问题并获得无跳过的音频播放。但让PulseAudio拥有更高优先级的过程相当复杂。
为了获得这个特殊的优先级,它使用实时套件(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。
- 客户端授权通过验证政策工具包。
[...]它包括一个基于金丝雀的看门狗,如果系统过载,尽管有上面指出的逻辑,该看门狗会自动将所有实时线程降级为 SCHED_OTHER。有关更多信息基于金丝雀的 RT 看门狗 [...]
更多相关信息:
答案2
@zuazo 的答案对于pulseaudio 来说非常有用。为了完整起见,我将指出,在一般情况下,有四种情况可能导致不属于 root 的进程具有高优先级:
- 正在运行的程序是setuid-root,并给自己设置了高优先级,然后更改了它的uid。
- 该进程具有该能力
CAP_SYS_NICE
(并且在给予自身高优先级后可能会或可能不会放弃该能力)。 - 该进程被另一个以 root 身份运行或具有该
CAP_SYS_NICE
功能的进程赋予了高优先级。- 这是适用于 PulseAudio 的情况,如其他答案所述。您还可以运行
sudo renice
以赋予任何进程更高的优先级。
- 这是适用于 PulseAudio 的情况,如其他答案所述。您还可以运行
- 该进程是另一个进程的子进程,该进程已经具有高优先级,并且没有
SCHED_RESET_ON_FORK
设置。
还有其他微妙之处:当你说一个进程“属于”你时,你可能在谈论真实 UID 或有效 UID - 有效 UID 决定它是否是 root,以便能够给予自己高优先级,而真正的 UID 是它如何知道执行此操作后要更改回哪个 UID。