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

Roon系统硬核安装笔记

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

1 简介
2 Roon Server
3 x86 Roon Bridge
4 RPi4 Roon Bridge
5 后记


本文为“中关村东路”原创,在erji.net首发,未经作者允许请勿转载。




来自 2楼
 楼主| 发表于 2022-1-19 12:29 | 只看该作者 来自 北京
本文读起来太长,写一段spotlight吧:

  • Roon的四个关键线程
    功能详解,见2.9节;
    Roon代码的修改,见2.9节,3.4节。
  • CPU分离
    使用taskset,见2.9节;
    使用cgroup+overide.conf,见2.8节;
    使用cgroup+set-property,见2.10节;
    使用isolcpus,见3.4节。
  • 优先级设置
    使用rtirq,见3.6节;
    使用chrt,见3.4节,3.6节;
    使用NICE,见2.8节。
  • 内存系统的实现
    见3.7节,3.3节。
  • 降温相关
    nosmt, aspm, 见2.2节;
    屏蔽多余CPU,见3.5节;
    树莓派降频,见4.2节。
  • 降低延迟
    文件系统,见2.3节,2.4节,2.6节;
    网络延迟,见2.2节,2.5节;
    Roon操作响应,2.8节;
    Roon Server响应,见2.9节,2.10节;
    Roon Bridge响应,见3.2节,3.3节,3.4节,3.6节,3.7节。

回复

使用道具 举报

来自 3楼
 楼主| 发表于 2022-1-19 12:49 | 只看该作者 来自 北京
中关村东路 发表于 2022-1-19 12:29
本文读起来太长,写一段spotlight吧:

突然想起来,正文有一处没说清楚的。hifi树莓派系统圈子流行的rtirq默认的进程管理存在两个问题,一个是只能调节进程不能管理线程,如roon bridge的RAATServer实现为例,真正起作用的并非这个进程,而是其启动的子线程,rtirq就不能处理了;另外一个是,rtirq的进程管理会让优化进程的优先级提升为最高的RT,但是这样反而会带来操作系统本身的卡顿。使用我的脚本解决了这两个问题,一方面支持线程,一方面把最高设定为-89,超过绝大部分系统线程,却低于RT不影响系统运行,实际体验下来比rtirq方案非常明显的更加流畅。
回复

使用道具 举报

来自 4楼
 楼主| 发表于 2022-1-21 14:46 | 只看该作者 来自 北京
补三张内存、线程、CPU占用率的图,分别是我的Roon Server,x86 fRoon Bridge和我i9版本的macbook pro的:

我的RoonServer上只有Roon Server和为了登录截图保留的ssh两个用户态进程。


我的x86 RoonBridge上有Roon Bridge、识别解码器所需udev,和ssh三个进程。在最左边可以看到该线程被限制在cpu3上。RPi4 RoonBridge上因为有数字卡,甚至不需要udev进程。


这是我日常使用的i9版本的macbook pro的进程。这只是第一页,包括用户态和内核态一共有458个进程1593个线程。

回复

使用道具 举报

来自 5楼
 楼主| 发表于 2022-2-5 14:54 | 只看该作者 来自 荷兰
本帖最后由 中关村东路 于 2022-2-5 16:04 编辑

更新RoonServer的Gentoo安装包,现在支持独立的dotnet-runtime

在github搜索zhjie_gentoo_repo

目前维护了如下软件:
  1. eix -c --in-overlay zhjie-repo -#
  2. acct-group/plex
  3. acct-user/plex
  4. dev-dotnet/dotnet-runtime
  5. gnome-extra/gnome-shell-extension-unite-shell
  6. media-libs/alac
  7. media-sound/RoonBridge
  8. media-sound/RoonServer
  9. media-sound/sacd-extract
  10. media-sound/shairport-sync
  11. media-tv/plex-media-server
  12. sys-boot/rpi4-firmware
  13. sys-process/rtirq
  14. x11-misc/fqterm
  15. x11-misc/nvtop
  16. x11-misc/zotero
复制代码



回复

使用道具 举报

来自 6楼
 楼主| 发表于 2022-8-15 17:37 | 只看该作者 来自 荷兰
补充一段转化sacd-iso为dsf的脚本吧【1】,各种场合好多人问到。不是程序员,代码写的难看见笑了,需要你简单看看代码,修改一下自己的音乐目录。需要安装sacd_extract命令行工具【2】。

逻辑是,优先解压缩2.0声道,没有就尝试多音轨。二者之一能识别的话,就解压缩为dsf后删除iso文件。如果都不能识别就不做任何操作。只需删除相应行即可实现不删除iso文件。

【1】https://gist.github.com/zhjie/32b429a54501aba6d0673b2f2f8434fe

【2】https://github.com/EuFlo/sacd-ripper


回复

使用道具 举报

来自 7楼
 楼主| 发表于 2022-9-4 21:07 | 只看该作者 来自 北京
中关村东路 发表于 2022-2-5 14:54
更新RoonServer的Gentoo安装包,现在支持独立的dotnet-runtime

在github搜索zhjie_gentoo_repo

更新了airplay2播放!shairplay-sync-9999

https://github.com/zhjie/zhjie_gentoo_repo
回复

使用道具 举报

8
 楼主| 发表于 2022-1-18 22:21 | 只看该作者 来自 北京
本帖最后由 中关村东路 于 2022-1-18 22:26 编辑

1 简介

本文记录我Roon系统的组建思路,粘贴了一些代码示例,没有好看的设备,也不会拍漂亮的照片。可能需要读者对Linux系统,对Roon有基本的了解。如果打算只采用其中一部分,请理解之后再使用,简单照抄可能会有依赖关系。 大体的想法,是减少延迟,隔离资源给Roon的关键线程,维护设备/线程优先级列表,同时在不动态调整CPU频率的情况下尽可能降低功耗。


说起来本文的形成部分要起因于金波老师,因仰慕他传说中内置了树莓派的珍珠三界面,我按捺不住买来树莓派4b提前演练,并为此写了本文中的一系列代码,以便在拿到珍珠三的第一时间就用上自己的优化脚本。 结果现在珍珠三还没影呢,我已经把主力转向x86 Roon Bridge了。。。现在把优化过程和关键代码发出来,希望有更多人能用得到吧。


我的硬件主要包括Roon Server主机,x86 Roon Bridge,RPi4 Roon Bridge。此外有两套解码器耳放前级,两套音箱,三支大耳。 其中,Roon Server主机兼有本地存储和tidal网播,但我家网络可能很成问题,tidal经常卡,所以本地播放更多,为此选择了可以使用大内存缓存的zfs方案。 x86 Roon Bridge是主力系统,和Roon Server在同一个交换机下,通过USB输出到解码,之后连接耳放前级音箱大耳。 RPi4 Roon Bridge在同城异地,通过zerotier连接到Roon Server,偶尔使用。


下面这张效果图。之前用一个macbook pro连接解码器,专门用来pc-lowfi,桌上要多一个没必要的屏幕和键盘,Roon可以用笔记本/iPad控制,桌面简洁多了。

Figure 1: 现在桌面只有前级耳放音箱耳机。其他都乱七八糟的藏在桌子下面。



回复

使用道具 举报

9
 楼主| 发表于 2022-1-18 22:22 | 只看该作者 来自 北京
本帖最后由 中关村东路 于 2022-1-18 22:51 编辑

2 Roon Server


2.1 硬件配置

Roon Server,我的思路是无扇加低延迟。最初用的AMD 5600x,用了半年多吧,猫头鹰风扇虽然声音小,知道有这么个风扇还是让我不能接受。 于是换成现在的Intel G6405 CPU,32G内存,海韵开关电源,分形Define13盘位机箱。 大机箱,大散热器,加上软件上的优化,可以保持无风扇35-45度之间。如果不需要很大的存储空间,也建议使用8-12盘位的机箱,一方面保留升级空间,另一方面用空位隔开可以降低硬盘温度。


1T nvme ssd作为系统盘并存放Roon索引和图片,2个2.5寸sata ssd作为下载盘,10个3.5寸hdd作为数据盘,其实机箱还有一个盘位,但是主板和HBA卡没空了。

Figure 2: 机箱提供了硬盘风扇,但是我没打开,写入量不大的话温度尚可。

Figure 3: 特地找出这张图,其中四色线是应对氦气盘做的转接电源线和电容,白色线连到HBA卡。


Roon官方推荐维护10万以上track应该使用I3或以上作为Roon Core,但实际上不使用升频、DSP、background audio analysis、on-demand audio analysis这几个功能时G6405加32G内存维护百万级别绰绰有余。 而尽量低配的CPU的好处是可以扔掉风扇。如果对性能有更高的要求,也强烈建议尽量用更大的散热设备,而不是引入风扇,因为风扇带来的各类噪音不易控制。当然,高手也可以使用高端静音风扇,并单独供电。 本文脚本是配合双核四线程的G6405编写的,但读者很容易修改成兼容i3/5/7/9或AMD的。


此外,因为Roon对多线程利用很差,所以我的Roon Server在BIOS里屏蔽了超线程。给Roon的关键线程RoonAppliance单独分配一个核心,除了zfs文件系统之外的其他线程分配在另外一个核心,并允许zfs利用所有核心。 当然,如果你的电脑核心很多,也可以限制zfs不使用Roon所用的核心。


2.2 操作系统和内核

我使用的是Gentoo Linux操作系统,一则习惯,二则灵活。 这个系统中每个软件都针对本机硬件配置优化,需要自己编译,这需要消耗大量计算能力,无扇环境发热处理的不好的话可能不一定能撑得住。 最简单的办法是用其他电脑交叉编译。如果散热做的好,或使用其他操作系统可部分的避免这个问题。


Roon Server用systemd,pf-sources内核;Roon Bridge用openrc,rt-sources内核。 需要的模块都直接编译进内核,容量一般可以控制在10M以下。我的Roon Server的内核启动设置如下:

  1. GRUB_CMDLINE_LINUX="intel_idle.max_cstate=0 vsyscall=none net.ifnames=0 ipv6.disable=1 nmi_watchdog=0 nosmt=force pcie_aspm=force"
  2. GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet transparent_hugepage=never clocksource=hpet noibrs noibpb nopti nospectre_v2 nospectre_v1 l1tf=off nospec_store_bypass_disable no_stf_barrier mds=off mitigations=off"
复制代码
上面的设置除了nosmt,aspm,cstate和hpet之外几乎都是提高性能的,如果你的CPU强劲不设也可以。关掉超线程,打开aspm可以降低温度,还是值得设的。

我并没在这里直接分离CPU核心,而是用的systemd+cgroup,主要是为了灵活,也让zfs可以利用全部核心,提高IO效率。 而Roon Bridge功能极其单一,我用的又是全内存方案,不需要zfs,所以在内核引导时就隔离了CPU,后面会提到具体代码。


Roon Server内核设置有如下需要指出的,具体是什么可以查询手册我就不解释了,除了网络部分之外的多数不设置对性能的影响也都可以接受,或者可以在其他地方配置。还有很多其他设置没有列出来。


General Setup

选择Preemptible kernel;关闭超线程;设置Optimize more for performance(-O3)。


Processor type and features

设置Processor family为native optimizations autodetected by the compilor;设置Timer frequency为1000HZ。


Power management and ACPI options

关闭suspend/hibernation,关闭ACPI中无用设置,CPUFreq governor选择performance,关闭其他选项。


Virtualization

我关闭了。如果有docker需求也可打开。


IO Schedulers

我全都关闭了。如果不使用zfs,且使用机械硬盘,应按实际情况选择。


Networking support

关闭除了Networking Options之外的无关选项,也可关闭ipv6。注意打开advanced congestion control里的bbr或者bbr2,关闭所有其他选项。


Device Drivers

关闭除了本机使用的硬盘(nvme/sas/sata/scsi)、网卡、rtc时钟之外的所有驱动。fb、usb、kbd可以暂时留着用于调试,系统稳定之后也可以去掉。


2.3 硬盘文件系统

系统盘和下载盘用ext4/xfs文件系统,可以降低内存占用; 音乐盘使用zfs raidz/raidz2,每四到六盘为一组,默认16G内存(一半物理内存)作为缓存即可,也可视稳定运行时候的内存剩余增加缓存,这可以利用内存缓存减少硬盘顺序读取的延迟; 分为两组的好处是一组有硬盘损坏掉线时可以立刻把关键数据拷贝出来。 另外两块硬盘我用于备份科研数据,使用zfs raid1,每次rsync -avP –no-p –no-g –chmod=ugo=rwX –delete –exclude-from=$rexclude备份后打snapshot,Roon Server的数据库(主要包括索引和海量图片)备份也放在这。


这里需要指出,使用raid是便于组织数据,并利用zfs的缓存优势。重要数据还是有必要备份的。


2.4 磁盘调度器

因为ssd性能好,改为none调度器即可;zfs自己有自己的调度器,所以也设置成none调度器。

  1. cat /etc/udev/rules.d/60-ioschedulers.rules
  2. ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="none"
  3. ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/rotational}=="0",ATTR{queue/scheduler}="none"
  4. ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="none"
复制代码

zfs只设置了zpool ashift=12,zfs atime=off两个参数。备份盘加compression=on参数可降低IO提高性能,音乐盘压缩没什么用不要加。

  1. zpool create music0 raidz -m none -o ashift=12 ata-WDC_WUHxxx ata-WDC_WUHyyy ...
  2. zfs set atime=off music0
  3. zfs create -o mountpoint=/storage/music/classic music0/classic
  4. zfs create -o mountpoint=/storage/music/jazz    music0/jazz
复制代码

2.5 BBR2

和前面内核部分对应,如果你编译中选择了bbr一代要相应修改。

  1. cat /etc/sysctl.d/10-custom-kernel-bbr.conf
  2. net.core.default_qdisc=fq
  3. net.ipv4.tcp_congestion_control=bbr2
  4. net.ipv4.tcp_ecn=1
复制代码

2.6 watchdog等其他设置

Roon Server管理的文件多的话需要设置第一条,其他各类杂项设置可以自己调整。

  1. cat /etc/sysctl.d/15-max-user-watches.conf
  2. fs.inotify.max_user_watches = 2093952
  3. kernel.nmi_watchdog = 0
  4. vm.dirty_writeback_centisecs = 6000
复制代码

2.7 安装Roon Server

如果用Gentoo Linux操作系统的,可以使用我在github维护的源zhjie:gentoo_repo中直接安装。当然也可以使用其他方法例如官网下载手动安装。 需要指出两点,第一是Roon Server启动过程中需要依赖alsa,但实际上却不需要内核中编译alsa驱动。 第二点,如果不需要转换格式,例如升频,Roon Server并不像官方宣称的依赖于ffmpeg,所以我的ebuild提供了编译和依赖选项,也提供选择使用systemd/rc。 必须依赖的只有icu和alsa-lib。 在下面例子里的“systemd -ffmpeg”表明,我的Roon Server用systemd管理,而不依赖于ffmpeg。

  1. eix RoonServer -I
  2. [I] media-sound/RoonServer [1]
  3.   Available versions:  (~)1.8.884^md {ffmpeg systemd}
  4.   Installed versions:  1.8.884^md(11:33:07 PM 01/01/2022)(systemd -ffmpeg)
  5.   Homepage:            https://roonlabs.com/index.html
  6.   Description:         music player sever
  7. [1] "zhjie-repo" /var/db/repos/zhjie-repo
复制代码

2.8 优化Roon Server的界面响应

本小节设置优先级主要是优化界面、搜索、增加新音乐等的响应,并不影响音乐播放。 如果你有多个CPU核心,那么建议在这里的“AllowedCPUs=0,1”只分配给Roon两个即可,其中一个给RoonApplicance,一个给其他,再多了Roon也是针对这个任务单线程计算。

  1. cat /etc/systemd/system/roonserver.service.d/override.conf
  2. [Service]
  3. Nice=-20
  4. AllowedCPUs=0,1
复制代码


2.9 给Roon Server关键线程隔离CPU

给播放音乐最重要的RoonAppliance分配单独的CPU核心,下面的脚本里是CPU1,而把RAATServer和RoonServer通过cgroup和taskset分配到其他核心,即CPU0,以避免索引新增音乐时干扰当前的音乐播放。


注意Roon Server的RAATServer其实是可以关掉的,因为这个线程是用来管理本机解码器的,我连在Roon Bridge上了在这就不需要了。 但我关了之后发现Roon会经常轮询产生没找到的错误日志,我就又打开了,反正也不占用资源。

  1. sed -i 's/exec "$HARDLINK" "$SCRIPT.dll" "$@"/exec taskset -c 1 "$HARDLINK" "$SCRIPT.dll" "$@"/g' \
  2.     /opt/RoonServer/Appliance/RoonAppliance
  3. sed -i 's/exec "$HARDLINK" "$SCRIPT.dll" "$@"/exec taskset -c 0 "$HARDLINK" "$SCRIPT.dll" "$@"/g' \
  4.     /opt/RoonServer/Appliance/RAATServer
  5. sed -i 's/exec "$HARDLINK" "$SCRIPT.dll" "$@"/exec taskset -c 0 "$HARDLINK" "$SCRIPT.dll" "$@"/g' \
  6.     /opt/RoonServer/Server/RoonServer
复制代码

上面优化的依据是官方提供的如下关于Roon Server/Bridge各个线程的作用:


RoonAppliance

where the “Roon Core” lives


RAATServer

makes this device available as a networked endpoint that can play audio


RoonServer

handles all of the core functions(library management, Tidal, DSP, etc)


RoonBridgeHelper

manages some administrative details for Roon Bridge

[1] https://community.roonlabs.com/t/what-are-these-different-processes/20335/3

[2] https://community.roonlabs.com/t/roonbridge-roonserver-change-priority-of-the-process/32470/2


2.10 给其他进程分配CPU

前面说过,我把CPU1分配给了RoonAppliance,所以限制其他所有进程,只使用CPU0。如果你有更多核心,也可以改为AllowedCPUs=2,3,记得把RoonAppliance所在的CPU1留下来就可以。 在这里systemd的方便就显示出来了,恩,真很方便。当然也也可以像前面Roon Server一样使用“override.conf”实现。 其中尤其需要注意的是sshd,每次远程登录之后执行的命令都会继承sshd的cgroup,所以如果这里不限制可能会导致执行的命令占用Roon的资源。

  1. systemctl set-property --runtime -- systemd-udevd.service AllowedCPUs=0
  2. ...
  3. systemctl set-property --runtime -- sshd.service AllowedCPUs=0
复制代码


  1. systemctl set-property --runtime -- systemd-udevd.service AllowedCPUs=2,3
  2. ...
  3. systemctl set-property --runtime -- sshd.service AllowedCPUs=2,3
复制代码






回复

使用道具 举报

10
 楼主| 发表于 2022-1-18 22:22 | 只看该作者 来自 北京
本帖最后由 中关村东路 于 2022-1-18 22:58 编辑

3 x86 Roon Bridge
3.1 硬件配置

这台x86小主机放在书房桌子下面,走usb经过隔离输出到解码器,再连到桌上的耳放前级,输出给真力2.1,HD800s,HEK,是我的主力系统,每天会播放五六个小时以上。 具体配置是华擎j3455主板,一块sata ssd硬盘仅启动时候使用,chh一个师傅做的大恶魔dc-atx hifi版,外接12v电源,也是全无扇,温度相当低。

Figure 4: 我在淘宝能找到的最小的itx机箱,组装Roon Bridge。外接12v dc电源可自行选择。


这个CPU没有超线程,但有四个核心,正好分给RAATServer,RoonBridgeHelper,RoonBridge三个线程各一个,另外一个留给udev等系统进程。 作为roon endpoint,几乎不需要保存任何数据,因此本机做成了全内存系统,并在系统运行120秒后关闭硬盘电源。


3.2 操作系统和内核

同样Gentoo Linux操作系统,使用rt-sources实时内核,除了和Roon Server一样的其他设置之外,还需要设置实时内核:


General Setup

先选择Configure standard kernel features;之后可以选择Full Preemptible Kernel


Device Drivers

这台机器没有nvme和sas,可以都删掉。但是因为要连接USB解码器,所以要选Sound card support选项中的USB sound devices,和USB support里的xHCI support。


3.3 磁盘休眠

除了Roon Server一样的所有优化之外,因为本机使用了全内存系统,所以硬盘定时关电。可以放在init.d里,也可以放在udev里,这个随意。

  1. hdparm -B 1 -S 120 /dev/sda
复制代码

需要注意这个只是让ssd休眠,如果休眠后登录系统并执行特定命令,还会再让磁盘启动。如果比较激进也可以干脆关掉磁盘的电源,但这样如果执行一些命令,会在dmesg中留下错误,我不能容忍就没采用。

3.4 分配CPU

在Roon Server的基础上,还要在内核启动参数加上“threadirqs”以实现以支持rt,加上“isolcpus=1-3”留给三个RoonBridge线程。

  1. GRUB_CMDLINE_LINUX="... threadirqs isolcpus=1-3"
复制代码

现在(Bridge 1.8.880)Linux版的Roon Server运行在dotnet上,而Roon Bridge还运行在mono上,以后可能会统一,下面的脚本也可能需要相应修改。但肯定依然可以使用的taskset分配cpu,chrt分配优先级。

  1. sed -i "s/\-\-debug//g" /opt/RoonBridge/Bridge/RAATServer
  2. sed -i "s/\-\-debug//g" /opt/RoonBridge/Bridge/RoonBridgeHelper
  3. sed -i "s/\-\-debug//g" /opt/RoonBridge/Bridge/RoonBridge
  4. sed -i 's/exec \/bin\/bash/exec chrt -r 60 taskset -c 3 \/bin\/bash/g' /opt/RoonBridge/Bridge/RoonBridge
  5. sed -i 's/exec \/bin\/bash/exec chrt -r 60 taskset -c 2 \/bin\/bash/g' /opt/RoonBridge/Bridge/RoonBridgeHelper
  6. sed -i 's/exec \/bin\/bash/exec chrt -r 60 taskset -c 1 \/bin\/bash/g' /opt/RoonBridge/Bridge/RAATServer
复制代码

3.5 屏蔽多余的CPU

如果你已经买了i3/5/7/9,有太多的cpu核心,想降温,可以只保留cpu0-3,甚至更激进。

  1. for x in /sys/devices/system/cpu/cpu[4-9]*/online; do
  2.   echo $x
  3.   echo 0 | tee -a $x
  4. done
复制代码

3.6 提高线程优先级

我的IRQ优先级排序为:rtc(时钟) > xhci_hc(解码器的USB口) > eth(网卡),通过rtirq实现比较方便就没自己写代码。


首先看一下目前的设备:

  1. cat /proc/interrupts
  2.            CPU0       CPU1       CPU2       CPU3
  3.   0:         11          0          0          0   IO-APIC   2-edge         timer
  4.   8:          0          0          0       3333   IO-APIC   8-fasteoi      rtc0
  5.   9:          0          0          0          0   IO-APIC   9-fasteoi      acpi
  6. 120:          0          0          0          0   PCI-MSI 311296-edge      PCIe PME
  7. ......
  8. 124:    1287643          0          0          0   PCI-MSI 524288-edge      eth0
  9. 125:          0          0    2644873          0   PCI-MSI 344064-edge      xhci_hcd
复制代码

在最后一列中按顺序选出相应模块的关键字填入rtirq的配置文件中:
  1. grep RTIRQ_NAME_LIST /etc/conf.d/rtirq
  2. RTIRQ_NAME_LIST="rtc xhci_hcd eth0"
复制代码

按照archphile的建议,还可以把下列进程设置为实时,
  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)
复制代码

如果资源紧张,只有单核或双核,也可以再设置Roon Bridge两个关键线程(RAATServer.exe RoonBridgeHelper.exe)的优先级:
  1. PROCESS_LIST="RAATServer.exe RoonBridgeHelper.exe RoonBridge.exe processreaper"
  2. PRI1=89
  3. for NAME in ${PROCESS_LIST}
  4. do
  5.     PIDS=`ps -eLf | grep "${NAME}" | awk '{print $4}'`
  6.     for PID in ${PIDS}
  7.     do
  8.         chrt -p ${PRI1} ${PID}
  9.     done
  10.     PRI1=$((${PRI1} - 1))
  11. done
复制代码

3.7 内存系统的实现

根据Roon Bridge的具体配置,使用如下脚本处理相应目录。例如,我的内存充裕,把就把所有目录都放在内存里了。 再配合前面的脚本把硬盘休眠,就实现了全内存运行的系统。

  1. # bin etc lib lib64 opt root sbin tmp usr var
  2. mount none -t tmpfs /mnt/.ramdisk/$1
  3. rsync -a /$1/ /mnt/.ramdisk/$1
  4. mount -o bind /mnt/.ramdisk/$1/ /$1/
  5. sync && echo 3 > /proc/sys/vm/drop_caches
复制代码

需要注意的是,Roon Bridge在Roon Core注册时候会在本地 /root/{.RAATServer,.RoonBridge,.rmembid} 记录本机信息。 所以需要先在硬盘系统上打开Roon Bridge,并在Roon Control操作界面添加这个Roon Bridge,并设置解码器参数,之后再写入内存系统就可以记忆这台Roon Bridge了,这也是这台机器上唯一需要保留的数据。

系统都移到内存之后,再重启相应服务。重启了Roon Bridge服务之后还要重新设置前面提到的进程/线程优先级。

  1. /etc/init.d/udev restart
  2. /etc/init.d/sshd restart
  3. /etc/init.d/roonbridge restart
  4. /etc/init.d/rtirq restart
复制代码

内存系统启动之后效果如下:
  1. df -h
  2. Filesystem      Size  Used Avail Use% Mounted on
  3. none            3.9G  200K  3.9G   1% /run
  4. udev             10M     0   10M   0% /dev
  5. tmpfs           3.9G   12K  3.9G   1% /dev/shm
  6. /dev/sda2       234G  1.3G  220G   1% /
  7. cgroup_root      10M     0   10M   0% /sys/fs/cgroup
  8. none            3.9G  8.7M  3.9G   1% /bin
  9. none            3.9G  2.1M  3.9G   1% /etc
  10. none            3.9G  9.9M  3.9G   1% /lib
  11. none            3.9G  8.9M  3.9G   1% /lib64
  12. none            3.9G   43M  3.8G   2% /opt
  13. none            3.9G  400K  3.9G   1% /root
  14. none            3.9G  6.1M  3.9G   1% /sbin
  15. none            3.9G     0  3.9G   0% /tmp
  16. none            3.9G  458M  3.4G  12% /usr
  17. none            3.9G   24K  3.9G   1% /var
复制代码

回复

使用道具 举报

11
 楼主| 发表于 2022-1-18 22:25 | 只看该作者 来自 北京
本帖最后由 中关村东路 于 2022-1-18 23:10 编辑

4 RPi4 Roon Bridge4.1 硬件配置

这台树莓派没在同一个局域网,利用zerotier和Roon Core虚拟组网连接,周末假期会用一下。 加了HifiBerry Digi+ Pro数字卡,加了时钟,加了线电,同轴输出给解码器,输出给音箱耳机。和x86 Roon Bridge同样做成全内存实时系统。


想找个照片贴在这的,结果发现居然一直没照过。机器又不在身边,好吧。


4.2 操作系统和内核设置

同样Gentoo Linux操作系统,同样使用rt-sources实时内核,除了和上面X86的Roon Bridge相同的设置之外,还需要配置数字卡。在下面的配置中关闭了蓝牙和wifi和一些其他优化,感兴趣可以查手册。

  1. cat /boot/config.txt
  2. arm_64bit=1
  3. enable_gic=1
  4. disable_overscan=1
  5. gpu_mem=32
  6. dtparam=audio=off
  7. audio_pwm_mode=2
  8. disable_splash=1
  9. hdmi_force_hotplug=1
  10. hdmi_blanking=2
  11. start_x=0
  12. dtparam=eee=off
  13. dtparam=eth_max_speed=100
  14. dtparam=eth_led0=4
  15. dtparam=audio=off
  16. dtoverlay=disable-wifi
  17. dtoverlay=disable-bt
  18. dtparam=krnbt=off
  19. dtoverlay=hifiberry-digi-pro
  20. force_eeprom_read=0
复制代码

运行起来发现这树莓派比我的x86主机还热,降频运行。这段配置来自roon论坛,并不是我原创。
[3] https://community.roonlabs.com/t/underclocked-pi-4-the-perfect-low-budget-77-usb-bridge/93743/7
  1. force_turbo=1
  2. arm_freq=600
  3. arm_freq_min=600
  4. gpu_freq=150
  5. core_freq=200
  6. core_freq_min=200
  7. h264_freq=200
  8. isp_freq=200
  9. v3d_freq=200
  10. sdram_freq=300
  11. sdram_freq_min=300
  12. avoid_pwm_pll=1
  13. over_voltage=-8
  14. over_voltage_min=-8
  15. over_voltage_sdram=-8
  16. over_voltage_sdram_c=-8
  17. over_voltage_sdram_i=-8
  18. over_voltage_sdram_p=-8
复制代码

关闭了树莓派上的所有灯。

  1. dtoverlay=act-led
  2. dtparam=act_led_trigger=none
  3. dtparam=act_led_activelow=off
  4. dtparam=pwr_led_trigger=none
  5. dtparam=pwr_led_activelow=off
  6. dtparam=eth_led0=4
  7. dtparam=eth_led1=4
复制代码

还有一些其他的没通过发不出来。。



回复

使用道具 举报

12
 楼主| 发表于 2022-1-18 22:34 | 只看该作者 来自 北京
本帖最后由 中关村东路 于 2022-1-18 23:17 编辑

5 后记
本人三十多岁的理工男,平时使用Linux/macOS,但不是程序员或工程师,上面的代码仅供参考并不负责正确。
我也是重度音乐爱好者,会演奏几种乐器,从小学到大学一直在校乐队,工作后有自己的室内乐队,自己扒谱编曲,也经常受邀演出,每天长时间听音乐已是三十多年的习惯。 但HiFi是个绝对外行,更侧重功能上的需求而非音质。上面做的这些“优化”都是国内外各路神仙提到的什么“重要”,以及我日常使用的工作站上自己的设置。 比如听说降低延迟能提高音质,我就实现了一下,起码能实现播放不卡顿,同时丢掉风扇。

你可以认为我并没对比过哪个好,我听不出来,也不想知道。所以请不要指责我“脑放”,“玄学”,或者“中学物理”之类的。我只希望读者各取所需,有所帮助。

本文为“中关村东路”原创,在erji.net首发,未经作者允许请勿转载。
回复

使用道具 举报

13
发表于 2022-1-18 22:50 来自手机 | 只看该作者 来自 北美地区
树莓派picoreplayer达菲lms报道下。

回复

使用道具 举报

14
 楼主| 发表于 2022-1-18 23:11 | 只看该作者 来自 北京
grrr 发表于 2022-1-18 22:50
树莓派picoreplayer达菲lms报道下。

只简单用u盘体验过daphile,我这音乐比较多,daphile搜索功能略差就没继续使用。不过听说声音不错
回复

使用道具 举报

15
发表于 2022-1-19 00:03 来自手机 | 只看该作者 来自 北美地区
中关村东路 发表于 2022-1-18 23:11
只简单用u盘体验过daphile,我这音乐比较多,daphile搜索功能略差就没继续使用。不过听说声音不错

树莓派是我的播放器,这是树莓派跟数字卡的晶振,达菲是文件服务器,相对简单的方案。你可以试试看效果,对比下,你也有树莓派。
回复

使用道具 举报

16
发表于 2022-1-19 00:05 | 只看该作者 来自 中国
老哥技术流弊
回复

使用道具 举报

17
发表于 2022-1-19 04:20 来自手机 | 只看该作者 来自 中国
技术流 … 有水平的好贴 支持
回复

使用道具 举报

18
发表于 2022-1-19 05:14 | 只看该作者 来自 美国
马一下,回头细啃。

请问Zerotier是免费的软件吗
回复

使用道具 举报

19
发表于 2022-1-19 07:34 来自手机 | 只看该作者 来自 中国
技术牛人,顶一帖。
回复

使用道具 举报

20
发表于 2022-1-19 07:44 来自手机 | 只看该作者 来自 广东深圳
这linux裁剪到这个程度可以考虑挂个自研linux音频专用系统
回复

使用道具 举报

21
发表于 2022-1-19 08:33 | 只看该作者 来自 上海
技术牛人,顶一帖,学习了,谢谢
回复

使用道具 举报

22
发表于 2022-1-19 09:30 | 只看该作者 来自 中国

顺便羡慕一下楼主的大桌子
回复

使用道具 举报

23
发表于 2022-1-19 09:49 | 只看该作者 来自 中国
强啊
回复

使用道具 举报

24
发表于 2022-1-19 10:04 | 只看该作者 来自 江苏无锡
grrr 发表于 2022-1-18 22:50
树莓派picoreplayer达菲lms报道下。

晶振板是要焊线到树莓派上的吧?加钟效果有多大提升?
回复

使用道具 举报

25
发表于 2022-1-19 10:04 | 只看该作者 来自 福建厦门
老大,我能说我都看不懂么
还好QQ上你不跟我提这堆
回复

使用道具 举报

26
发表于 2022-1-19 10:26 | 只看该作者 来自 湖南
用得着这么麻烦么。。。买个M1的MAC把内存加大点不是又稳定又舒心。。。
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-24 00:46

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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