如何(真正)在Linux中禁用NCQ


13

我在VHDL中实现了自己的串行ATA主机总线适配器(HBA),并将其编程到FPGA上。FPGA是可以用任何数字电路编程的芯片。它还配备了串行收发器,可为SATA或PCIe生成高速信号。

该SATA控制器支持SATA 6 Gb / s线速,并使用ATA-8 DMA-IN / OUT命令在设备之间最多传输32 MiB数据块。经验证,该设计可在最高速度下工作(例如,三星SSD 840 Pro-> 550 MiB / s以上)。

在对多个SSD和HDD设备进行了一些测试之后,我购买了一个新的Seagate 6 TB存档HDD(ST6000AS0002)。该HDD的读取性能高达190 MiB / s,但写入性能却只有30到40 MiB / s!

因此,我更深入地研究并测量了传输的帧(是的,在FPGA设计中是可能的)。据我所知,Seagate HDD已准备好一次接收传输的前32 MiB。传输速度最高为580 MiB / s。之后,HDD将剩余字节停顿800毫秒以上!然后,HDD准备接收下一个32 MiB,并再次停顿800 ms。1 GiB传输总共需要30秒钟以上,大约等于35 MiB / s。

我假设此HDD具有32 MiB写高速缓存,该高速缓存在突发周期之间刷新。小于32 MiB的数据传输不会显示此行为。

我的控制器使用DMA-IN和DMA-OUT命令来传输数据。我没有使用QUEUED-DMA-IN和QUEUED-DMA-OUT命令,它们由具有NCQ功能的AHCI控制器使用。在FPGA平台上添加AHCI和NCQ非常复杂,我的应用层不需要。

我想在我的Linux PC上重现这种情况,但是Linux AHCI驱动程序默认情况下启用了NCQ。我需要禁用NCQ,因此我找到了描述如何禁用NCQ的网站,但是它不起作用。

Linux PC的写入性能仍然达到190 MiB / s。

> dd if=/dev/zero of=/dev/sdb bs=32M count=32
1073741824 bytes (1.1 GB) copied, 5.46148 s, 197 MB/s

我认为上面的文章中有一个错误:将NCQ队列深度减少到1不会禁用NCQ。它仅允许OS使用一个队列。它仍然可以使用QUEUED-DMA-**命令进行传输。我需要真正禁用NCQ,以便驱动程序向设备发出DMA-IN / OUT命令。

所以这是我的问题:

  1. 如何禁用NCQ?
  2. 如果NCQ队列深度= 1,Linux的AHCI驱动程序是否使用QUEUED-DMA-**或DMA-**命令?
  3. 我如何检查NCQ是否被禁用,因为/sys/block/sdX/device/queue_depth未在中报告更改dmesg

3
内核参数libata.force=noncq
弗罗斯特斯2015年

谢谢,这对完全禁用NCQ很有帮助。我还解决了写入性能问题。
Paebbels 2015年

1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32邓诺,你打算怎么做?但是它将不仅erase包括MBR和数以百万计的区块。在运行了主系统(并grub在我的情况下安装在MBR 上)上的驱动器上执行此操作是相当危险的;)我想在这里写此作为评论,以防止一些经验不足的人尝试使用您的“酷”行...;))
语法错误2015年

@syntaxerror HDD连接到FPGA板。在这样的环境下,编写完美处理MBR和文件系统访问权限的硬件例程非常困难。因此,我都将HDD用作双方的原始媒体。在FPGA视图中,它是一个很大的线性存储器。在Linux中,我使用/ dev / sdg和一个C程序来读取和写入继续数据。
Paebbels

@Paebbels糟糕,我不应该忽略FPGA位。好吧,这确实与我们连接到台式机或笔记本电脑主板总线上的普通HDD完全不同;-) “在这种环境下,编写完美处理MBR和文件系统访问权限的硬件例程非常困难”。真正。没有HDL您将无法做。而且我可以想象对这样的东西进行编程并不是为了使自己胆怯……尽管Wikipedia代码示例表明这是一次彻底的
冒险

Answers:


11

感谢@frostschutz,我可以在没有NCQ功能的情况下测量Linux的写入性能。内核引导参数libata.force=noncq完全禁用了NCQ。

关于我的Seagate 6TB写入性能问题,速度没有变化。Linux仍可达到180 MiB / s。

但是后来我有了另一个主意:
Linux驱动程序不使用32 MiB块的传输。内核缓冲区要小得多,尤其是如果启用了具有32个队列的NCQ(32个队列* 32 MiB => 1 GiB AHCI缓冲区)。

因此,我用256 KiB传输和速度测试了我的SATA控制器,可以达到185 MiB / s。

因此,我想Seagate ST6000AS0002固件无法处理大型ATA突发传输。ATA标准最多允许65.536个逻辑块,等于32 MiB。

SMR-磁条录音

导致写入性能下降的另一种可能性可能是希捷在这些存档设备中使用的带磁条的磁记录技术。显然,我的FPGA实现触发了一种罕见的效果。


1
以我的经验,禁用NCQ可以大大提高性能。我已经在台式机系统,服务器上尝试过此方法,您可以对其命名。即使使用您认为会从NCQ中受益的100%“服务器”高性能硬件。不,这不仅仅是禁用它,更糟糕。恕我直言,NCQ是硬盘发生的最糟糕的事情之一。我从未见过它在任何情况下都能带来好处,无论是专用RAID卡还是板载芯片组。
CR。

您是否执行过突发操作或随机访问?NCQ对突发操作没有影响,但可以改善随机访问。
Paebbels '18年

抱歉,您尚未回答我的问题。另一个问题是,您使用了哪种简单的用户主板,工作站/服务器主板或专用RAID控制器硬件。许多实现不支持NCQ / AHCI设计的那么多未完成的请求。
Paebbels '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.