作者elguapo (HPHT Synthesized)
看板Headphone
标题Re: [闲聊] ArchLinux的roonserver + realtime配置
时间Mon Feb 23 11:15:32 2026
要真正的发挥 realtime kernel 在音讯处理上的威力,除了更换核心之外,
下列事项尚需要进一步调整:
1. BIOS
2. 开机参数
3. 应用软体隔离及排程
这麽做都是为了降低延迟、减少 OS jitter,让外部干扰降到最低。
以 Intel CPU 来说,BIOS 主要是关闭 Turbo Boost、关闭 Speed Shift、关闭
Hyper Threading、关闭 P-state 和 C-state、关闭 PCIe 电源管理等等。
开机参数的话,就会比较麻烦一点,以我的 HQPlayer Embedded 主机(Intel Xeon
W9-3575X)来说,经过一些考虑,我指定三颗核心当管家(house keeping),
一颗核心专门处理特定服务所占网卡的 IRQ,其他 40 核心都给 HQPe 做 14 声道
升频 DSD256。
以下设定是针对 Ubuntu Server kernel 6.8 RT 修改 /etc/default/grub
首先先决定那几个 CPU 要完全隔离,不受 kernel 调度:
isolcpus=managed_irq,domain,3,16-43
把需要更平顺处理的 CPU 的 "ticker"(节拍器)关闭:
nohz=on nohz_full=3-43
同样的,把需要更平顺处理的 CPU 的 RCU call back 关闭(其实是卸载给管家):
rcu_nocb_poll rcu_nocbs=3-43
把 IRQ 卸载给管家:
irqaffinity=0-2
虽然 BIOS 已经关闭了 P-state / C-state,但开机的时候再宣告一次当保险:
intel_pstate=disable processor.max_cstate=0 intel_idle.max_cstate=0
关闭锁死侦测:
nmi_watchdog=0 nosoftlockup
独尊 TSC 为时钟源:
clocksource=tsc tsc=reliable hpet=disable
关闭硬体漏洞缓解:
mitigations=off
故意错开节拍器,避免全部 CPU 同一个时间 tick:
skew_tick=1
不让 CPU 进入节电模式:
idle=poll
以上参数大概就能涵盖 95% 的 realtime 需求。
开机参数设完之後,还要特别补几个 sysctl 参数在 /etc/sysctl.conf
kernel.sched_rt_runtime_us=-1
kernel.timer_migration=0
kernel.perf_cpu_time_max_percent=0
若背景有 irqbalance 这个软体在运行,请把它完全关闭并移除。重要的 IRQ
用手动指定,例如我指定 Ravenna/AES67 在 enp1s0 网卡上运行,并且将 IRQ
指定给第三颗 CPU 处理,那麽就可以借用 Intel 的 shell script 来调整:
set_irq_affinity -X one 3 enp1s0
其中 -X 是关闭 XPS,毕竟 AoIP 本质上是单一进出,单一 ring buffer 即可。
最後是 kernel thread 以及 user land 的 CPU 指派,我把 system slice 和
user slice 分别做了设定:
init scope 设 AllowedCPUs=0-2
system slice 设 AllowedCPUs=0-2
user slice 设 AllowedCPUs=0-2
把 HQPlayer 以外的执行绪都丢给管家 CPU 处理,然後 HQPlayer Embedded:
hqplayerd slice 设 AllowedCPUs=4-43
而 Ravenna/AES67 守护程式则跟所占网卡 IRQ 放在 CPU 3:
ravenna slice 设 AllowedCPUs=3
最後设定 HQPlayer Embedded 的 reserved cores 到完全隔离的 CPU 16-43,
跑起来 CPU 分布看起来就很舒服了:
https://meee.com.tw/YwzDhws.jpg
观察很多玩家使用了 realtime kernel 但却没有进一步去设定 BIOS、开机参数
及隔离加排程,诚属可惜,在此野人献曝一番,将所学及经验分享。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.163.96.58 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Headphone/M.1771816534.A.E6A.html
1F:推 evadodoya: 推推 02/23 11:34
2F:推 pploj: 古早论坛my○v有一串讨论linux讯源的 差不多也是在玩这些 02/23 11:39
3F:推 yuugen2: 请问这样设定完 声音差多少? 02/23 11:51
数据上,经过各层微调後的实时核心,能够有效缩短输入 / 输出缓冲时间。
现有系统,若用低延迟核心并且使用预设 BIOS,也不调整开机参数、不调整隔离及
排程,至少要将输入缓冲增大到 20ms,且 HQPlayer 本身软体的缓冲也要开到至少
50ms 才不会在多声道升频过程听到细微的 pop / click 声音。
显然 HQPlayer 被背景程式干扰了,即使是 HT 打开有 88 核但就是会发生,因为一
些背景程式被作业系统调度到跟 HQPlayer 同一个 CPU 上,打断了本应连续处理的
音讯内容;但也因为缓冲长度增加,造成延迟增加,导致观看串流影音的时候,唇形
和说话对不上。
改为实时核心开机并且针对 BIOS、开机参数及软体隔离加排程做调整後,输入缓冲
长度最短可以缩到 2ms(96 frames)、HQPlayer 仅使用 Ravenna/AES67 的 1.33ms
(64 frames)即能顺跑多声道升频 DSD256 不会有随机细微的 pop / click 声音。
不看缓冲有效缩短相关数据,只讲主观听感的话,经过各项微调的实时核心,所产出
的声音音质,是非常绵密的(我形容它「有黏度」)。
4F:推 pcjustin: 好专业 02/23 12:10
※ 编辑: elguapo (118.163.96.58 台湾), 02/23/2026 13:53:07
5F:推 lacer: 推啊 超过一百分 02/23 21:57
6F:推 dzwei: 感谢补充~ 假日有空来试试看 02/24 14:01
多提醒一些:
1. 用於管家的核心必有 CPU 0 且至少一颗(常见是 CPU 0,1 在当管家)
2. Roon server 建议至少需要两个实体核去运作
3. Kernel 6.13 起,增加了「lazy RT」这个模式,若编译为 lazy RT,核心的行为
大概是介於低延迟和真实时之间,对於非 RT 执行绪会放宽运行容许度,若喜欢
的 distro 有提供 6.13 或以上的核心版本,不妨试试 :-)
※ 编辑: elguapo (118.163.96.58 台湾), 02/24/2026 14:57:14
7F:推 dzwei: CONFIG_ARCH_HAS_PREEMPT_LAZY=y看起来ArchLin预设是打开了 02/24 15:24
忘记说,若在 kernel 6.12 或以後版本的 RT 核心启用设定了 slice,那麽
kernel.sched_rt_runtime_us=-1
不会被核心接受(systemd 会确保 CPU 不会被 RT 执行绪完全占用而影响一般
执行绪)
由於我个人还是偏好较为古典的 6.8 RT 因此还是会将这 runtime 宣告留着就是了。
※ 编辑: elguapo (118.163.96.58 台湾), 02/24/2026 16:19:55