Linux Kernel 5.12 后支持 PREEMPT_DYNAMIC
,与 realtime 版本需要修改 Kernel 代码不同,它允许在运行时切换内核的抢占模式,而不需要重新编译内核。目前支持的模式有:
PREEMPT_NONE
: 无抢占模式,这种模式适用于 CPU 密集型任务,可以最大化吞吐量。
PREEMPT_VOLUNTARY
: 默认模式。内核线程在某些特定的程序点点上可能会被抢占。相比 PREEMPT_NONE ,它提供了一定的低延迟,但不会像 PREEMPT 模式那样频繁地导致上下文切换。
PREEMPT_FULL
: 这个模式下,内核是完全抢占的。当一个更高优先级的任务准备好运行时,当前运行的内核线程可能会被立即抢占。这个模式适合对实时性有较高要求的应用程序。
一般来说,对服务器使用而言,重要的是吞吐量,但对于桌面应而言,延迟对于使用者更为敏感,尤其是多媒体音视频和游戏使用。对于桌面使用推荐激活 full
模式。
如果当前内核编译时使用 PREEMPT_DYNAMIC
(可以通过 uname -a
命令检查) ,则可以通过以下方式激活 full
模式:
通过修改 grub 引导内核参数,添加 preempt=full
来激活 full
模式
# 编辑 grub 配置文件
sudo vim /etc/default/grub
# 找到如下行,加入 preempt=full 内核参数
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
# 修改为
GRUB_CMDLINE_LINUX_DEFAULT="quiet preempt=full"
# 更新 grub
sudo update-grub
reddit 上有一些讨论可供参考: https://www.reddit.com/r/Fedora/comments/158fy6x/ive_turned_preemptfull_on_and_it_solved_most_of/
1
ProPh3t 85 天前
锦上添花:打游戏把 gamemode 开起来,录音把 cpupower-gui 设成 perfomance 。
|
2
xxb 77 天前
cpu 密集型 挖矿有帮助不?
|
3
anytk OP @xxb 无,这个设置会增加内核进程/线程切换,尽可能让内核线程/进程公平竞争 CPU 资源,来保证一些低优先级/低竞争性的线程及时得到 CPU 时间片。最终呈现是系统整体吞吐量会有一些下降,但整体系统的体验延迟会有改善。
|
4
qbqbqbqb 69 天前
看了一下我用的发行版默认就是 full
|
5
qbqbqbqb 69 天前
补充一下,如果内核使用了 PREEMPT_DYNAMIC ,不仅可以通过内核参数开机的时候选择抢占模式,运行时也是可以随时更改的,看当前模式用下面的命令(需要 root )
cat /sys/kernel/debug/sched/preempt 修改的命令类似这样(先切换到 root shell ,不要直接 sudo ,shell I/O 重定向会有权限问题) echo full > /sys/kernel/debug/sched/preempt |