LinuxでNCQを(実際に)無効にする方法

LinuxでNCQを(実際に)無効にする方法

私は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を無効にする必要があります。

私の質問は次のとおりです

  1. NCQを無効にする方法は?
  2. NCQキューの深さ= 1の場合、Linux用のAHCIドライバはQUEUED-DMA-**またはDMA-**コマンドを使用しますか?
  3. /sys/block/sdX/device/queue_depthで変更が報告されていないため、NCQが無効になっているかどうかを確認できますかdmesg

ベストアンサー1

@frostschutzのおかげで、NCQ機能なしでLinuxで書き込みパフォーマンスを測定できます。カーネルブートパラメータはlibata.force=noncqNCQを完全に無効にします。

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の実装はまれな効果を引き起こしました。

おすすめ記事