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


13

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

だからここに私の質問があります:

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

3
カーネルパラメーターlibata.force=noncq
frostschutz

おかげで、これはNCQを完全に無効にするのに大いに役立ちました。また、書き込みパフォーマンスの問題も解決しました。
ペベルズ

1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32ダンノ、あなたがそれで何をするつもりだったか。しかしeraseMBRと数百万ブロックを超えます。メインシステムが実行されているドライブでこれを行う(およびgrub、私の場合のようにMBRにインストールする)のはかなり危険です;)あなたの「クールな」行...;)
構文エラー

@syntaxerror HDDはFPGAボードに接続されています。このような環境では、MBRとファイルシステムアクセスを完全に処理するハードウェアルーチンを記述するのは複雑です。そのため、HDDを両側の生メディアとして使用しています。FPGAビューでは、大きな線形メモリです。Linuxでは、/ dev / sdgとCプログラムを使用して継続データを読み書きしています。
ペベルズ

@Paebbelsおっと、FPGAのビットを見落としてはならない。まあ、これは実際にデスクトップPCまたはノートブックのメインボードのバスに接続された一般的なHDDとはまったく異なるものです;-) 「このような環境では、MBRとファイルシステムアクセスを完全に処理するハードウェアルーチンを書くのは複雑です」。本当です。HDLなしでは実行できません。そして、ウィキペディアのコード例では、公園内を完全に歩くことを示唆しているにもかかわらず、そのようなことをプログラミングすることは心の弱い人には
向か

回答:


11

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

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

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

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

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

SMR-シングル磁気記録

書き込みパフォーマンスが低下する別の可能性としては、これらのアーカイブデバイスでSeagateが使用している瓦記録技術があります。明らかに、私はFPGA実装でまれな効果を引き起こしました。


1
私の経験では、NCQを無効にするとパフォーマンスが大幅に向上します。これをデスクトップシステム、サーバーで試しました。NCQの恩恵を受けると思われる100%「サーバー」高性能ハードウェアを使用しても。いいえ、無効にするよりも最悪です。私見NCQは、ハードドライブに起こる最悪のことの一つです。専用のRAIDカードであれ、オンボードチップセットであれ、どんな状況でもメリットをもたらすことは一度もありません。
CR。

バースト操作またはランダムアクセスを実行しましたか?NCQはバースト操作に影響を与えませんが、ランダムアクセスを改善します。
ペベル

申し訳ありませんが、あなたは私の質問に答えていません。もう1つの質問は、どのハードウェアを単純な民生用メインボード、ワークステーション/サーバーメインボード、または専用RAIDコントローラーに使用したかです。多くの実装は、NCQ / AHCIによって設計されたほど多くの未処理の要求をサポートしていません。
ペベル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.