KDOC 182: ブロックサイズの違いによるパフォーマンスへの影響を調べる
この文書のステータス
- 作成
- 2024-06-06 貴島
- レビュー
- 2024-06-10 貴島
概要
すべてのディスクI/Oは、ブロックごとに処理される。本だけ見てもあまりわからないので、コマンドでミニマルに試して理解を深める。
方法
dd
はファイルをコピーするコマンド。オプションを細かく指定できる/dev/zero
は、0を無限に返す仮想デバイス
↓まず、ブロックサイズ1で保存してみる。8秒かかった。
dd bs=1 count=2097152 if=/dev/zero of=tmp
2097152+0 records in 2097152+0 records out 2097152 bytes (2.1 MB, 2.0 MiB) copied, 8.1858 s, 256 kB/s
↓ブロックサイズ1024にして、コピーしてみる。↑と同じサイズだが、とても早い。
dd bs=1024 count=2048 if=/dev/zero of=tmp
2048+0 records in 2048+0 records out 2097152 bytes (2.1 MB, 2.0 MiB) copied, 0.0131229 s, 160 MB/s
↓アラインメントしないバージョン。これで遅くなるはずなのだが、↑とあまり変わらなかった。サイズの問題だろうか。もっと大きなサイズにすると差が見えてくるとか。
dd bs=1025 count=2048 if=/dev/zero of=tmp
2048+0 records in 2048+0 records out 2099200 bytes (2.1 MB, 2.0 MiB) copied, 0.0131522 s, 160 MB/s
というわけで、パフォーマンスが改善した理由。
- システムコールの回数が減った
strace dd bs=1 count=2097152 if=/dev/zero of=tmp 2>&1 | wc -l strace dd bs=1024 count=2048 if=/dev/zero of=tmp 2>&1 | wc -l
4194377 4169
確かめられた。
関連
- KDOC 109: 発行システムコールを調べる。straceの使い方
- KDOC 181: 『Linuxシステムプログラミング』。例を試した