![如何针对 libata 内核参数修改定位特定的驱动程序?](https://linux22.com/image/1038651/%E5%A6%82%E4%BD%95%E9%92%88%E5%AF%B9%20libata%20%E5%86%85%E6%A0%B8%E5%8F%82%E6%95%B0%E4%BF%AE%E6%94%B9%E5%AE%9A%E4%BD%8D%E7%89%B9%E5%AE%9A%E7%9A%84%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
我正在运行一个 22 磁盘设置,其中 19 个磁盘在 ZFS 阵列中,15 个磁盘由连接到模块驱动的 SATA 控制器的三个端口倍增器支持sata_sil24
。全速运行(SATA2,3 Gbps)时,操作非常奇怪。简单的读取错误会导致整个端口倍增器长时间处于痉挛状态,有时结果非常糟糕。使用内核参数启动libata.force=1.5G
以强制 SATA 控制器进入“传统”速度可以完全解决端口倍增器的所有问题。问题是,我的 ZFS 池由我的 ICH10R 控制器上的快速缓存 SSD 支持。同一控制器上的另一个 SSD 支撑系统。
这样做会libata.force=1.5G
立即使我的 SSD 传输速率降低约 100 MB/s。对于根驱动器来说,这不是什么大问题,但对于 ZFS 缓存 SSD 来说,这确实是一个大问题。它实际上使整个 zpool 的持续传输速度比没有缓存驱动器时慢。随机访问和 fs 树查找当然仍然有益。列出 的模块选项sata_sil24
,不存在这样的选项。
如何将libata.force=1.5G
参数传递给模块支持的三个 SATA 控制器sata_sil24
?
答案1
啊!我发现了!
在http://www.kernel.org/doc/Documentation/kernel-parameters.txt, 它指出,
libata.force= [LIBATA] Force configurations. The format is comma
separated list of "[ID:]VAL" where ID is
PORT[.DEVICE]. PORT and DEVICE are decimal numbers
matching port, link or device. Basically, it matches
the ATA ID string printed on console by libata. If
the whole ID part is omitted, the last PORT and DEVICE
values are used. If ID hasn't been specified yet, the
configuration applies to all ports, links and devices.
If only DEVICE is omitted, the parameter applies to
the port and all links and devices behind it. DEVICE
number of 0 either selects the first device or the
first fan-out link behind PMP device. It does not
select the host link. DEVICE number of 15 selects the
host link and device attached to it.
The VAL specifies the configuration to force. As long
as there's no ambiguity shortcut notation is allowed.
For example, both 1.5 and 1.5G would work for 1.5Gbps.
The following configurations can be forced.
* Cable type: 40c, 80c, short40c, unk, ign or sata.
Any ID with matching PORT is used.
* SATA link speed limit: 1.5Gbps or 3.0Gbps.
* Transfer mode: pio[0-7], mwdma[0-4] and udma[0-7].
udma[/][16,25,33,44,66,100,133] notation is also
allowed.
* [no]ncq: Turn on or off NCQ.
* nohrst, nosrst, norst: suppress hard, soft
and both resets.
* dump_id: dump IDENTIFY data.
If there are multiple matching configurations changing
the same attribute, the last one is used.
因此,棘手的部分是找出哪个端口 X 和设备 Y (dmesg ataX.YY) 是哪个控制器和驱动器。我认为 - 该符号与 PORT[.DEVICE] 匹配,但还有 W:X:Y:Z 符号。我猜是 ataX.YY :)
幸运的是,我上周刚刚手动完成了这个映射(试图识别出出现痉挛并重置主机控制器的驱动器),所以我已经有了一个详尽的列表:)我找不到列出从 sdX 到 ataX.Y 或 W:X:Y:Z 的映射的任何地方,所以我最终只是拔出 SATA 电缆并观察 /var/log/messages 中出现了哪些 ataX.YY 消息;)
因此,在我的设置中,我似乎需要做
libata.force=1:1.5G,2:1.5G,3:1.5G
我的 ZFS 清理完成后会立即尝试一下,然后报告结果 :) 太棒了!希望这对其他人有帮助 :)