3

ブロックごとにファイルを書き込むことの利点を知りたいのですが、io操作が減ると思います。しかし、Linuxのような環境では、データはとにかくページキャッシュとバックグラウンドデーモンに送られ、物理ディスクの書き込みを行います(間違っている場合は修正してください)。そのような環境では、ブロック書き込みの利点は何ですか。

4

1 に答える 1

3

私があなたの質問を正しく理解しているなら、あなたは文字ごとに書くのではなく、より大きなブロックを使用することの利点について質問しています。

システムコール(たとえば)を使用するたびに、が行われているかwrite()に関係なく、それ自体で最小のコストがかかることを考慮する必要があります。さらに、呼び出し元のプロセスがコンテキストスイッチの対象となる可能性があります。これには、独自のコストがかかり、他のプロセスがCPUを使用できるようになるため、さらに大幅な遅延が発生します。

したがって、各操作がすぐにディスクに到達する可能性のある直接および同期I / Oモードを忘れたとしても、パフォーマンスの観点から、より大きなデータブロックを移動することによってこれらの一定のコストの影響を減らすことは理にかなっています。

dd1,000,000バイトを転送するために使用する簡単なデモンストレーション:

$ dd if=/dev/zero of=test.txt count=1000000 bs=1 # 1,000,000 blocks of 1 byte
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB) copied, 1.55779 s, 642 kB/s
$ dd if=/dev/zero of=test.txt count=100000 bs=10 # 100,000 blocks of 10 bytes
100000+0 records in
100000+0 records out
1000000 bytes (1.0 MB) copied, 0.172038 s, 5.8 MB/s
$ dd if=/dev/zero of=test.txt count=10000 bs=100 # 10,000 blocks of 100 bytes
10000+0 records in
10000+0 records out
1000000 bytes (1.0 MB) copied, 0.0262843 s, 38.0 MB/s
$ dd if=/dev/zero of=test.txt count=1000 bs=1000 # 1,000 blocks of 1,000 bytes
1000+0 records in
1000+0 records out
1000000 bytes (1.0 MB) copied, 0.0253754 s, 39.4 MB/s
$ dd if=/dev/zero of=test.txt count=100 bs=10000 # 100 blocks of 10,000 bytes
100+0 records in
100+0 records out
1000000 bytes (1.0 MB) copied, 0.00919108 s, 109 MB/s

追加の利点として、より大きなデータブロックを使用すると、I / Oスケジューラとファイルシステムのアロケータの両方で、実際のワークロードについてより正確な見積もりを行うことができます。

于 2012-07-12T05:12:39.220 に答える