研究背景

  • 分散プログラムには信頼性とスケーラビリティが必要である
  • しかし、両方を兼ね備えたプログラムを作成することは容易ではない
  • そこで、当研究室では信頼性とスケーラビリティの両方をもったプログラムの記述をサポートする、分散フレームワークAliceを開発を行なっている

分散ネットフレームワーク Alice

  • 本研究室で開発を行なっている分散管理フレームワーク
  • 並列フレームワーク Ceriumに似たタスク管理機構と先行研究であるFederated Lindaに似たData Segmentの通信構造
  • データとタスクを細かく分割したDataSegment、CodeSegmentでプログラム記述することで高い並列処理
  • Aliceの並列性能を確認するためbitonic Sortを実装したが、期待した結果を出すことが出来なかった
  • 本論文ではAliceの実行速度の改善を行い、約10% の速度改善に成功した

Code Segment

  • AliceではCode Segmentと呼ばれる単位でタスクを生成する
  • Code Segmentは依存するData Segmentが全て揃うとActiveになる
  • Input/Output Data SegmentがCode Segment間の依存関係を自動的に記述する

Data Segment

Data Segmentは数値や文字列を構造体的に保持する
Aliceではデータベース的に扱うが、通常とは異なりKey毎にQueueを持つ
以下のAPIでデータの送受信を行う

  • put : DataSegmentの追加
  • update : DataSegmentの更新
  • peek : DataSegmentの取得
  • take : DataSegmentの取得及び削除
これらのAPIで分散プログラムが記述できる

実行速度の問題

Aliceの並列性能は問題がある
作成した例題により以下のoverheadが見つかっている

  • SEDA Architecture
  • Output Data Segmentの作成時のコピー

SEDA Architecture

マルチコアを活かすためにAliceではSEDA Architectureを採用している。
SEDAとはマルチコアスレッドを用いて大量の接続を管理し、
データを処理毎に分けられたステージと呼ばれるスレッドで処理を行う。

Aliceでは
の3つのステージで構成されている。

SEDA Architectureの実装

    while(ture){
     Command cmd = linkedBlockingQueue.take()
      Command result = runCommand(cmd);
      nextLinkedBlockingQueue.put(result);
    }
          

    今回SEDAは上記のソースコードのように実装されている

    LinkedBlockingQueueにCommandが次々と投げられる
    各ステージでQueueからCommandが取得され、Commandが実行され、
    その結果が次のステージのQueueに投げられる
    もし、Queueが空の場合にはブロッキングされenqueueされるまで待つ

    上記のコードを複数作成することでSEDAを形成している

LinkedBlockingQueue

SEDA Architectureを実装するにあたり、LinkedBlockingQueueを使用している。

特徴として
  • LinkedBlockingQueueは片方向の連結リストを使用したQueue
  • enqueue/dequeueの操作時は排他制御は別々のlockで管理
  • enqueueとdequeueの操作を並列に行うことが可能(スループットに優れている)
ただし、enqueue時にNodeオブジェクトの生成操作が発生するため、
enqueue操作の処理コストが特に高い。

SEDAの問題点

SEDAは多段のパイプラインによって構成されるためレスポンスが遅れる。
スループット重視の実装であるため、レスポンスが要求される
Sortのようなプログラムに向いていない。
非力なマシーンでは、スレッドを切り替えが頻繁に起こり、
レスポンスを下げる要因になる。

改善案

Sortのようなにレスポンスが必要なプログラムのために、 SEDAのステージ上ではなく、直接Commandを実行するようなAPIを提供する

Output Data Segment作成時のコピー

Input Data SegmentはCodeSegmentによって変更され、Output Data Segmentとして出力される。
この際、変更されたDataSegmentをコピーし、新しくDataSegmentを作成する。
このコピーにかかる時間がoverheadとなっている。
putはInput Data SegmentをコピーしてOutput Data Segmentを作成する

問題に対する改善案

並列タスク管理フレームワークCeriumでもコピーによるoverheadがあり、Input Data SegmentとOutput Data Segmentをswapすることで解決している。
Aliceでも同様の方法で解決する。

flipではInput Data SegmentとOutput Data Segmentを入れ替え、必要な部分だけ変更を加えるので無駄なコピーを抑える事ができる

実験概要

今回行った改善による効果を調べるために3つの実験を行った。
実験はSEDAの効果が出るようにメニコアのマシンで行った

  • SEDAの有無
  • Data Segmentを取得するCode Segmentが10000回実行されるまでの時間を測定

  • flipとputの比較
  • 既存のAPIのputと新しく追加したAPIであるflipを使用して10000回、Data Segmentを追加されるまでの時間を測定

  • Bitonic Sortによる比較
  • 今回行った改善でBitonic Sortがどの程度速度が改善されたか測定する。
    要素は100万個、10個に分割して実験した

実験結果

実験結果は100回行った平均

    SEDAありなし
    実行時間(ms)27.727.53
    APIflipput
    実行時間(ms)61.1265.24
    改善前改善後
    実行時間(ms)199.38184.64
    Bitonic Sortの例題では約10%程度改善された

まとめ

  • 今回行った改善により、最大4倍程度速度を期待することが出来る
  • Aliceに要求される速度は、少なくともシングルスレッドで書かれたプログラムと同じ程度
  • 分散環境下ではFederated Lindaと同じ速度を目標としている
  • 今回の実験からSEDAに問題があることが明らかになったのでRemoteにおいてもSEDAの使用を選択できるようにする
  • また、Aliceが抱える問題は速度だけではない
  • 信頼性の問題や永続性の問題についても改善をしなければならない