2014年8月5日火曜日

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

大須賀です。
今回は、データ連携・加工における並列処理のお話をさせていただきます。

データ連携・加工では、連係して動作するシステム同士のスケジュールに沿って、限られた時間内に変換処理を終了しなければなりません。

たとえば、データウェアハウスの場合、基幹システムで1日に処理されたデータを、基幹システムの日次処理終了後から翌日のデータウェアハウス業務開始までに参照可能にする必要があります。この時間枠のことをバッチウィンドウと言います。

限られたバッチウィンドウ内でデータ加工処理を終わらせるには、マルチコアCPUの利点を生かしたスケジューリングが必要になります。

通常、アプリケーションサーバ等でのマルチコアCPUの利点は、多数のリクエストに対して複数のCPUコアが別々に動作できると言うことですが、データ加工の場合、ひとつの大きな処理を行うだけですので、普通に処理しただけではCPUコアが複数あってもひとつ分だけしか使用されません。

データ加工におけるマルチコアCPUの有効な利用法と言うことでは、一番簡単な方法は「複数のデータ加工ジョブを同時に走らせる」事です。


まず、ファイルを読んで、加工し、別のファイルに保存するジョブを想定しましょう。
※ジョブ: ETLツール「Waha! Transformer」の処理単位




入出力ファイルは4,000万件-約4GBで、このジョブを単体で実行すると、約136秒かかります。

テストに使用するマシンはCPUがCore i7で、4つの物理コアがハイパースレッドを積んでいますので、論理CPUは8つ。タスクマネージャでは8つのCPUグラフを見ることが出来ます。
ハイパースレッドは物理コアの0.5ぐらいと言われますので、CPUパワーとしては6コア分になるわけですが、このジョブは6倍の速度では・・・動作しませんね。プログラムは意識してマルチコアを使用しない限り、使われるコアはひとつだけです。まぁ、1コアと比較すれば、裏で動作するOSや別のプロセスが並列動作しますので、少しは速くなるのですが。

さて、これと同じジョブが全部で10本あった場合、順番に実行すると136×10で1,360秒かかることになります。

では、この10本をヨーイドンで同時に動かしたら、順番に10本動かすより速く終わるはずですよね。CPU1個しか使用していない場合に比べて6倍のパワーがあるはずだからです。
実際にやってみましょう。




ところが、実際には順番に10本流した方が速いという結果になってしまいました。どうしてこんなことが起きるのでしょうか。

この問題を明確にするために、2本の場合、3本の場合と、順番にジョブを増やして行ってみましょう。




ジョブ2~4本を同時に動かした場合は、ジョブを直列で動かした場合より確かに速く終了しています。しかし、グラフで見ると、5本目から、直列よりも遅くなってきます。
しかもこのとき、CPUは100%振り切っているわけではありません。



原因の解説は次回に続きます。

0 件のコメント:

コメントを投稿