找回密码
 -注册-
查看: 16345|回复: 129
打印 上一主题 下一主题

解码PCM1536/DSD1024内核patch及zhjie-gentoo软件源介绍,附Roon/HQPlayer内核优化

[复制链接]
跳转到指定楼层
1
发表于 2022-10-27 19:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式 来自 香港
本帖最后由 中关村东路 于 2022-10-27 21:45 编辑

目录

1. 背景
2. 安装包介绍
2.1 内核相关
2.2 Roon相关
2.3 HQPlayer相关
2.4 Airplay相关
3. Nas/Server/Bridge内核优化建议
4. 小结
附录:总览按用途分类的内核版本选择和优化推荐

本帖主要介绍我维护的zhjie-gentoo-repo软件源,包括Gentoo Linux内核和其他一些安装包,尤其是今天的推送的更新,patch了内核支持梅解码的PCM1536/DSD1024,不出意外其他Holo解码,甚至其他解码也应该可用,但我只在自己机器(梅L3)上做了测试。这个补丁也包含了一些其他优化减少爆音等等感兴趣可以自己阅读代码或者直接使用。如果对你有所帮助,或者遇到什么问题,可以回帖表示支持。

本文为“中关村东路”原创,在erji.net首发,未经作者允许请勿转载。欢迎各位音乐爱好者和公司免费按需使用,源码都标注了开源协议,是否通知我都可以。


2
 楼主| 发表于 2022-10-27 19:20 | 只看该作者 来自 北京市
1. 背景

之前在绿檀的几个帖子讨论了Roon进程/线程/优先级优化【1】,Roon索引性能优化【2】,BeagleBone Black内核优化【3】等笔记和体验。今天主要分享的是我维护的Gentoo私有软件源【1】和其中的Linux内核等安装包,并附简单的使用说明和优化建议。这个软件源在本论坛和Roon官方论坛都发布过也有些用户,之所以维护了这么久今天才拿出来介绍,主要是因为换了梅解码之后发现这解码的PCM1536/DSD1024不能在标准Linux内核下实现,Jeff提供的解决方案是使用HQPlayer官方提供的NAA OS,当然,Windows也是可以的。但是我的音乐系统整套都是自己针对硬件配置和编译的,甚至为此写了很多脚本和代码,网桥如果用公版的似乎就完全失去意义了。今天有空就把这个事做了,顺便写这个帖子介绍一下我维护的软件源相关信息。

一些重要的免责声明:如果您觉得升频没有必要,请不需要批判我,我不但自己没在用HQ,而且不赞同升频理念,我做的事只是要这个“能”;如果您觉得ROCK/HQPlayer OS/windows……等成品系统一样可以实现PCM1536/DSD1024,就更不需要继续看下去了;最重要的是,如果您是Holo的拥护者或者反对者,请高抬贵手不要在这个帖子下吵架,本帖只讨论技术问题,不谈听感,多谢支持;其他解码用户如果不能用我维护的包实现,可以在调试过程中讨论,但请不要直接抱怨我,毕竟我不是IT从业人员没有实力实现通用适配和测试,也不因此获利。有些朋友可能觉得我每篇文章都说类似的话很啰嗦,是因为截止目前每次我在任何国内互联网场合分享的时候,要么是没人理,要么被说做这个事没意义,比如今天这帖子发出来之前,也是先得到了网友同样的“反馈”。

【1】http://erji.net/forum.php?mod=vi ... =2253401&extra=
【2】http://erji.net/forum.php?mod=vi ... =2282548&extra=
【3】http://erji.net/forum.php?mod=vi ... =2276075&extra=
【4】https://github.com/zhjie/zhjie_gentoo_repo


回复

使用道具 举报

3
 楼主| 发表于 2022-10-27 19:20 | 只看该作者 来自 北京市
本帖最后由 中关村东路 于 2022-10-27 21:07 编辑

2. 安装包介绍

2.1 内核相关

2.2.1 xanmod-rt-sources-5.15

这就是今天的主角了,推荐网桥使用。打了naa patch,实测可以支持梅L3解码PCM1536/DSD1024。此外主要是维护了实时内核patch,gentoo patch和xanmod patch。第三小节我会详细介绍各个patch和其中功能的使用场景。需要指出的是,这个补丁也做了一些其他优化,减少爆音等等,其实所有用户都可以打上。

2.2.2 xanmod-rt-sources-6.0

我的网桥正在使用的是这一版本,小版本号是6.0.2,和上述5.15版本的主要区别和hifi最相关的是增加了mglru patch大幅提升内存使用效率,以及不再支持o3优化。毕竟公版实时内核patch是通过5.15测试的,6.0内核激进了一些。网桥的内存效率意义取决于你的内存大小,请酌情而定。

2.2.3 xanmod-sources-5.19

这是我Roon Server/Nas使用的内核版本,也推荐Roon Server/Nas使用。主要包括gentoo patch和xanmod patch。这里需要指出的是,如果你使用的是zfs文件系统,那目前5.19是内核版本支持上限,6.0内核尚未官方支持。数据无价,建议不要在Nas上尝试。尽管Roon Server的测试版本是5.15,但我长期在5.19重度使用并未出现任何问题。

2.2.4 xanmod-sources-6.0

这是我科学计算机器/编译服务器上的内核版本。和2.2.2小节版本的关键区别是没有带rt patch。如果本地不保存数据,可以在Roon Server使用,强烈不建议ZFS Nas使用。

2.2 Roon相关

2.2.1 RoonServer

主要有alsa ffmpeg rt samba system-dotnet systemd web几个安装选项,可自行设定。这里简要介绍一下,Gentoo Linux允许软件包维护者给出若干安装选项(关键字USE),以适配相关功能。例如,你的Roon Server如果安装在实时内核上,请选择rt选项。其他几项顾名思义,不理解也可以不管。

2.2.2 RoonBridge

主要有rt systemd两个选项。默认是开了rt的openrc,+rt -systemd。

2.2.3 dotnet-runtime

Roon Server是用dotnet写的,需要带上dotnet vm,官方版本是内置了的,如果你需要最新版本的dotnet runtime或者你的roon server本来就需要这个runtime去运行其他软件,可以打开roon server的system-dotnet选项,即可自动安装这个包。看起来是个很普通的包,但是Gentoo Linux官方并未收录,网上也没找到别家源收录。Roon Bridge虽然也是dotnet语言,但官方使用的是mono虚拟机,我一直猜测很快就会切换到dotnet虚拟机上,一直也没切,还是等等吧。

2.3 HQPlayer相关

2.3.1 networkaudiod-bin

也就是naa了。选项和Roon Bridge一样, +rt -systemd。

读者可能发现,我并没维护HQPlayer embedded,是因为这东西依赖的实在太多了,装在我系统里实在不优雅。而官方提供的HQPE很方便,烧一张u盘就能使用。如果对官方HQPE不满意,也可以用chroot或者systemd-nspawn等方式运行,以后有机会我再单独介绍吧,感兴趣的同学可以自行搜索。

2.4 Airplay相关

2.4.1 shairport-sync

我主要维护了airplay1/2两个版本。推荐使用ap1,因为并没有码率上的区别,多房间等新功能其实也不太常用。建议安装时加上alac选项,以支持无损音质。

2.4.2 alac

这个是airplay1/2依赖的alac库,不多说了。

2.4.3 nqptp

这个是shairport-sync的airplay2实现里新增的一个依赖服务。


回复

使用道具 举报

4
 楼主| 发表于 2022-10-27 19:21 | 只看该作者 来自 北京市
本帖最后由 中关村东路 于 2022-10-27 21:43 编辑

3. Nas/Server/Bridge内核优化建议

本小节主要讨论我的软件源中维护的内核版本所支持的一些特性,以及不同用途,包括Nas/Roon Server/HQPlayer/Roon Bridge网桥/NAA网桥/Airplay下的内核优化建议。当然我可能会用任意串流机器来代表上述所有场景,或者用网桥代替Roon Bridge/Naa/Airplay。发帖不太严谨对付着看吧,有错可以纠正。

3.1 naa patch

安装时选择+naa,不用在内核中配置,我维护的实时内核即可支持Holo May L3在naa下的PCM1536/DSD1024。之所以说的这么具体,是因为我只在这个场景这个硬件下测试,其他的都没试过不能把话说满。推荐感兴趣的读者在自己的NAA上使用,如果你用的和我一样的解码,就强烈推荐吧,今天听了一天七八张碟都没问题,估计是没事。当然,Roon是不能源生支持的,我也没找到办法打补丁,可惜了我Nas上一直存着一份1024DSD呢。目前我只能用hq升频播放PCM1536,家境贫寒,DSD1024我的机器不流畅,家里有矿的可以试试。

3.2 PREEMPT_RT

位置:General setup > Preemption Model

PREEMPT_RT,音频领域大名鼎鼎的rt patch,大幅降低延迟。强烈推荐在五年内买的ARM Bridge,或者任何x86 Bridge中启用。如果你的Roon Server/HQPlayer负载不很高,希望得到更快的响应,而不是更高的性能,也可以开启。严重不建议在NAS中,或者是负载过高的机器上开启。

这里需要解释一下,一个误区是任何场景只要上了实时一下音质就好了。其实这东西只是允许任务执行时候可抢占,这样你最关心的那个app就可以通过这个更早被执行。但这个补丁并不足够稳定,且性能不够时会大幅提高负载和功耗。换句话说,如果你的硬件相对于应用完全是碾压的情况下,加上rt patch有助于减少关键进程的延迟,如果本来就已经不稳定,或者高负载了,再开rt反而性能会力下降,甚至会导致播放卡顿【3】。至于NAS,我的建议是任何情况下都应该安全第一,降低延迟的办法很多,而NAS更重要的是加大数据吞吐量,把要传的东西尽快传出去,没必要用rt patch来提升响应速度。rt patch的另外一个很大的好处,很少有人提及,而且需要手动配置:是允许ksoftirqd/0, ksoftirqd/1等内核进程提升为实时,这东西是每个逻辑CPU有一个的驻守进程,提升为实时可以提高系统顺滑程度。例如下面这段代码,就可以提升有四个逻辑CPU的ksoftirqd为实时进程。

  1. chrt -f -p 55 $(pgrep ksoftirqd/0)
  2. chrt -f -p 55 $(pgrep ksoftirqd/1)
  3. chrt -f -p 55 $(pgrep ksoftirqd/2)
  4. chrt -f -p 55 $(pgrep ksoftirqd/3)
复制代码


3.3 TASKS_RCU

位置:General setup > RCU Subsystem

可以说是对实时内核的一种弱化版本吧,Enable RCU priority boosting,Perform RCU expedited work in a real-time kthread。推荐在Roon Server/HQPlayer这类负载高的场合按需使用,赶快把逾期任务加紧完成。

3.4 CC_OPTIMIZE_FOR_PERFORMANCE_O2/O3

位置:General setup/Compiler optimization level

这是一个很有用的选项。O2/O3表示编译器不同优化程度,不用debug的系统上都应该开启才好。除此之外还有size选项,以降低内核大小,主要用在路由器这种设备。强烈推荐在任何串流机器上开启O2或以上。O3在6.0之前存在,最新的内核中因为性能提高不明显取消了。估计一般情况是不需要压缩size的,总之按需选择吧。

3.5 graysky2 compiler patch

位置:Processor type and features > Processor family

这也是个大名鼎鼎的patch了,和著名的ck-patch同作者。允许GCC编译器在编译内核时根据不同CPU进行优化,强烈推荐在任何串流机器上使用,在很多场合能提升百分之十性能。最近AudioLinux支持额外付费购买V3优化,用的就是这个补丁实现的。如果你没用交叉编译,可以在这里选择Intel-Native optimizations autodetected by the compiler或者AMD-Native optimizations autodetected by the compiler。如果交叉编译,就必须手动选择自己的CPU代码。执行
/lib64/ld-linux-x86-64.so.2 --help
可以看自己的CPU支持v2v3v4哪个级别的优化。不过如果不是交叉编译直接选native就可以了,是优于这个的。

3.6 HZ_1000

位置:Processor type and features > Timer frequency

顾名思义了。强烈推荐在任何串流机器上设置为1000HZ。毕竟省着点电也没什么意思。

3.7 CPU_FREQ_GOV_PERFORMANCE

位置:Power management and ACPI options > CPU Frequency scaling > Default CPUFreq governor

也是顾名思义了。我个人建议,选择performance或者powersave之一。具体选哪个看你的偏好。之所以不选其他的,是为了避免CPU频率波动。我自己的所有x86机器上都设置为performance,树莓派我是用的数字卡没走USB通道,所以是降频使用的。

3.8 Multi-Gen LRU

位置:Memory Management options > Multi-Gen LRU

注意选上Enable by default。这个被称为今年最有价值内核补丁。大幅提升内存性能,链接就不带了,官方内核今年年内会合并这个补丁,这就很有说服力了。强烈推荐在除了网桥之外的任何串流机器上使用。网桥如果内存特别多不用也没事,用了也不会亏,要不就开了吧。

3.9 DEFAULT_BBR2

位置:Networking support > Networking options > TCP: advanced congestion control

注意选上BBR2的同时选择Default TCP congestion control (BBR2)。当然你也可以选择更经典的BBR,性能相差不大,都和传统网络拥堵算法提升很大。强烈推荐在任何串流机器上使用。

3.10 DEFAULT_FQ_PIE

位置:Networking support > Networking options > QoS and/or fair queueing > Allow override default queue discipline

选择Flow Queue Proportional Integral controller Enhanced。用于替代默认的fair算法,很不“公平”。强烈推荐在任何串流机器上使用。

3.11 OVERLAY_FS

位置:File systems > Overlay filesystem support

我之前介绍过的overlayfs【2】。如果你非常了解自己的系统,可以在Roon Server使用,以提升索引和检索性能。如果有条件,也可以用企业级NVME SSD保存Roon的索引和图片,我现在已经换硬件不用overlay方案了。。。

3.12 XFS/ZFS

位置:File systems > XFS filesystem support

这两个是最有代表性的COW(Copy-on-write)文件系统,可以充分利用内存做数据缓存,zfs甚至可以充分利用几十G的内存做文件缓存。缓存的最大意义本来是提高吞吐量的,但是在hifi场合,更多的作用是降低延迟,毕竟内存和SSD/HDD的延迟相差太大了。前者在内核中,编译进去就可以使用。后者因为是CDDL协议,不允许编译进内核,需要额外编译,就不详细介绍使用方法了,各种wiki上都有,会的都会。强烈推荐在Nas使用。如果你的音乐保存在Roon Server上,则强烈推荐在Roon Server上使用。硬盘少选前者,硬盘多选后者。

3.13 TMPFS

位置:File systems > Pseudo filesystems

可以把内存当成磁盘使用,再次强烈推荐,尤其是网桥上。我在【1】中提到过用法,可以部分目录使用,也可在网桥上把整个系统所有目录都是用TMPFS。

回复

使用道具 举报

5
 楼主| 发表于 2022-10-27 19:24 | 只看该作者 来自 北京市
4. 小结

本帖主要介绍我维护的zhjie-gentoo-repo软件源,包括Gentoo Linux内核和其他一些安装包,尤其是今天的推送的更新,patch了内核支持梅解码的PCM1536/DSD1024,不出意外其他Holo解码,甚至其他解码也应该可用,但我只在自己机器(梅L3)上做了测试。如果对你有所帮助,或者遇到什么问题,可以回帖表示支持。


回复

使用道具 举报

6
 楼主| 发表于 2022-10-27 19:25 | 只看该作者 来自 北京市
本帖最后由 中关村东路 于 2022-10-27 19:31 编辑

中间有一段最关键的内容暂时在审核。可能得过一会儿才能显示
回复

使用道具 举报

7
 楼主| 发表于 2022-10-27 19:51 | 只看该作者 来自 北京市
先补个图吧。
回复

使用道具 举报

8
 楼主| 发表于 2022-10-27 20:12 | 只看该作者 来自 北京市
中关村东路 发表于 2022-10-27 19:21
3. Nas/Server/Bridge内核优化建议

本小节主要讨论我的软件源中维护的内核版本所支持的一些特性,以及不 ...

通过了,多谢版主。
回复

使用道具 举报

9
 楼主| 发表于 2022-10-27 21:18 | 只看该作者 来自 北京市
附录:应烧友建议,补充一下总览按用途分类的内核版本选择和优化推荐吧。

A. NAS

A.1 内核选择: xanmod-sources-5.19 (使用zfs) > xanmod-sources-6.0 (使用xfs)

A.2 内核配置: 开TASKS_RCU,CC_OPTIMIZE_FOR_PERFORMANCE_O2,graysky2 compiler patch,HZ_1000,CPU_FREQ_GOV_PERFORMANCE,Multi-Gen LRU,DEFAULT_BBR2,DEFAULT_FQ_PIE,XFS/ZFS

A.3 额外配置: zfs需要参考wiki配置

B. Roon Server

如果Roon Server上存储数据,采用NAS方案即可。

如果Roon Server上不存储数据,只存索引:

B.1 内核选择: xanmod-sources-5.19 (音乐以NAS为主,Roon Server使用zfs) > xanmod-sources-6.0 (音乐以NAS为主,Roon Server使用xfs)> xanmod-rt-sources-6.0 (音乐以qobuz为主)

B.2 内核配置: 视数据源开启PREEMPT_RT。视硬盘性能和数据量开启OVERLAY_FS。开TASKS_RCU,CC_OPTIMIZE_FOR_PERFORMANCE_O2,graysky2 compiler patch,HZ_1000,CPU_FREQ_GOV_PERFORMANCE,Multi-Gen LRU,DEFAULT_BBR2,DEFAULT_FQ_PIE,XFS/ZFS

B.3 额外配置: OVERLAY_FS,参考【2】;ksoftirqd,参考3.1

C. HQPlayer

C.1 内核选择: xanmod-sources-6.0 (机器负载较高)> xanmod-rt-sources-6.0 (机器负载较低)

C.2 内核配置: 视机器负载开启PREEMPT_RT。开TASKS_RCU,CC_OPTIMIZE_FOR_PERFORMANCE_O2,graysky2 compiler patch,HZ_1000,CPU_FREQ_GOV_PERFORMANCE,Multi-Gen LRU,DEFAULT_BBR2,DEFAULT_FQ_PIE

C.3 额外配置: chroot/systemd-spawn,另外开贴介绍

D. Roon Bridge/Naa/Airplay

D.1 内核选择: xanmod-rt-sources-6.0 (激进用户或普通用户) > xanmod-rt-sources-5.15 (保守用户)

D.2 内核配置: 开NAA patch,PREEMPT_RT,TASKS_RCU,CC_OPTIMIZE_FOR_PERFORMANCE_O2,graysky2 compiler patch,HZ_1000,CPU_FREQ_GOV_PERFORMANCE,Multi-Gen LRU,DEFAULT_BBR2,DEFAULT_FQ_PIE,TMPFS

D.3 额外配置:ksoftirqd,参考3.1;TMPFS,参考【1】



回复

使用道具 举报

10
 楼主| 发表于 2022-10-27 21:20 | 只看该作者 来自 北京市
本帖最后由 中关村东路 于 2022-10-27 21:41 编辑

重复
回复

使用道具 举报

11
发表于 2022-10-27 21:23 | 只看该作者 来自 北京市
感谢。学习了。
回复

使用道具 举报

12
 楼主| 发表于 2022-10-27 21:27 | 只看该作者 来自 北京市


回复

使用道具 举报

13
发表于 2022-10-27 22:25 | 只看该作者 来自 北京市
本帖最后由 lalekuku 于 2022-10-27 22:33 编辑

请教,我的arm64开发板上装了hqpe,升频到dsd64负载大概60%多,是不是用非实时内核好点?
我另一个arm64网桥用了6.0版实时内核,看到2.2.2节里说xanmod-rt-sources-6.0不错,我也想编译一个试试,想问一下哪里能下载到xanmod-rt-sources-6.0内核源码?我那开发板内存分别只有1g和2g,适合用它吗??或者说,这俩板子做naa网桥的话推荐使用哪个内核?我用的系统是dietpi。
谢谢!


回复

使用道具 举报

14
 楼主| 发表于 2022-10-27 22:59 | 只看该作者 来自 北京市
本帖最后由 中关村东路 于 2022-10-27 23:02 编辑
lalekuku 发表于 2022-10-27 22:25
请教,我的arm64开发板上装了hqpe,升频到dsd64负载大概60%多,是不是用非实时内核好点?
我另一个arm64网 ...

1. 我的arm64开发板上装了hqpe,升频到dsd64负载大概60%多,是不是用非实时内核好点?

是,我觉得非实时内核更适合。当然,如果你现在很顺畅,而且不需要用更高频率,现在这负载其实不算高。我一般会让CPU负载在50%以下,如果用的更高,才会用软件优化,或者升级硬件。

2. 我另一个arm64网桥用了6.0版实时内核,看到2.2.2节里说xanmod-rt-sources-6.0不错,我也想编译一个试试,想问一下哪里能下载到xanmod-rt-sources-6.0内核源码?我那开发板内存分别只有1g和2g,适合用它吗??或者说,这俩板子做naa网桥的话推荐使用哪个内核?我用的系统是dietpi。

xanmod官方只支持x86 CPU,我本可以帮你补丁到arm64的,但我的树莓派不在现在的住处,要等下个小长假或者寒暑假才能取来测试了,可能最早的是元旦?不过其实你并不真的需要xanmod,完全可以从我推荐列表里选择想要的内核选项,如果官核支持,配置即可,不支持的再去找补丁打进来,可能更方便一些。举个例子,MGLRU patch,zen【5】就维护了。不过如果你不太熟练的话,可能就只能用rt-5.15了,因为这个是rt-patch的官方最新版,后面的版本需要熟悉一些才能编译成功。

【5】https://github.com/zen-kernel/zen-kernel

回复

使用道具 举报

15
 楼主| 发表于 2022-10-27 23:00 | 只看该作者 来自 北京市
建议感兴趣的同学直接回帖即可。站内消息我很容易忽略。
回复

使用道具 举报

16
发表于 2022-10-27 23:10 | 只看该作者 来自 北京市
中关村东路 发表于 2022-10-27 22:59
1. 我的arm64开发板上装了hqpe,升频到dsd64负载大概60%多,是不是用非实时内核好点?

是,我觉得非实 ...

感谢。
我先按前面的建议设置试试。
回复

使用道具 举报

17
发表于 2022-10-27 23:42 | 只看该作者 来自 广东省广州市
感兴趣学习,收藏了。
回复

使用道具 举报

18
 楼主| 发表于 2022-10-28 00:24 | 只看该作者 来自 北京市
huangshihai 发表于 2022-10-27 23:42
感兴趣学习,收藏了。


回复

使用道具 举报

19
发表于 2022-10-28 05:19 来自手机 | 只看该作者 来自 安徽省宿州市
中关村东路 发表于 2022-10-27 22:59
1. 我的arm64开发板上装了hqpe,升频到dsd64负载大概60%多,是不是用非实时内核好点?

是,我觉得非实 ...

期待树莓派版本,目前使用树莓派naa给dk,dsd只能升频到128,不知道是不是我的树莓派没有驱动的原因。
回复

使用道具 举报

20
发表于 2022-10-28 07:01 来自手机 | 只看该作者 来自 北京市
我来认真学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | -注册-

本版积分规则

Archiver|手机版|粤icp备09046054号|耳机网-耳机大家坛

粤公网安备 44030602000598号 耳机大家坛、www.erji.net、网站LOGO图形均为注册商标

GMT+8, 2024-5-14 17:42

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表