1
LinuxでNCQを(本当に)無効にする方法
VHDLで独自のSerial-ATA Host-Bus-Adapter(HBA)を実装し、FPGAにプログラムしました。FPGAは、任意のデジタル回路でプログラム可能なチップです。また、SATAまたはPCIe用の高速信号を生成するシリアルトランシーバーも装備しています。 このSATAコントローラーは、SATA 6 Gb / sラインレートをサポートし、ATA-8 DMA-IN / OUTコマンドを使用して、デバイスとの間で最大32 MiBのチャンクでデータを転送します。この設計は、最高速度で動作することが実証されています(例:Samsung SSD 840 Pro-> 550 MiB / s以上)。 複数のSSDおよびHDDデバイスを使用したいくつかのテストの後、新しいSeagate 6 TB Archive HDD(ST6000AS0002)を購入しました。このHDDは最大190 MiB / sの読み取りパフォーマンスに達しますが、書き込みパフォーマンスは30〜40 MiB / sに過ぎません。 そこで、より深く掘り下げて、送信されたフレームを測定しました(FPGAデザインで可能です)。私の知る限り、Seagate HDDは転送の最初の32 MiBを1枚で受け取る準備ができています。この転送は、580 MiB / sの最大回線速度で発生します。その後、HDDは残りのバイトを800ミリ秒以上ストールします!その後、HDDは次の32 MiBを受信する準備ができ、800ミリ秒間再び停止します。全体で1 GiBの転送には30秒以上必要です。これは約35 MiB / sに相当します。 このHDDには32 MiBの書き込みキャッシュがあり、バーストサイクルの間にフラッシュされると想定しています。32 MiB未満のデータ転送では、この動作は示されません。 私のコントローラーは、DMA-INおよびDMA-OUTコマンドを使用してデータを転送します。NCQ対応AHCIコントローラーで使用されるQUEUED-DMA-INおよびQUEUED-DMA-OUTコマンドを使用していません。FPGAプラットフォームでのAHCIとNCQの実装は非常に複雑であり、アプリケーション層では必要ありません。 Linux PCでこのシナリオを再現したいのですが、Linux AHCIドライバーではデフォルトでNCQが有効になっています。NCQを無効にする必要があるため、このWebサイトでNCQを無効にする方法を説明していますが、機能しません。 Linux PCはまだ190 MiB …