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
というわけで、ブロックサイズを増やすとパフォーマンスが改善するが、それはシステムコール数が減ったからだと考えられる。
関連
抽象。
- 1回あたりの処理単位が小さすぎると、回数ぶんの固定コストで全体が極端に遅くなる
- 理屈で予想した差が、小さな実験では表れないことがある
関連。
- 補足: KDOC 109: 発行システムコールを調べる。straceの使い方
- 検証: KDOC 181: 『Linuxシステムプログラミング』。例を試した