1
如何(真正)在Linux中禁用NCQ
我在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。 > …