注:本文基于 DS918+ 6.2.3-25426 测试通过,同时可以适用于其他系统以及其他型号的机器。
网上有不少这种教程了,一般都是说去设置 BIOS 来解决,不过经测试在关闭 C 状态支持 和 动态节能技术 之后,网络复制速度倒是挺正常,但是 USB3.0 的读取速度依然很慢,而且波动很大,经常跑到几百KB/s。
通过查看资源监控里的磁盘利用率发现即使读取速度在几百 KB/s 的时候磁盘利用率依然达到 100%,这说明系统对 CPU 资源的调度明显出现了问题。
所以想到了可能是系统中断上面出了问题,于是 SSH 连接到群晖,使用 cat /proc/interrupts 命令发现大部分的系统中断都在使用 CPU0,而其他核心基本在围观,所以基本可以确定是这方面的问题了。
解决方法:
0. 进入 BIOS 设置,高级/CPU 配置:
- Intel SpeedStep Technology (Intel 动态节能技术 ) -> 开启
- CPU C States Support (CPU C 状态支持 ) -> 选择 C1
- Enhanced Halt State (C1E) ( 增强型空闲状态 ) -> 开启
- Power Gear -> 运动模式(Sport Mode)
1. SSH 连接到群晖,sudo -i 切换到 root,使用 cat /proc/interrupts 查看 0000:00:12.0 0000:03:00.0 xhci_hcd eth0 i915 这几行前面的数字并记下(如图是 371-375,一般开启了 VT-d 是这5个数字,没开 VT-d 就是 369-373)。
2. 执行 synoservicectl --status irqbalance 查看 irqbalance 服务的状态,如果不是 stop/waiting,继续执行 synoservicectl --stop irqbalance 命令停用 irqbalance 服务。
3. 分别执行下面几条命令(注意数字跟你上面看到的要对应)
开启了 VT-d 的:
echo 2 >/proc/irq/371/smp_affinity
echo 2 >/proc/irq/372/smp_affinity
echo 8 >/proc/irq/373/smp_affinity
echo 4 >/proc/irq/374/smp_affinity
echo 1 >/proc/irq/375/smp_affinity
没开 VT-d 的:
echo 2 >/proc/irq/369/smp_affinity
echo 2 >/proc/irq/370/smp_affinity
echo 8 >/proc/irq/371/smp_affinity
echo 4 >/proc/irq/372/smp_affinity
echo 1 >/proc/irq/373/smp_affinity
4. 回到 DMS,打开 控制面板 -> 计划任务,新增 触发的任务->用户自定义的脚本,创建一个开机触发任务。
运行脚本内容填写上面在终端运行的那几条命令
原理说明:
不建议关闭 CPU 的 C状态支持,实测在关闭后即使调整了 IRQ Affinity,USB3.0 依然不会满速,只是速度会稳定在一个可以接受的水平。
使用 cat /proc/interrupts 命令查看的几个中断号分别的对应关系:
0000:00:12.0 | 内置 SATA 控制器 |
0000:03:00.0 | ASM1061 SATA 控制器 |
xhci_hcd | USB3.0 |
eth0 | 网卡 |
i915 | 核心显卡 |
可以使用 cat /proc/irq/{irq_num}/smp_affinity 查看各个 中断绑定的 CPU,不开 irqbalance 服务的话默认是 f(使用全部四个核心),但是在四个核心全部绑定之后其实大部分时候使用的都是 CPU0,所以性能会很低。
irqbalance 其实是为了解决这个问题的,它可以动态调整中断和CPU核心的绑定关系,可能是群晖系统带的这个 irqbalance 有问题(也可能是配置问题),导致CPU核心的分配的并不是很合理,所以性能依然不稳定。
顺便说一下,前面说了通过网络复制速度正常保持在 100MB/s 左右是因为 eth0 对应的 IRQ 绑定到 CPU2 上了,而 xhci_hcd 是绑定在 CPU0 和 CPU1 的(其实只有 CPU0 在被使用)。
所以我们就禁用 irqbalance 服务,然后手动指定中断和CPU核心的绑定关系即可。
/proc/irq/{irq_num}/smp_affinity 这个文件内容就是指定 IRQ 绑定到哪个 CPU 核心,对于四核心的 J3455 来说,就是一个 4bit 的16进制数字。
使用哪个核心就在这个数字的对应 bit 位设置 1,如二进制 0b1111 表示 0xf 即使用 0-3 四个核心。
我们要做的就是把上面 5 个 IRQ Affinity 分配到这四个核心上(下表仅供参考,可以可以根据需要重新分配)。
IRQ | 二进制 | 十六进制 |
0000:00:12.0 | 0010 | 2 |
0000:03:00.0 | 0010 | 2 |
xhci_hcd | 1000 | 8 |
eth0 | 0100 | 4 |
i915 | 0001 | 1 |
将 /proc/irq/{irq_num}/smp_affinity 的值设置一个确定的 CPU 核心上之后,再次测试 USB3.0 的速度就正常了。
原文地址:http://www.nasyun.com/thread-71910-1-1.html