view Slides/jssst.html @ 25:8ba4f225dbf0 default tip

fix summary
author Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
date Fri, 13 Sep 2013 11:30:37 +0900
parents ac7ac8ef7a01
children
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>

<!--

スライドの構成が、だらだら書いただけになっている。物語になってない。読む人のことを考えてない。
書いただけ。

何を一番伝えたいのか。この研究の成果は何か。目標は何で、何を得たのか。

悪いことを強調しない。成果を強調する。発表を聞いた人が「すごい成果だ」と幸せになれるように描く。

Jungle のイメージを説明するスライドがない

    Jungle とは何か?
    Web appli の中で、Jungle をどう使うのか
  どういうアプリに向いているのか

    Jungle とは何か?

        改変履歴で接続された木の集合
        木にはroot node にのみ名前があり、最新版にアクセスすることができる
        木のノードには、属性と属性の組があり、順序を持つ子ノードを持つ
        木の改変は、ノードの属性と属性値、子ノードの操作である
        改変は root node と改変するnode へのpathによって行われる
        改変すると新しい木が作られる
        最新版は、サーバ毎に異なる可能性がある
    木へのアクセスは並行して行われ、競合したアクセスは merge により解決される


それを書いてから、

    Haskell で実装する利点

を説得力をもって書く

    非破壊データベースは、破壊代入のないプログラミング言語と相性が良い
    関数型言語は並列処理と相性が良い
    並列処理のAPIは、モナドとして提供されている
    型推論があるので Java よりも簡潔に記述できる
    定理証明支援系との相性がよく信頼性の高いシステムソフトウェアができる可能性がある

など

それから、Haskell 上のJungle の API を列挙する

そして、実験の流れを記述する

    遅延評価の影響の除去
    Java 版との Signle server での比較


遅延評価の影響を除去すると、Java と同程度の性能が出るという「成果」であることを強調する

並列実行に関しては将来の課題だが、現状では2倍程度の性能しか出てない。

    予想される問題点を列挙する
    それに対する解決策を列挙する

     やれよ!
 -->

			</article>

			<article>
				<h3>Haskellによるデータベースの実装</h3>
        <p>
        ウェブサービスの利用者の増加の予想は困難である。
        ウェブサービスは、負荷が増大した際に容易に拡張できるスケーラビリティがあることが望ましい。
        </p>
        <p>
        ウェブサービスのスケーラビリティの実現のネックは、データベースである。
        本研究室では、スケーラビリティのあるデータベースとして Jungle を開発している。
        Jungle には、既に Java による実装があり、分散データベース Cassandra 以上の性能が確認できるなどの成果がでている。
        </p>
        <p>
        本研究では、Haskell による Jungle の再実装を行った。
        その結果、Java 版と同程度の性能を得ることができた。また、Java 版の実装と比較し、開発期間及びコード行数の短縮ができた。
        </p>
			</article>

			<article>
				<h3>非破壊的木構造データベース Jungle</h3>
        <p>
        Jungle は、非破壊的木構造を取り扱うデータベースである。
        非破壊的木構造は、元の木構造を書き換えることなく、編集を行うことが可能である。
        </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>一度作成された木構造は破壊されることがない
        </ul>
        <p>
        ロックを必要とせず、また破壊されることがないため、自由にコピーを作成することができる。
        コピーを複数作成することで、アクセスを分散させることが可能であり、スケーラビリティが確保できる。
        </p>
        <p>
        この非破壊的木構造を取り扱うデータベースが Jungle である。
        </p>
			</article>

			<article>
				<h3>非破壊的木構造データベース Jungle</h3>
        <p>
        Jungle は複数の木を保持することができる。
        それぞれの木には名前がついており、名前を用いることで最新のルートノードへアクセスすることができる。
        </p>
        <p>
        木のノードには、属性と属性値の組がある。
        また、順序のある子ノードを持つ。
        </p>
        <p>
        ノードの属性と属性値、子ノードは編集可能である。
        編集には、ルートノードと編集するノードへのパスによって行われる。
        編集すると新しい木が作成される。
        </p>
        <p>
        最新版は、サーバ毎に異なる可能性がある。
        木へのアクセスは並行して行われ、競合したアクセスはマージにより解決される
        </p>
        <p>
        本研究では、Haskell による Jungle の再実装を行った。
        </p>
			</article>

			<article>
				<h3>Haskell で実装する利点</h3>
        <p>
        非破壊的木構造は、破壊的な代入のない Haskell と相性がよいと考えられる。
        Haskell は、破壊的な代入許さず、参照透過性を持つ。
        </p>
        <p>
        参照透過性を持つため、ソースコードは明瞭となる。
        また、どのようなタイミングで評価しても結果は同じとなるため、並行に評価することができる。
        </p>
        <p>
        Haskell は定理証明支援系との相性がよく、信頼性の高いシステムソフトウェアができる可能性がある
        </p>
			</article>

			<article>
				<h3>コード行数及び開発期間の短縮</h3>
        <p>
        Haskell では、再帰的なデータ構造を定義することが可能で、木構造がデータ型として定義できる。
        また、パターンマッチにより、シンプルに場合分けをすることが可能である。
        そのため、コード行数を短くすることが可能で、開発期間の短縮にも繋がった。
        </p>
        <p>
        Java 版の Jungle の実装と比較すると、コード行数は約 3000 行から約 150 行へ短くなった。
        また開発期間は Java 版の実装で、3 ヶ月程度かかったが、 Haskell 版の実装は 2 週間程度であった。
        </p>
			</article>

			<article>
				<h3>Haskell 版 Jungle の API</h3>
        <p>
        Jungle は、様々なシステムに組み込んで使用できる。
        Haskell 版 Jungle の利用方法について述べる。
			</article>

			<article>
				<h3>木の作成</h3>
        <p>
        Jungle は複数の木を保持することができる。
        木には名前がついており、名前を利用して、木構造の取得や削除を行うことができる。
        </p>
<pre>
jungle = createJungle
new_jung = createTree jungle "new_tree"
</pre>
        <p>
        createTree 関数を利用して、"new_tree"という名前の木構造を作成するコードである。
        </p>
			</article>

			<article>
				<h3>ルートノードの取得</h3>
        <p>
        ルートノードを取得するためには以下のように記述する。
        </p>
<pre>
tree = getTreeByName new_jung "new_tree"
node = getRootNode tree
</pre>
        <p>
        getTreeByName 関数で名前を指定することで木構造を取得できる。
        getRootNode 関数でルートノードを取得できる。
        </p>
			</article>

			<article>
				<h3>子の追加及び属性の追加</h3>
        <p>
        addNewChildAt 関数で、ノードに新しい子を追加することができる。
        また、putAttribute 関数で、ノードに属性を追加できる。
        </p>
<pre>
new_tree = addNewChildAt tree [0,1] 0
new_tree2 = putAttribute new_tree [0,1,0] "key" "value"
</pre>
        <p>
        どのノードを編集するかという情報は、ルートノードからのパスを渡すことで解決する。
        </p>
			</article>

			<article>
				<h3>パス</h3>
        <p>
        パスは Haskell のリストとして定義する。
        ルートノードからスタートし、ノードの子供の場所を次々に指定していくことで編集対象のノードの場所を表す。
        </p>
        <p>
        <div style="text-align:center">
          <img src="images/nodepath.png">
        </div>
        </p>
			</article>

			<article>
				<h3>掲示板システム</h3>
        <p>
        これらのAPIを利用して、ウェブサービスを構築できる。
        Jungle を用いた CMS として掲示板システムを作成した。
        </p>
        <p>
        掲示板システムの HTTP サーバには、Warp を用いる。
        Warp は、Haskell で書かれた軽量・高速な HTTP サーバでプログラムに組み込んで利用することが可能である。
        </p>
			</article>

			<article>
				<h3>ベンチマーク</h3>
        <p>
        掲示板システムを利用して、Haskell 版 Jungle と Java 版 Jungle の性能比較を行う。
        </p>
        <p>
        Java 版 Jungle には、HTTP サーバ Jetty を用いた掲示板システムの実装があり、それを採用する。
        </p>
        <p>
        実験方法を以下に示す。
        </p>
        <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>
        ノード数が増えると負荷が上昇するため、実行にかかる時間が伸びている。
        </p>
        <p>
        Haskell 版および Java 版の Jungle は、ほぼ同程度の速度が出ていることが分かる。
        </p>
			</article>

			<article>
				<h3>Haskell 版 Jungle の課題</h3>
        <p>
        Haskell版 Jungle は、Java 版と同程度の速度が出ているが、まだ速度向上の余地がある。
        </p>
        <p>
        並列実行と、メモリ領域効率の改良が可能である。
        </p>
			</article>

			<article>
				<h3>並列実行</h3>
        <p>
        Haskell 版 Jungle では、並列実行に改良の余地がある。
        現在、Haskell 版 Jungle はシングルコアで実行している。
        </p>

        <p>
        並列実行を行った場合、複数のスレッドが立ち上がり、処理を行っていることは確認できた。
        しかしながら、シングルコアで実行した場合と比較して実行結果が遅くなる。
        マルチコアで実行した際の速度向上の達成のために、オーバーヘッドとなっている部分を見直し改善する必要がある。
        </p>
        <div style="text-align:center">
          <img src="images/para.png", width="400px">
        </div>
			</article>

			<article>
				<h3>メモリ領域の効率</h3>
        <p>
        Haskell 版 Jungle は、全ての評価を遅延評価で行っている。
        書き込みの際、何かしらの結果を表示するまで、簡約可能な式の状態で積まれたままとなる。
        </p>
        <p>
        適切な箇所で、即時評価を行うように変更することでメモリ領域の効率を改善できる。
        </p>
        <p>
        メモリ領域の効率は、大量に書き込みだけを行った場合に問題となる。
        大量に書き込みだけを行った場合、簡約可能な式が積まれ続ける。
        その際、効率のよい領域に入りきらないサイズになると実行結果が遅くなる。
        現在は、推奨されるヒープ領域のサイズを変更している。
        </p>
			</article>

      <article class="nobackground">
				<h3>メモリ領域の効率</h3>
        <p>
        ヒープ領域のサイズを変更しない場合の実験結果を示す。
        また、読み込みを行った際に、実行速度が改善することを示すために、クラスタ台数を10台増やすごとに一度読み込みを挟む。
        </p>
        <div style="text-align:center">
          <img src="images/delay.png", width="350px">
        </div>
        <p>
        書き込みを繰り返すと実行時間が悪化し、読み込み後、実行時間が下がる。
        読み込みの際には、数万回以上の書き込みを処理するため数秒から数十秒かかる。
        書き込みの順序は正しく処理されている。
        </p>
			</article>

			<article>
				<h3>
          まとめ
				</h3>
        <ul>
          <li>Haskell による 非破壊的木構造データベース Jungle の再実装を行った
          <li>Haskell 版 Jungle は、Java の実装と比較してコード行数および開発期間を短く出来た
          <li>Haskell 版 Jungle を用い、掲示板システムを実装した
          <li>実装した掲示板システムは、Java版と同程度の性能を達成できた
        </ul>
			</article>

			<article>
				<h3>
          今後の課題
				</h3>
        <ul>
          <li>マルチスレッドで実行した際に、速度の向上を計る
          <li>いくつかの式を即時評価するように変更し、メモリ領域の効率改善を行う
          <li>分散環境で Jungle を効率よく利用するために、木構造をマージする仕組みの実装を行う
        </ul>
			</article>
	</body>
</html>