我在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命令。
所以这是我的问题:
- 如何禁用NCQ?
- 如果NCQ队列深度= 1,Linux的AHCI驱动程序是否使用QUEUED-DMA-**或DMA-**命令?
- 我如何检查NCQ是否被禁用,因为
/sys/block/sdX/device/queue_depth
未在中报告更改dmesg
?
> dd if=/dev/zero of=/dev/sdb bs=32M count=32
邓诺,你打算怎么做?但是它将不仅erase
包括MBR和数以百万计的区块。在运行了主系统(并grub
在我的情况下安装在MBR 上)上的驱动器上执行此操作是相当危险的;)我想在这里写此作为评论,以防止一些经验不足的人尝试使用您的“酷”行...;))
libata.force=noncq
?