ブロックサイズとパフォーマンス

以下の書籍でブロックサイズと読み書きの性能について説明があった.

Linuxシステムプログラミング( Robert Love 著、千住 治郎 訳 )

以下の表3-1ではブロックサイズを変化させ性能を計測している.この結果から分かるように,ブロックサイズがシステムコールの発行回数に変わっていることがわかる.また,ブロックサイズをファイルシステムのページサイズにあわせて2のべき乗で決定することが適切であることもわかる.

p.66 表3-1

ブロックサイズ(バイト)実時間(秒)ユーザ時間(秒)システム時間(秒)
118.7071.11817.549
1,0240.0250.0020.023
1,1300.0350.0020.027

ブロックサイズに1,024バイトを指定した場合は1バイトを指定した場合に比べ、圧倒的なパフォーマンスを示します。また上記の結果からは、ブロックサイズが大きい方がシステムコール回数が減っても、指定したブロックサイズがディスクのブロックサイズの整数倍になっていなければ、パフォーマンスは最大にならないことも分かります。ブロックサイズに1,130バイトを指定した場合は、システムコール回数が減ってもアライメントされていないI/Oを要求するため、1,024バイトの場合に比べ低いパフォーマンスとなっています。

3.1.1 ブロックサイズ

現実のブロックサイズは通常512、1,024、2,048、4,096バイトのいずれかです。

表3-1に示したように、ブロックサイズの整数倍または商のサイズで処理すると劇的なパフォーマンスの向上を実現できます。これはカーネルとハードウェアがブロックという単位で情報をやり取りするためです。このためブロックサイズそのまま、もしくはブロック内に収まるサイズ(商)を使用すると、ブロックサイズにアライメントされたI/Oが保証され、カーネル内で余計な処理を発生させません。