Mercurial > hg > Papers > 2013 > toma-jssst
view Slides/jssst.html @ 21:896dc855b808
add images
author | Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Sep 2013 14:00:30 +0900 |
parents | fabd690fbaf0 |
children | cbb44aa8867b |
line wrap: on
line source
<!DOCTYPE html> <!-- Google HTML5 slide template Authors: Luke Mahé (code) Marcin Wichary (code and design) Dominic Mazzoni (browser compatibility) Charles Chen (ChromeVox support) URL: http://code.google.com/p/html5slides/ --> <html> <head> <title> Haskellによる非破壊的木構造を用いたCMSの実装 </title> <meta charset='utf-8'> <script src='http://web.amothic.com/html5slides/slides.js'></script> </head> <style> /* Your individual styles here, or just use inline styles if that’s what you want. */ </style> <body style='display: none'> <section class='slides layout-regular template-concurrency'> <!-- Your slides (<article>s) go here. Delete or comment out the slides below. --> <article> <h1> Haskellによる非破壊的木構造を用いたCMSの実装 </h1> <p> Daichi TOMA <br> Sep 13, 2013 </p> </article> <article> <h3> はじめに </h3> <p> 本研究室では非破壊的木構造データベース Jungle の開発を行っている。 非破壊的木構造は、通常の木構造と違い、木構造自体を破壊せずに編集を行うことが可能である。 </p> <p> Jungle には、既に Java による実装があるが、本研究ではHaskellによる再実装を行った。 その結果、Java 版と同程度の性能を得ることができた。また、Java 版の実装と比較し、開発期間及びコード行数の短縮ができた。 </p> </article> <article> <h3> Haskell </h3> <p> Haskell は、純粋関数型プログラミング言語である。 変数への代入は一度のみで、書き換えることはできない。 </p> <p> 非破壊的木構造は変数への代入が発生しないことから、関数型言語と相性が良いと考えられる。 そのため、Haskell を用いて再実装を行った。 </p> </article> <article> <h3> 非破壊的木構造データベース Jungle </h3> <p> 非破壊的木構造を取り扱うデータベースである。 既に Java による実装が存在する。 </p> <p> 特徴を以下に示す。 <ul> <li>複数の非破壊的木構造を扱える <li>編集者は、提供されるAPIを利用して編集を行う </ul> </p> </article> <article> <h3> 破壊的木構造 </h3> <ul> <li>木構造で保持するデータを直接書き換える <li>編集および参照する際にロックを行う必要がある </ul> <p> ロックを行わなければ、参照中に他の編集者が編集してしまうと、整合性がなくなってしまう。 </p> <p> <div style="text-align:center"> <img src="images/destructive_tree_modification.png"> </div> </p> </article> <article> <h3> 非破壊的木構造 </h3> <ul> <li>元の木構造を書き換えることなく、編集を行う <li>ルートノードの更新以外にロックは必要ない </ul> <p> 参照中に他の編集者が編集してしまっても、整合性がなくなることはない。 </p> <p> <div style="text-align:center"> <img src="images/nondestructive_tree_modification.png"> </div> </p> </article> <article> <h3> 非破壊的木構造の特徴 </h3> <p> 非破壊的木構造は、破壊的木構造と異なり以下の利点がある。 </p> <ul> <li>一度作成された木構造は破壊されることがない <li>破壊されることがないため、自由にコピーを行っても構わない <li>自由にコピーを行なっても構わないのでロックを必要としない </ul> <p> ロックを必要とせず、自由にコピーを行えるため、スケーラブルなシステムに有用である。 </p> </article> <article> <h3> 非破壊的木構造データベース Jungle </h3> <p> Jungle は複数の木を保持することができる。 木には名前がついており、名前を利用して判別を行う。 作成・編集・削除を行うことができる。 </p> <pre> jungle = createJungle new_jung = createTree jungle "new_tree" </pre> <p> createTree 関数を利用して木構造を作成する。 </p> </article> <article> <h3> 非破壊的木構造データベース Jungle </h3> <p> 木構造とルートノードを取得するためには以下のように記述する。 </p> <pre> tree = getTreeByName new_jung "new_tree" node = getRootNode tree </pre> <p> getTreeByName 関数で名前を指定することで木構造を取得できる。 getRootNode 関数でルートノードを取得できる。 </p> </article> <article> <h3> 非破壊的木構造データベース Jungle </h3> <p> addNewChildAt 関数で、ノードに新しい子を追加することができる。 また、putAttribute 関数で、ノードが持つ連想リストを編集できる。 </p> <p> どのノードを編集するかという情報は、ルートノードからのパスを渡すことで解決する。 木を編集したあと、updateTree 関数を用いて既存の Jungle に変更を加え新しい Jungle を作成する。 </p> <pre> new_tree = addNewChildAt tree [0,1] 0 new_tree2 = putAttribute new_tree [0,1,0] "key" "value" new_jungle = updateTree jungle new_tree2 </pre> </article> <article> <h3> 非破壊的木構造データベース Jungle </h3> <p> 非破壊的木構造であっても、どのノードが最新のルートノードなのかという情報が必要である。 スレッドセーフに取り扱う必要があるため、Haskell のソフトウェア・トランザクショナル・メモリを用いて管理している。 </p> </article> <article> <h3> 開発期間の短縮 </h3> <p> Java 版の Jungle の実装と比較すると、コード行数は約 3000 行から約 150 行へ短くなった。 また開発期間は Java 版の実装で、3 ヶ月程度かかったが、 Haskell 版の実装は 2 週間程度であった。 </p> <p> これにより、関数型プログラミングではコードは短くなり、生産性が向上することが分かった。 </p> </article> <article> <h3> 性能評価 </h3> <p> 非破壊的木構造データベース Jungle を用いて簡易掲示板システムを作成し、既存の Java 版との性能比較を行った。 </p> <p> Haskell 版 Jungle の HTTP サーバには、Warp を用いた。 Warpは、Haskell で書かれた軽量・高速な HTTP サーバである。 </p> </article> <article> <h3> 実験方法 </h3> <ul> <li>複数のクラスタを利用して、サーバに対して並列にアクセスを5000回行い、それぞれクラスタの実行平均時間をとる <li>クラスタの台数を増やすことにより負荷を上昇させる <li>測定するのは書き込みと読み込みであり、 掲示板のメッセージの取得と掲示板のメッセージの編集を行う </ul> </article> <article> <h3> 実験環境 </h3> <p> 負荷をかける対象であるサーバは、マルチコア環境が生かされているか確認するためにコア数の多いマシンを用いる </p> <p> 性能評価に使用するサーバ </p> <table> <tr> <td> OS <td> Fedora 16 <tr> <td> CPU <td> Intel Xeon X5650 2.67GHz * 2 <tr> <td> 論理コア数 <td> 24 <tr> <td> 物理メモリ <td> 132 GB </table> </article> <article> <h3> 実験結果 </h3> <div style="float:left;"> <img src="images/read.png", width="350px"> </div> <div style="float:left;"> <img src="images/write.png", width="350px"> </div> <br clear="both"> <p> 左が読み込み、右が書き込みの実験結果である。 </p> <p> Haskell 版および Java 版の Jungle は、ほぼ同程度の速度が出ていることが分かる。 </p> </article> <article> <h3> 並列実行 </h3> <p> Haskell 版 Jungle では、並列実行に問題を抱えている。 複数のスレッドが立ち上がり、並列実行していることは確認したが、シングルコアで実行した場合と比較して実行結果が遅くなる。 </p> </article> <article> <h3> 並列実行 </h3> <img src="images/para.png", width="400px"> <p> 本研究とは別に、簡単な例題を並列で動かした場合でも期待する実行速度の向上は得られなかった。 並列処理で速度向上を達成することは今後の課題である。 </p> </ul> </article> <article> <h3> 遅延評価 </h3> <p> Haskell は遅延評価を行うが、書き込みの際に問題が生じる。 何かしらの結果を表示するまで、簡約可能な式の状態で積まれたままとなる。 その際メモリを消費し、効率のよい領域に入りきらないサイズになると実行結果が遅くなる。 </p> </article> <article> <h3> 遅延評価 </h3> <p> 評価を行ったあとに実行時間がどのように変わるかを示すために、実験方法を変更した。 以下に示す。 </p> <ul> <li>クラスタ台数を10台増やすごとに一度読み込みを挟む <li>推奨されるヒープ領域のサイズを変更しない </ul> </article> <article class="nobackground"> <h3> 遅延評価 </h3> <img src="images/delay.png", width="400px"> <p> 書き込みを繰り返すと実行時間が悪化し、読み込み後、実行時間が下がる。 読み込みの際には、数万回以上の書き込みを処理するため数秒から数十秒かかる。 書き込みの順序は正しく処理されている。 </p> <p> この問題を解決するために、全て遅延評価するのではなく、適切な箇所で即時評価を行うことで領域効率を改善する必要がある </p> </article> <article> <h3> まとめ </h3> <ul> <li>Haskell による非破壊的木構造データベース Jungle を実装した <li>木構造データベース Jungle と、HTTP サーバ Warp を用いて、簡易掲示板システムを開発し、既存の Java の実装と同程度の性能を達成できた <li>Haskell 版 Jungle は、Java の実装と比較して開発期間およびコード行数は短くなった。 </ul> </article> <article> <h3> 今後の課題 </h3> <ul> <li>マルチスレッドで実行した際の実行速度の向上 <li>書き込みの際に、遅延評価のためにメモリを多く使用する問題がある。いくつかの式を即時評価するように変更し、領域効率の改善を計る。 <li>木構造を永続化する仕組みの実装 <li>分散環境でJungleを効率よく利用するために、木構造をマージする仕組みを実装 </ul> </article> </body> </html>