「コネクションプーリング都市伝説」はほんとに都市伝説?(その2)
ずいぶんと間が空いてしまったが,
「コネクションプーリング都市伝説」はほんとに都市伝説?(その1)の続きについて書きたい.
まず本題に移る前にシリアル処理とパラレル処理の違いについて説明したい.
シリアル処理ととパラレル処理
シリアル/パラレル処理というのは複数のタスクがあった場合の処理の方法で
- シリアル処理 → タスクを一つずつ処理する.
- パラレル処理 → タスクを並列に処理する
という違いがある.一般にタスクの処理時間が一定で共通のボトルネックが
存在する場合,パラレル処理はシリアル処理に比べて遅くなる.
図1と図2は全タスクを処理し終わる時間はどちらも3単位で違いがないように見えるが,
平均処理時間を見てみると図1は2単位が平均処理時間になるのに対して,図2の方は
2+2/3単位が平均処理時間となるので不利になっているのがわかると思う.
実際にはこれに加えてタスクの切り替えのコストが加わるのでもっと遅くなる.
これを実体験するには実際にちょっと大きめのファイル(30GBとか)を複数個コピー
してみればわかる.具体的にはOSにもよるが
% cp a b ~/tmpdir/ # シリアル処理
% cp a ~/tmpdir & cp b ~/tmpdir # パラレル処理
ではかかる時間が違うということだ.
(実際にテストする際にはファイルキャッシュの影響があるので何度も数値をとってみるといい).
というわけで似たような複数のタスクがある場合,いっぺんに
処理させるよりも一つ一つ処理させる方が有利であることが
理解してもらえたと思う.
このようなパラレル処理をシリアル処理に変更して速度を稼ぐ
テクニックというのは随所に存在する.
例えばMAN(Metro Area Network)の転送技術であるSONET/SDHはTCP/IPの
ような細かい回線をバルク化して中長距離の転送効率を上げる技術だし,
細かいファイル群をコピーするのにtarでまとめ上げて転送→解凍という
のも似たような発想だ.