web-dev-qa-db-ja.com

LinuxでNCQを(本当に)無効にする方法

自分のシリアルATAホストバスアダプター(HBA)をVHDLで実装し、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 /秒の読み取りパフォーマンスに達します、ただし、30から40 MiB /秒の書き込みパフォーマンスのみ!

そこで、私はより深く掘り下げて、送信されたフレームを測定しました(そうです、FPGAデザインで可能です)。私の知る限り、Seagate HDDは転送の最初の32 MiBを1つで受け取る準備ができています。この転送は、580 MiB /秒の最大ライン速度で行われます。その後、HDDは残りのバイトを800ミリ秒以上ストールします!その後、HDDは次の32 MiBを受信する準備が整い、再び800ミリ秒ストールします。全体として、1 GiB転送には30秒以上必要であり、約35 MiB /秒に相当します。

この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 /秒の書き込みパフォーマンスに達しています。

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

これが私の質問です:

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

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

Seagate 6TB書き込みパフォーマンスの問題に関しては、速度に変化はありませんでした。 Linuxはまだ180 MiB/sに達しています。

しかし、それから私は別の考えを持っていました:
Linuxドライバーは、32 MiBチャンクの転送を使用しません。特に32キューのNCQが有効な場合(32キュー* 32 MiB => 1 GiB AHCIバッファー)の場合、カーネルバッファーははるかに小さくなります。

そこで、SATAコントローラーを256 KiBの転送でテストしましたが、185 MiB /秒に達する可能性があります。

したがって、Seagate ST6000AS0002ファームウェアは大きなATAバースト転送を処理することができないと思います。 ATA規格では、最大65.536の論理ブロックが許可されており、32 MiBに相当します。

SMR-シングル磁気記録

書き込みパフォーマンスが低下する別の可能性として、 シングル磁気記録技術 が考えられます。これは、これらのアーカイブデバイスでSeagateによって使用されます。明らかに、FPGA実装でまれな効果を引き起こしました。

12
Paebbels