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

Roon和HQPlayer Embedded双机同步实现hqplayerd实时线程

[复制链接]
跳转到指定楼层
1
发表于 2023-6-17 00:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 | 来自北京 来自 北京
一些Roon和HQPlayer的相关厂商和用户喜欢使用实时内核加实时线程,以降低CPU延迟。在我本坛之前的帖子中《Roon系统硬核安装笔记》【1】中系统地介绍过几种Roon桥核实现实时线程的方法。在我维护的Gentoo软件源里【2】也维护着打了rt补丁、naa补丁、Gentoo补丁和Xanmod等补丁的实时内核。但HQPlayer作者在HQPlayer Embedded(HQPE)代码中显式维护了线程的优先级为非实时NICE=-10,导致了经典优雅的方法都失效了。付费音频发行版AudioLinux(AL)的作者编写了一个随时驻留在HQPE系统中的软件rtapp,每分钟调用开源软件rtirq,搜索hqplayer线程修改其优先级,我潜伏在AL用户群中看到在一些烧友的系统上这个软件并不稳定或者声音不理想。今天应AL群烧友Leslie创意和要求有了本文的方案和实现,分享给各位烧友和国内数播厂商。本人是音乐爱好者和Linux/macOS普通用户不是程序员,不能保证下面程序的绝对正确,请理解批判之后修改使用。


Leslie的思路很清晰。一方面在HQPE机器编写一个程序:只在需要的时候,搜索那些非实时的也就是刚刚生成的HQPE线程,都修改为实时线程。另一方面在RoonCore机器编写一个程序:查播放日志,如果播放了新曲子,就发送给HQPE机器这个消息,现在你可以去搜索并修改刚才生成的线程了。接下来就是我的实现,一共分三段,分别是在两台机器上如何操作,以及如何双机联动。如果对你有所帮助,或者遇到问题,请直接在本帖留言让更多人看到问题和解决方法。如果你不喜欢HQ/Roon或者不喜欢实时内核,请自行开贴讨论,我们现在只谈实现不谈声音。


【1】http://erji.net/forum.php?mod=vi ... =2253401&extra=
【2】http://erji.net/forum.php?mod=vi ... =2283776&extra=


2
 楼主| 发表于 2023-6-17 00:47 | 只看该作者 | 来自北京 来自 北京
1. HQPE上的脚本


我把这段代码保存在/root/rt.sh,给了执行权限chmod +x /root/rt.sh


  1. PRI1=89
  2. CHRT_LIST="hqplayerd"

  3. chrt_process() {
  4.     for NAME in ${CHRT_LIST}
  5.     do
  6.         PRI=$(( -${PRI1} - 1))
  7.         PIDS=`ps -eLF | grep "${NAME}" | awk '{print $4}'`
  8.         for PID in ${PIDS}
  9.         do
  10.             STAT=`cat /proc/${PID}/stat | awk '{print $18}'`
  11.             if ! [ "${PRI}" == "${STAT}" ]; then
  12.                 chrt -p -f ${PRI1} ${PID}
  13.             fi
  14.         done
  15.     PRI1=$((${PRI1} - 5))
  16.     done
  17. }

  18. chrt_process
复制代码


在上面的代码,PRI1=89意思是将HQPE线程将被赋予-90优先级。具体的取值可以按需修改,不改也可以。可以先试试这段脚本,执行前用htop看看HQPE的线程优先级。执行之后再看一遍。记得htop要F2设置一下,不能选Hide userland process threads,否则看不到子线程。


另外这段代码还可以在CHRT_LIST后面接着加其他你需要实时化的线程名字,比如ksoftirqd、ktimers等,会自动被赋值为-85, -80优先级依此类推。


回复

使用道具 举报

3
 楼主| 发表于 2023-6-17 00:48 | 只看该作者 | 来自北京 来自 北京
本帖最后由 中关村东路 于 2023-6-17 00:52 编辑

2. RoonCore的脚本


这段代码放在哪都行,只要执行了就好。


  1. i=0
  2. while true;
  3. do
  4.     if tail -10 /var/roon/RoonServer/Logs/RoonServer_log.txt | grep -q "Info: \[zone HoloAudio May\] OnPlayFeedback Playing"; then
  5.         echo "true"
  6.         ssh root@192.168.1.11 '/root/rt.sh'
  7.         i=0
  8.         sleep 10
  9.     fi
  10.         echo $i
  11.     sleep 1
  12.     i=$((i+1))
  13. done
复制代码


读者需要修改grep后面zone HoloAudio May为你自己HQPlayer的名字,具体是什么名字可用下面命令在Roon日志搜索:


  1. grep "OnPlayFeedback Playing" /var/roon/RoonServer/Logs/RoonServer_log.txt

  2. 06/17 00:00:01 Info: [zone HoloAudio May] OnPlayFeedback Playing
  3. 06/17 00:03:14 Info: [zone HoloAudio May] OnPlayFeedback Playing
  4. 06/17 00:09:37 Info: [zone HoloAudio May] OnPlayFeedback Playing
复制代码


除此之外,上面脚本中还要修改ssh后面的地址为你的HQPE机器。


最后,这段代码留了好些个i=0啊,echo啊之类的,是方便读者看到效果。调试成功了不想看就可以删掉,或者改成其他定制信息。


这段代码涉及联动不急执行,先做完3再回来测试。


回复

使用道具 举报

4
 楼主| 发表于 2023-6-17 00:49 | 只看该作者 | 来自北京 来自 北京
3. 双机联动


上面的脚本需要在Roon上检查日志,在HQPE上执行chrt脚本。我们需要再做一些联动配置,也就是Roon要可以免密连接HQPE。

首先登录RoonCore,看看是否已经生成了公钥。


  1. cat ~/.ssh/id_rsa.pub
复制代码


假如你看到类似下面这样很长一行,那就是生成了,复制下来。


  1. ssh-rsa xxxx root@zhjie-rooncore
复制代码


如果是 No such file or directory 就是没有,执行


  1. ssh-keygen
复制代码


一路回车即可生成这个文件了。一样,cat出来复制。


之后我们登录HQPE,为了简化流程直接获取root权限(sudo -i或者su - 都可以)


  1. nano ~/.ssh/authorized_keys
复制代码


之后把刚才的一段公钥粘贴到最后一行即可。


现在可以回到Roon机器,ssh root@192.168.1.11试试看是不是不需要输入密码了。记得修改成你自己的HQPE主机IP。


到此为止,本方案所需三个步骤就介绍完了。你可以打开Roon,播放巴赫的英国或者法国组曲调试一下。笑,或者其他一段音轨只有一分多钟的专辑。一边登录Roon看看脚本在播放新音轨时候输出了true没有,一边过去HQPE用htop看看是不是hqplayerd线程都是-90优先级。如果搞定了,恭喜你。


回复

使用道具 举报

5
 楼主| 发表于 2023-6-17 00:50 | 只看该作者 | 来自北京 来自 北京
在结尾需要说明,关于HQ/Roon和实时内核,很多人的听感都有不同。上面的代码应烧友要求编写,并不代表着执行了就会提高音质,但如果你有实时化HQPE的需求,那这套方案应该是比较科学的一种。我个人对实时内核、低延迟内核或者服务器常用的非抢占式内核并没有明确的偏好,但有一件事是确定的,上述三类内核延迟依次提高,在其他设置相同的情况下数据吞吐量依次提高,而系统负载则依次下降(后两个几乎相同)。另外一个降低延迟、提高吞吐的办法就是换成性能更好的CPU,但这也会导致散热、干扰等其他潜在问题。如何选择就需要烧友自行权衡了。
回复

使用道具 举报

6
 楼主| 发表于 2023-6-17 00:51 | 只看该作者 | 来自北京 来自 北京
打完收工。居然一次全部通过没经过审核。
回复

使用道具 举报

7
发表于 2023-6-17 12:40 | 只看该作者 | 来自北京 来自 北京
NB,继续跟大佬学习,都是新花样
回复

使用道具 举报

8
 楼主| 发表于 2023-6-17 15:13 | 只看该作者 | 来自北京 来自 荷兰
lalekuku 发表于 2023-6-17 12:40
NB,继续跟大佬学习,都是新花样


回复

使用道具 举报

9
发表于 2023-6-17 17:05 | 只看该作者 | 来自浙江 来自 浙江宁波
牛叉,楼主是名副其实的技术宅
我的系统是实时达菲主机(刷官方RT版ISO)--> HQPE主机(刷官方U盘镜像,可能非实时)--> NAA(gentooplayer实时内核),都是官方或第三方现成提供的,懒+笨用户的首选。
不知道自己这个系统折腾实时HQPE有没有正收益
回复

使用道具 举报

10
 楼主| 发表于 2023-6-17 17:25 | 只看该作者 | 来自北京 来自 荷兰
Devastat0r 发表于 2023-6-17 17:05
牛叉,楼主是名副其实的技术宅
我的系统是实时达菲主机(刷官方RT版ISO)--> HQPE主机(刷官方U盘镜像,可 ...

最近折腾这个的起因是欢乐总说起他用了AL最新推出的HZ_1666之后感觉更好听了,不能别人能会咱不会啊,我就也搞了一个,用的是tt调度器中的一段代码。

结果群里就开始折腾桥核HQ三台机器用RT/Dynamic/NO_PREEMPT+HZ_300/HZ_1000/HZ_1666的各种组合。。我目前用着的组合是RoonCore/HQ两台机器Dynamic/HZ_1666/BMQ调度器,x86网桥和树莓派是RT/HZ1666/CFS,一个cm4网桥是Dynamic/HZ_1666/CFS,开lto优化,native优化(也就是al/gp强调的v3v4优化)。好坏不能肯定,但是确实是有区别的..
回复

使用道具 举报

11
发表于 2023-6-17 19:52 | 只看该作者 | 来自北京 来自 北京
本帖最后由 lalekuku 于 2023-6-17 19:54 编辑
中关村东路 发表于 2023-6-17 17:25
最近折腾这个的起因是欢乐总说起他用了AL最新推出的HZ_1666之后感觉更好听了,不能别人能会咱不会啊,我 ...

请教:
1、lto优化,native优化(也就是al/gp强调的v3v4优化)------这是内核编译时的优化吗?具体在哪里设置?在你以前的帖子里有讲过吗?
2、HZ_1666------这个怎么设置?内核编译设置页里最多也就1000,这个1666是怎么弄出来的?1666在声音上有什么变化?我的是一个rk3328开发板,自己编译了xanmod rt内核
回复

使用道具 举报

12
 楼主| 发表于 2023-6-17 20:05 | 只看该作者 | 来自北京 来自 北京
lalekuku 发表于 2023-6-17 19:52
请教:
1、lto优化,native优化(也就是al/gp强调的v3v4优化)------这是内核编译时的优化吗?具体在哪 ...

1. lto(Link Time Optimization)是现在比较流行的编译优化技术,clang做的比较好,gcc也有部分支持。内核和普通包都可支持。

【1】https://wiki.gentoo.org/wiki/Clang#Link-time_optimizations_with_Clang

2. native优化指的是编译程序时候加上-march=native参数,同样是内核和普通包都支持。如果不是交叉编译的话,gcc/clang就会按cpu支持的最高等级优化。AL/GP等发行版推出了v3/v4优化的单独付费项目,本质上就是编译内核的时候加上了这个参数。

【2】https://wiki.gentoo.org/wiki/GCC_optimization

3. HZ_1666最初是tt调度器用到的,适当的使用更高的kernel timer frequency可以降低cpu延迟。1666基本上是树莓派性能的上限了,再高的话可能不能保证一个cpu时间之内完成任务。

【3】https://github.com/CachyOS/kernel-patches/blob/master/5.15/TT/0001-tt-high-hz.patch

回复

使用道具 举报

13
发表于 2023-6-17 20:44 | 只看该作者 | 来自北京 来自 北京
中关村东路 发表于 2023-6-17 20:05
1. lto(Link Time Optimization)是现在比较流行的编译优化技术,clang做的比较好,gcc也有部分支持。内核 ...

学习了,多谢
回复

使用道具 举报

14
发表于 2023-6-17 20:49 来自手机 | 只看该作者 | 来自山东 来自 山东
顶群友 很有营养的帖子
回复

使用道具 举报

15
发表于 2023-6-17 22:55 来自手机 | 只看该作者 | 来自福建 来自 福建福州
膜拜下,向楼主学习了不少
回复

使用道具 举报

16
 楼主| 发表于 2023-6-17 23:48 | 只看该作者 | 来自北京 来自 荷兰
回复

使用道具 举报

17
发表于 2023-6-18 16:22 | 只看该作者 | 来自云南 来自 云南
顶大佬,先MARK,慢慢学习!
回复

使用道具 举报

18
 楼主| 发表于 2023-6-19 13:17 | 只看该作者 | 来自北京 来自 北京
johnarcam 发表于 2023-6-18 16:22
顶大佬,先MARK,慢慢学习!

多交流
回复

使用道具 举报

19
发表于 2023-7-8 09:18 | 只看该作者 | 来自广西 来自 广西南宁
用的是安装版的em hq,如何设置成打开Hqplayer后能自动运行RT.SH?我在hqplayerd.service里设置不成功,需要手动运行。但会显示如下
cat: /proc/7222/stat: No such file or directory
chrt: failed to set pid 7222's policy: No such process
如何解决?
回复

使用道具 举报

20
 楼主| 发表于 2023-7-8 12:10 | 只看该作者 | 来自北京 来自 北京
万远 发表于 2023-7-8 09:18
用的是安装版的em hq,如何设置成打开Hqplayer后能自动运行RT.SH?我在hqplayerd.service里设置不成功,需要 ...

报这个错是正常的,因为脚本里ps出来的线程有些是ps本身的线程号。打开htop之类看看有没有hq线程不是rt,没有就可以了
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-16 09:48

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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