yut*_*tie 3 d-bus real-time priority nice pulseaudio
我注意到pulseaudio
我的 Gentoo Linux 机器上的一个进程的良好级别为 -11。但我不知道它是如何获得如此高的优先级,而不管它是否为普通用户所拥有。
我知道非 root 用户只能使用该nice
命令启动优先级低于 0 的程序,如果我们尝试为进程赋予高于 0 的优先级,它会显示“权限被拒绝”。
因为pulseaudio
进程归我(非root用户)所有,所以我认为如果没有任何特殊处理,它无法获得如此高的优先级。
所以,我的问题是什么“治疗”确实能够pulseaudio
降低友好值。
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 看门狗的 更多信息[...]
更多相关信息:
set_scheduler(int rtprio)
实现此功能的PulseAudio函数源@zuazo 的回答特别适用于pulseaudio。为了完整起见,我会注意到,在一般情况下,有四种情况会导致不属于 root 的进程具有高优先级:
CAP_SYS_NICE
(并且可能会或可能不会在给自己高优先级后放弃它)。CAP_SYS_NICE
能力的进程赋予了高优先级。
sudo renice
以赋予任何进程更高的优先级。SCHED_RESET_ON_FORK
设置。还有其他微妙之处:当你说一个进程是你“拥有的”时,你可能是在谈论真正的 UID 或有效的 UID——有效的 UID 决定它是否是 root,目的是能够给予自己高优先级,而真正的 UID 是它如何知道这样做后要改回什么 UID。
归档时间: |
|
查看次数: |
2437 次 |
最近记录: |