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

確かめられた。

関連