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 / 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が1つのキューのみを使用できるようにします。転送にはQUEUED-DMA-**コマンドを引き続き使用できます。ドライバーがデバイスにDMA-IN / OUTコマンドを発行するように、NCQを本当に無効にする必要があります。
だからここに私の質問があります:
- NCQを無効にするにはどうすればよいですか?
- NCQキュー深度= 1の場合、LinuxのAHCIドライバーはQUEUED-DMA-**またはDMA-**コマンドを使用していますか?
- 変更
/sys/block/sdX/device/queue_depth
が報告されないため、NCQが無効になっているかどうかを確認するにはどうすればよいdmesg
ですか?
> dd if=/dev/zero of=/dev/sdb bs=32M count=32
ダンノ、あなたがそれで何をするつもりだったか。しかしerase
、MBRと数百万ブロックを超えます。メインシステムが実行されているドライブでこれを行う(およびgrub
、私の場合のようにMBRにインストールする)のはかなり危険です;)あなたの「クールな」行...;)
libata.force=noncq
?