web-dev-qa-db-ja.com

FIOのiodepthは正確には何ですか?

FIOのiodepthとストレージのキューの深さはどちらも同じですか?次に、fioコマンドのiodepthパラメータを使用してキューの深さを制御するにはどうすればよいですか?それは並列ジョブを作成しますが、それでもジョブを並列で実行するオプションがあります(それは些細なことでも競合することでもありませんか?)

私はfioがどのようにしてワークロードを制御しているかを理解するのに苦労しています(特にこのiodepthについて)。誰かがiodepthパラメータを詳細に説明できますか?.

アップデート#1

私の質問も フレキシブルI/Oテスターのフォーラムで質問 でした。これが私が受け取った答えです。

こんにちは、

2018年7月28日14:26に、Jeevan Patnaikは次のように書いています。

FioのIodepthとストレージのキューの深さはどちらも同じですか?次に、fioのiodepthパラメータを使用してキューの深さを制御する方法はありますか

fio iodepthとOSがI/Oをストレージに送信することで達成する深度I/Oはリンクされていますが、ほとんどの場合同じである必要はなく、関係はオペレーティングシステム/ストレージ/ fio ioengineの使用/ fioパラメータに大きく依存します。基本的に、fioはI/Oを特定の方法でオペレーティングシステムに送信します。 I/Oをオペレーティングシステムに送信する方法に応じて、より最適で異なる方法でそれをさらに送信することを選択できます(たとえば、要求をバッチ処理する、大きすぎる要求を細かく分割する、I/Oを遅延させるなど) )。さらに、 [〜#〜] howto [〜#〜] に記載されているように、iodepthは非同期ioenginesにのみ影響します(テキストにはLinuxでdirect = 1を使用する必要があることに関する警告が含まれていることに注意してください)。

コマンド?それは並列ジョブを作成しますが、それでもジョブを並列で実行するオプションがあります(それは些細なことでも競合することでもありませんか?)

簡単な概要を説明しますが、キャッシング/先読み/プラグイン/ブロックデバイスレイヤー(RAID/LVMなど)などについては説明しないことに注意してください。

同期fio I/Oエンジンは、単一のI/OをOSに送信し、受信されたことが「確認」されるのを待ってから、別のI/Oなどを送信します。

Fio I/OエンジンがI/Oを本当に非同期にOSに送信できる場合(上記のリンクを参照)、送信前に以前のI/Oが「確認」されるのを待つ必要がないことが重要です。新しいI/O。 iodepthが1のみの場合、同期I/Oエンジンと同様の方法で動作する必要があります。ただし、ジョブでiodepthが32に指定されているとしましょう。その場合、fioがI/Oを送信する前に待機することを選択する前に、最大32のI/Oが未処理のままになります(透かしとは何か、送信される量は時間はiodepth_batch_ *オプションによって制御されます。これはより効率的で、より高いスループットを実現できますが、多くの場合、レイテンシが高くなります。

fioは並列fioジョブを作成しません。並列FIOジョブを使用するiodepth BUTは、同時に送信される同時I/Oの量を増やすもう1つの方法です。特定の時間(異なるスレッド/プロセスを使用)と同じデバイスで両方を使用すると、タンデムで動作します(16のiodepthで非同期I/Oを送信する2つのfioジョブがある場合、OSは実際に32 I /いつでもOs)。 2つを組み合わせる理由がある場合があります(たとえば、複数のデバイスがあり、それらが非常に高速であるため、I/Oを非同期で送信した場合でも、1つのCPUが追い付かないことがあります)。

私はfioがどのようにしてワークロードを制御しているかを理解するのに苦労しています(特にこのiodepthについて)。誰かがiodepthパラメータを詳細に説明できますか?.

Stackexchange( fioのiodepthとは正確には何ですか? )でもこの質問をしたことを覚えておきます。そこから https://www.spinics.net/lists/fio/msg07190.html にリンクして、同様の質問をする可能性のある他のユーザーを支援することもできます...

4
GP92

それは簡単なことではないでしょうか?

Iodepth =が機能するために必要な直接IOを想定します。

Iodepth = 2の順次ジョブは、2つの順次IOリクエストを一度に送信します。

Numjobs = 2の順次ジョブには2つのスレッドがあり、それぞれが順次IOを送信します。

これらは異なりますIOパターン。後者は、IOバス全体で2倍の帯域幅を生成します。物理的なIOデバイスキャッシュが原因で1xに戻ります(複数のファイルとランダム化されたfile_service_type=)。 IOが同期書き込みである場合(sync = true)、デバイスが異常な量の最適化(おそらくSSDコントローラの重複排除)を実行していない限り、物理IOはまったく削減されません) 。

2
sourcejedi

Linux kernel docs によると:

..オプション:: iodepth = int

ファイルに対して処理を続けるI/Oユニットの数。 iodepthを1より大きくしても、同期ioenginesには影響しないことに注意してください(:option:verify_asyncは使用中です)。非同期エンジンでさえ、OSの制限を課して、目的の深さを実現できない場合があります。 Linuxでは、libaioを使用していて、:option:direct\= 1を設定していない場合に発生する可能性があります。これは、そのOSではバッファI/Oが非同期ではないためです。 fio出力のI/O深さ分布に注意して、達成された深さが期待どおりであることを確認します。デフォルト:1。

このチュートリアルのタイトル: Fio出力の説明 には次の例があります。

Fioには、特定の時点でOSに対して発行するIOの数を制御するiodepth設定があります。これは完全にアプリケーション側です。つまり、デバイスのIOキューと同じではありません。この場合、iodepthは1に設定されているため、IO深さは常に時間の1 100%でした。

    submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
    complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%

submitおよびcompleteは、fioによって一度に送信されたIOの数と、一度に完了した数を表します。この出力を生成するために使用されたスラッシングテストの場合、iodepthはデフォルト値の1であるため、IOの100%が一度に1つ送信され、結果が1〜4バケットに入れられます。基本的に、これらはiodepthが1より大きい場合にのみ重要です。

0
slm