Mercurial > hg > Papers > 2013 > sugi-sigos
view presen/index.html @ 14:524e601d34c4
fixed
author | sugi |
---|---|
date | Thu, 25 Apr 2013 03:34:35 +0900 |
parents | 85b22f56ef00 |
children | af044626736a |
line wrap: on
line source
<!-- Google IO 2012/2013 HTML5 Slide Template Authors: Eric Bidelman <ebidel@gmail.com> Luke Mahé <lukem@google.com> URL: https://code.google.com/p/io-2012-slides --> <!DOCTYPE html> <html> <head> <title></title> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="chrome=1"> <!--<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">--> <!--<meta name="viewport" content="width=device-width, initial-scale=1.0">--> <!--This one seems to work all the time, but really small on ipad--> <!--<meta name="viewport" content="initial-scale=0.4">--> <meta name="apple-mobile-web-app-capable" content="yes"> <link rel="stylesheet" media="all" href="theme/css/default.css"> <link rel="stylesheet" media="only screen and (max-device-width: 480px)" href="theme/css/phone.css"> <base target="_blank"> <!-- This amazingness opens all links in a new tab. --> <script data-main="js/slides" src="js/require-1.0.8.min.js"></script> </head> <body style="opacity: 0"> <slides class="layout-widescreen"> <slide class="title-slide segue nobackground"> <!--<aside class="gdbar"><img src="images/google_developers_icon_128.png"></aside> The content of this hgroup is replaced programmatically through the slide_config.json. --> <hgroup> <h1 data-config-title><!-- populated from slide_config.json --></h1> <h2 data-config-subtitle><!-- populated from slide_config.json --></h2> <p data-config-presenter><!-- populated from slide_config.json --></p> </hgroup> </slide> <slide> <hgroup> <h2>研究背景</h2> </hgroup> <article> <ul> <li>分散プログラムには信頼性とスケーラビリティが必要である</li> <li>しかし、両方を兼ね備えたプログラムを作成することは容易ではない</li> <li>そこで、当研究室では信頼性とスケーラビリティの両方をもったプログラムの記述をサポートする、分散フレームワークAliceを開発を行なっている</li> </ul> </article> </slide> <slide> <hgroup> <h2>分散ネットフレームワーク Alice</h2> </hgroup> <article> <ul> <li>本研究室で開発を行なっている分散管理フレームワーク</li> <li>並列フレームワーク Ceriumに似たタスク管理機構と先行研究であるFederated Lindaに似たData Segmentの通信構造</li> <li>データとタスクを細かく分割したDataSegment、CodeSegmentでプログラム記述することで高い並列処理</li> <li>Aliceの並列性能を確認するためbitonic Sortを実装したが、期待した結果を出すことが出来なかった</li> <li><FONT Color="red">本論文ではAliceの実行速度の改善を行い、約10% の速度改善に成功した</FONT></li> </ul> </article> </slide> <slide> <hgroup> <h2>Code Segment</h2> </hgroup> <article> <ul> <li>AliceではCode Segmentと呼ばれる単位でタスクを生成する</li> <li>Code Segmentは依存するData Segmentが全て揃うとActiveになる</li> <li>Input/Output Data SegmentがCode Segment間の依存関係を自動的に記述する</li> </ul> <table width="100%"> <tr> <td width="50%"><Div Align="Center"><image src="images/dsandcs2.png" width="600"></Div></td> </tr> </table> </article> </slide> <slide> <hgroup> <h2>Data Segment</h2> </hgroup> <article> <p>Data Segmentは数値や文字列を構造体的に保持する<br> Aliceではデータベース的に扱うが、通常とは異なりKey毎にQueueを持つ<br> 以下のAPIでデータの送受信を行う</p> <table width="100%"> <tr> <td width="70%"> <FONT size="6"><ul><li>put : DataSegmentの追加</li></ul></font> <FONT size="6"><ul><li>update : DataSegmentの更新</li></ul></font> <FONT size="6"><ul><li>peek : DataSegmentの取得</li></ul></font> <FONT size="6"><ul><li>take : DataSegmentの取得及び削除</li></ul></font> </td> <td width="30%"><Div Align="center"><image src="images/datasegment_key.png"></Div></td> </tr> </table> <FONT Color="red">これらのAPIで分散プログラムが記述できる</FONT> </article> </slide> <slide> <hgroup> <h2>実行速度の問題</h2> </hgroup> <article> <p>Aliceの並列性能は問題がある<br> 作成した例題により以下のoverheadが見つかっている</p> <ul> <li>SEDA Architecture</li> <li>Output Data Segmentの作成時のコピー</li> </ul> </article> </slide> <slide> <hgroup> <h2>SEDA Architecture</h2> </hgroup> <article> <p>マルチコアを活かすためにAliceではSEDA Architectureを採用している。 <br>SEDAとはマルチコアスレッドを用いて大量の接続を管理し、<br> データを処理毎に分けられたステージと呼ばれるスレッドで処理を行う。</p> Aliceでは <ul> <Div Align="Center"><image src="images/seda.png"></Div> </ul> の3つのステージで構成されている。 </article> </slide> <slide> <hgroup> <h2>SEDA Architectureの実装</h2> </hgroup> <article> <ul> <code><pre> while(ture){ Command cmd = linkedBlockingQueue.take() Command result = runCommand(cmd); nextLinkedBlockingQueue.put(result); } </pre></code> <p>今回SEDAは上記のソースコードのように実装されている</p> <p>LinkedBlockingQueueにCommandが次々と投げられる<br> 各ステージでQueueからCommandが取得され、Commandが実行され、<br> その結果が次のステージのQueueに投げられる<br> もし、Queueが空の場合にはブロッキングされenqueueされるまで待つ</p> 上記のコードを複数作成することでSEDAを形成している </ul> </article> </slide> <slide> <hgroup> <h2>LinkedBlockingQueue</h2> </hgroup> <article> <p>SEDA Architectureを実装するにあたり、LinkedBlockingQueueを使用している。</p> 特徴として <ul> <li>LinkedBlockingQueueは片方向の連結リストを使用したQueue</li> <li>enqueue/dequeueの操作時は排他制御は別々のlockで管理</li> <li>enqueueとdequeueの操作を並列に行うことが可能(スループットに優れている)</li> </ul> ただし、enqueue時にNodeオブジェクトの生成操作が発生するため、<br> enqueue操作の処理コストが特に高い。 </article> </slide> <slide> <hgroup> <h2>SEDAの問題点</h2> </hgroup> <article> <p>SEDAは多段のパイプラインによって構成されるためレスポンスが遅れる。<br> スループット重視の実装であるため、レスポンスが要求される<br> Sortのようなプログラムに向いていない。<br> 非力なマシーンでは、スレッドを切り替えが頻繁に起こり、<br> レスポンスを下げる要因になる。</p> </article> <hgroup> <h2>改善案</h2> </hgroup> <article> Sortのようなにレスポンスが必要なプログラムのために、 SEDAのステージ上ではなく、直接Commandを実行するようなAPIを提供する </article> </slide> <slide> <hgroup> <h2>Output Data Segment作成時のコピー</h2> </hgroup> <article> Input Data SegmentはCodeSegmentによって変更され、Output Data Segmentとして出力される。<br> この際、変更されたDataSegmentをコピーし、新しくDataSegmentを作成する。<br> このコピーにかかる時間がoverheadとなっている。 <Div Align="Center"><image src="images/put.png"></Div> putはInput Data SegmentをコピーしてOutput Data Segmentを作成する </article> </slide> <slide> <hgroup> <h2>問題に対する改善案</h2> </hgroup> <article> <p>並列タスク管理フレームワークCeriumでもコピーによるoverheadがあり、Input Data SegmentとOutput Data Segmentをswapすることで解決している。<br>Aliceでも同様の方法で解決する。</p> <Div Align="Center"><image src="images/flip.png"></Div> flipではInput Data SegmentとOutput Data Segmentを入れ替え、必要な部分だけ変更を加えるので無駄なコピーを抑える事ができる </ul> </article> </slide> <slide> <hgroup> <h2>実験概要</h2> </hgroup> <article> <p>今回行った改善による効果を調べるために3つの実験を行った。<br> 実験はSEDAの効果が出るようにメニコアのマシンで行った</p> <ul> <li>SEDAの有無</li> <p>Data Segmentを取得するCode Segmentが10000回実行されるまでの時間を測定</p> <li>flipとputの比較</li> <p>既存のAPIの<em>put</em>と新しく追加したAPIである<em>flip</em>を使用して10000回、Data Segmentを追加されるまでの時間を測定</p> <li>Bitonic Sortによる比較</li> <p>今回行った改善でBitonic Sortがどの程度速度が改善されたか測定する。<br> 要素は100万個、10個に分割して実験した</p> </ul> </article> </slide> <slide> <hgroup> <h2>実験結果</h2> </hgroup> <article> <p>実験結果は100回行った平均</p> <ul> <table> <tr width="100%"> <th width="50%">SEDA</th><th width="25%">あり</th><th width="25%">なし</th> </tr> <tr> <td>実行時間(ms)</td><td>27.72</td><td>7.53</td> </tr> </table> </ul> <ul> <table> <tr width="100%"> <th width="50%">API</th><th width="25%">flip</th><th width="25%">put</th> </tr> <tr> <td>実行時間(ms)</td><td>61.12</td><td>65.24</td> </tr> </table> </ul> <ul> <table> <tr width="100%"> <th width="50%"></th><th width="25%">改善前</th><th width="25%">改善後</th> </tr> <tr> <td>実行時間(ms)</td><td>199.38</td><td>184.64</td> </tr> </table> Bitonic Sortの例題では約10%程度改善された </ul> </article> </slide> <slide> <hgroup> <h2>まとめ</h2> </hgroup> <article> <ul> <li>今回行った改善により、<FONT color="red">最大4倍程度速度を期待することが出来る</FONT></li> <li>Aliceに要求される速度は、少なくともシングルスレッドで書かれたプログラムと同じ程度</li> <li>分散環境下ではFederated Lindaと同じ速度を目標としている</li> <li>今回の実験からSEDAに問題があることが明らかになったのでRemoteにおいてもSEDAの使用を選択できるようにする</li> <li>また、Aliceが抱える問題は速度だけではない</li> <li>信頼性の問題や永続性の問題についても改善をしなければならない</li> </ul> </article> </slide> <slide class="backdrop"></slide> </slides> <script> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-XXXXXXXX-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> <!--[if IE]> <script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script> <script>CFInstall.check({mode: 'overlay'});</script> <![endif]--> </body> </html>