/dev/sdaと/mnt/sda/tempfileに書き込むときのパフォーマンスの違い

/dev/sdaと/mnt/sda/tempfileに書き込むときのパフォーマンスの違い

Linuxで新しいPCI-E SSDをテストしています。

パフォーマンスをテストするには、次のコマンドを使用しています(参照:https://www.thomas-krenn.com/en/wiki/Linux_I/O_Performance_Tests_using_dd)

(1) dd if=/dev/zero of=/dev/nvme0n1 bs=1M 個数=2048 -->2.2GB/秒

(2) dd if=/dev/zero of=/dev/nvme0n1 bs=1M count=2048 oflag=direct -->2.2GB/秒

(3) dd if=/dev/zero of=/mnt/nvme0n1/tempfile bs=1M count=2048 -->80MB/秒

(4) dd if=/dev/zero of=/mnt/nvme0n1/tempfile bs=1M count=2048 oflag=direct -->800MB/秒

私の推測は次のとおりです。(3、4)ファイルシステムへの書き込み(何らかの理由でNTFSでフォーマットされています)。ただし、(1、2)はブロックデバイスに直接書き込まれるため、ファイルシステムのオーバーヘッドは発生しません。

私の言葉は正しいですか?説明を少しできますか?

ありがとう

ベストアンサー1

  1. 私はあなたの表現に問題を提起します。コマンド(1)と(2)が次のようになると言いたいです。超過-ファイルシステムに書き込みます(存在する場合)。つまり、無視して削除します(存在する場合)。デバイスに事前にファイルシステムがあるかどうかにかかわらず、同じように動作します。

    同時にコマンド(3)と(4)が記録される。入力するファイルシステムまたは渡すそれ。

  2. はい、もちろん、コマンド(3)と(4)はファイルシステムコードを通過するため、パフォーマンスの違いが発生します。 (4項から続きます。)

  3. ファイルシステムがNTFSであるという事実がなぜ重要なのか理解できません。たとえば、ext ファミリの 1 つなど、どの種類のファイルシステムでも同様の結果が得られるかどうか疑問です。

  4. ポイント2の構築:まず、ファイルシステムI / Oはほとんど無視されます。ファイルシステムコードは、1Mの書き込みを2048の512バイトの書き込みとして扱うか、256の4Kバイトの書き込みを処理できます。第二に、ファイルシステムコードはファイルシステムの整合性を維持する役割を果たします。これは、拡張するたびに使用可能リストからブロックを割り当て、それをファイルに割り当てる必要があることを意味します。これは、利用可能なリストとファイルのinode(またはすべてのファイルシステムタイプに対応するエントリ)を継続的に変更する必要があることを意味します。これは、ユーザーが見ることができる各書き込みには(おそらく)3回の実際の書き込みが必要であるだけでなく、書き込みが連続的ではなく、ドライブがどこでも検索することを意味します。また、ファイルシステムを長期間使用した場合には、フリーリストが順序にずれて、ファイルに割り当てられたブロックが連続しないことがあります。bs=anythingoflag=directtempfile

提案:

  • mkfsファイルシステムがきれいになるようにテスト(3)と(4)を実行してください。その後、既存のファイルを使用してこれらの操作を繰り返します。これにより、帳簿I / Oの量が減ります。
  • bs512-4Kの範囲ですべてのテストを繰り返します。テスト(3)と(4)の結果はほとんど変わりませんが、テスト(1)と(2)の結果ははるかに低くなければなりません。

おすすめ記事