2014年8月12日火曜日

並列処理の話(その1) ~変換処理の並行動作について(後編)~

大須賀です。
前回は、マルチコアCPUマシンで、複数処理を順次処理するよりも同時実行した方が遅くなる、という現象についてお話ししました。



今回は解決編です。

実は、この原因はディスクI/Oにあります。

プログラムがOS上で並列動作するとき、お互いが完全に分離して競合をせずに動作するのは非常に難しいです。

ハードディスクを複数のジョブがアクセスする場合には、同じディスクに複数のジョブのREADとWRITEのI/Oが集中し、ランダムアクセス状態になることで発生する遅延を意識しなければなりません。

それでは、ランダムアクセスに強いSSD上で同じテストを行った場合にはどうなるでしょうか。



10本の並列処理でも、非常に高速に終了することができました。
実際には、この現象は小さなファイルでは発生しません。OSやディスクが、キャッシュや先読みで、できるだけランダムアクセスを避ける効率化を行うからです。しかし、業務ではキャッシュに使用するメモリ容量よりもデータ量の方が多いのは当たり前なので、実際にはよく起こっている現象です。

また、SSDや、高価なRAID等を使用しなくても、入出力を複数の物理ディスクに配置する等の方法でリソース競合を避ければ、並列実行の効率を上げることが可能です。

かなり前のことですが、会社で扱っているデータベースに、WindowsNT4.0マシンでデータロードしていました。お客様からお借りしたデータでしたが、当時としてはけっこう大量で、ロードに30分ぐらいかかっており、テストするたびにリロードするのが苦痛でした。

しかし、何回目かのロードのとき、ディスクのアクセス音がガリガリとずいぶん五月蠅いことに気がつきました。ディスクが音を出していると言うことは、アームがものすごく動いていると言うことです。ものは試しと、入力データを別のドライブに移してみると、あら不思議。たったの2分でロードが完了してしまいました。

音が出ると言うことはそれだけエネルギーを使用すると言うことです。それ以来、システム運用中は処理に無駄がないかどうか、ディスクのアクセス音に耳を澄ます癖が付いてしまいました。まぁ、最近はマシンの前で作業することも少ないのであまり機会はありませんが。

このように、複数の処理を並列に動作させるときには、リソース競合というものを意識しなければなりません。今回はディスクアクセスの話でしたが、メモリやネットワーク等も同様に配慮する必要があるでしょう。

皆様のシステムも、高速で高価なディスクを導入する前に、ディスク配置を検討し直せば、まだまだ高速化の余地があるかもしれませんよ。

0 件のコメント:

コメントを投稿