私はVHDLにシリアルATAホストバスアダプタ(HBA)を実装し、それをFPGAにプログラムしました。 FPGAは、あらゆるデジタル回路でプログラム可能なチップです。また、SATAまたはPCIe用の高速信号を生成するシリアルトランシーバも装備されています。
SATAコントローラはSATA 6Gb / s回線速度をサポートし、ATA-8 DMA-IN / OUTコマンドを使用してデバイスと最大32MiBのブロックにデータを転送します。このデザインは、最高速度(Samsung SSD 840 Pro -> 550MiB / s以上)で実行できることがわかりました。
複数のSSDおよびHDDデバイスでいくつかのテストを終えた後、新しいSeagate 6TB Archive HDD(ST6000AS0002)。ハードドライブの読み取り性能は最大190MiB / sです。しかし、書き込み性能は30~40MiB/sに過ぎません!
それで、より深く掘り下げて送信されたフレームを測定しました(例えば、FPGA設計で可能です)。私が知っている限り、Seagate HDDはフル転送の最初の32MiBを受信する準備ができています。この送信は最大回線速度580MiB / sで発生します。その後、HDDが残りのバイト数を超えるのを停止します。800ミリ秒!その後、HDDは次の32MiBを受信する準備が整い、800ミリ秒間再び停止します。全体として、1GiB伝送には30秒以上かかり、これは約35MiB / sに相当します。
HDDには、バーストサイクル間にフラッシュされる32MiBの書き込みキャッシュがあるとします。 32MiB未満のデータ転送では、この動作は表示されません。
私のコントローラは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はまだ190MiB / 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は無効になりません。オペレーティングシステムが1つのキューのみを使用できるようにします。 QUEUED-DMA-** コマンドを使用して転送を続けることができます。ドライバがデバイスでDMA-IN / OUTコマンドを実行できるように、実際にNCQを無効にする必要があります。
私の質問は次のとおりです
- NCQを無効にする方法は?
- NCQキューの深さ= 1の場合、Linux用のAHCIドライバはQUEUED-DMA-**またはDMA-**コマンドを使用しますか?
/sys/block/sdX/device/queue_depth
で変更が報告されていないため、NCQが無効になっているかどうかを確認できますかdmesg
?
答え1
@frostschutzのおかげで、NCQ機能なしでLinuxで書き込みパフォーマンスを測定できます。カーネルブートパラメータはlibata.force=noncq
NCQを完全に無効にします。
Seagate 6TBの書き込み性能の問題に関して、速度に変化はありません。 Linuxはまだ180MiB / sに達しています。
しかし、もう一つの考えが思い浮かびました。
Linuxドライバは、32MiBブロック転送を使用しないことです。カーネルバッファは、特に32個のキューを持つNCQが有効になっている場合ははるかに小さい(32個のキュー* 32MiB => 1GiB AHCIバッファ)。
そこで256KiBの転送速度でSATAコントローラをテストしたのですが、チャジャン、185MiB/sが可能でした。
そのため、Seagate ST6000AS0002ファームウェアは大規模なATAバースト転送を処理できないようです。 ATA標準は、32MiBに対応する最大65.536の論理ブロックを受け入れます。
SMR - シュングルド磁気録音
書き込みパフォーマンスが低下する可能性があるもう1つの可能性は次のとおりです。シュングルド自己記録技術、Seagateはこれらのアーカイブに使用します。明らかに、私のFPGAの実装はまれな効果を引き起こしました。
答え2
キューの深さを1(/sys/block/sd*/device/queue_depth
)に設定すると、カーネルパラメータlibata.force=noncq
(起動時にのみ設定可能)を使用せずにNCQが無効になります。
犯罪360f654e7cda850034f3f6252a7a7cff3fa77356
Date: Sat Sep 30 19:45:00 2006 +0900
[PATCH] libata: turn off NCQ if queue depth is adjusted to 1
Turn off NCQ if queue depth is adjusted to 1.