Mercurial > hg > Papers > 2013 > toma-jssst
annotate Slides/jssst.html @ 24:ac7ac8ef7a01
add bulletin board page.
author | Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 13 Sep 2013 11:23:23 +0900 |
parents | 426856180cc3 |
children | 8ba4f225dbf0 |
rev | line source |
---|---|
20 | 1 <!DOCTYPE html> |
2 | |
3 <!-- | |
4 Google HTML5 slide template | |
5 | |
6 Authors: Luke Mahé (code) | |
7 Marcin Wichary (code and design) | |
8 | |
9 Dominic Mazzoni (browser compatibility) | |
10 Charles Chen (ChromeVox support) | |
11 | |
12 URL: http://code.google.com/p/html5slides/ | |
13 --> | |
14 | |
15 <html> | |
16 <head> | |
17 <title> | |
18 Haskellによる非破壊的木構造を用いたCMSの実装 | |
19 </title> | |
20 | |
21 <meta charset='utf-8'> | |
22 <script | |
23 src='http://web.amothic.com/html5slides/slides.js'></script> | |
24 </head> | |
25 | |
26 <style> | |
27 /* Your individual styles here, or just use inline styles if that’s | |
28 what you want. */ | |
29 | |
30 | |
31 </style> | |
32 | |
33 <body style='display: none'> | |
34 | |
35 <section class='slides layout-regular template-concurrency'> | |
36 | |
37 <!-- Your slides (<article>s) go here. Delete or comment out the | |
38 slides below. --> | |
39 | |
40 <article> | |
41 <h1> | |
42 Haskellによる非破壊的木構造を用いたCMSの実装 | |
43 </h1> | |
44 <p> | |
23 | 45 Daichi TOMA <br> |
46 Sep 13, 2013 | |
20 | 47 </p> |
22 | 48 |
49 <!-- | |
50 | |
51 スライドの構成が、だらだら書いただけになっている。物語になってない。読む人のことを考えてない。 | |
52 書いただけ。 | |
53 | |
54 何を一番伝えたいのか。この研究の成果は何か。目標は何で、何を得たのか。 | |
55 | |
56 悪いことを強調しない。成果を強調する。発表を聞いた人が「すごい成果だ」と幸せになれるように描く。 | |
57 | |
58 Jungle のイメージを説明するスライドがない | |
59 | |
60 Jungle とは何か? | |
61 Web appli の中で、Jungle をどう使うのか | |
62 どういうアプリに向いているのか | |
63 | |
64 Jungle とは何か? | |
65 | |
66 改変履歴で接続された木の集合 | |
67 木にはroot node にのみ名前があり、最新版にアクセスすることができる | |
68 木のノードには、属性と属性の組があり、順序を持つ子ノードを持つ | |
69 木の改変は、ノードの属性と属性値、子ノードの操作である | |
70 改変は root node と改変するnode へのpathによって行われる | |
71 改変すると新しい木が作られる | |
72 最新版は、サーバ毎に異なる可能性がある | |
73 木へのアクセスは並行して行われ、競合したアクセスは merge により解決される | |
74 | |
75 | |
76 それを書いてから、 | |
77 | |
78 Haskell で実装する利点 | |
79 | |
80 を説得力をもって書く | |
81 | |
82 非破壊データベースは、破壊代入のないプログラミング言語と相性が良い | |
83 関数型言語は並列処理と相性が良い | |
84 並列処理のAPIは、モナドとして提供されている | |
85 型推論があるので Java よりも簡潔に記述できる | |
86 定理証明支援系との相性がよく信頼性の高いシステムソフトウェアができる可能性がある | |
87 | |
88 など | |
89 | |
90 それから、Haskell 上のJungle の API を列挙する | |
91 | |
92 そして、実験の流れを記述する | |
93 | |
94 遅延評価の影響の除去 | |
95 Java 版との Signle server での比較 | |
96 | |
97 | |
98 遅延評価の影響を除去すると、Java と同程度の性能が出るという「成果」であることを強調する | |
99 | |
100 並列実行に関しては将来の課題だが、現状では2倍程度の性能しか出てない。 | |
101 | |
102 予想される問題点を列挙する | |
103 それに対する解決策を列挙する | |
104 | |
105 やれよ! | |
106 --> | |
107 | |
20 | 108 </article> |
109 | |
110 <article> | |
23 | 111 <h3>Haskellによるデータベースの実装</h3> |
20 | 112 <p> |
23 | 113 ウェブサービスの利用者の増加の予想は困難である。 |
114 ウェブサービスは、負荷が増大した際に容易に拡張できるスケーラビリティがあることが望ましい。 | |
20 | 115 </p> |
116 <p> | |
23 | 117 ウェブサービスのスケーラビリティの実現のネックは、データベースである。 |
118 本研究室では、スケーラビリティのあるデータベースとして Jungle を開発している。 | |
119 Jungle には、既に Java による実装があり、分散データベース Cassandra 以上の性能が確認できるなどの成果がでている。 | |
120 </p> | |
121 <p> | |
122 本研究では、Haskell による Jungle の再実装を行った。 | |
20 | 123 その結果、Java 版と同程度の性能を得ることができた。また、Java 版の実装と比較し、開発期間及びコード行数の短縮ができた。 |
124 </p> | |
125 </article> | |
126 | |
127 <article> | |
23 | 128 <h3>非破壊的木構造データベース Jungle</h3> |
20 | 129 <p> |
23 | 130 Jungle は、非破壊的木構造を取り扱うデータベースである。 |
131 非破壊的木構造は、元の木構造を書き換えることなく、編集を行うことが可能である。 | |
20 | 132 </p> |
21 | 133 <p> |
134 <div style="text-align:center"> | |
135 <img src="images/nondestructive_tree_modification.png"> | |
136 </div> | |
137 </p> | |
20 | 138 </article> |
139 | |
140 <article> | |
23 | 141 <h3>非破壊的木構造の特徴</h3> |
20 | 142 <p> |
23 | 143 非破壊的木構造は以下の特徴を持つ。 |
20 | 144 </p> |
145 <ul> | |
23 | 146 <li>ロックをせずに並列に読み書き可能である |
20 | 147 <li>一度作成された木構造は破壊されることがない |
148 </ul> | |
149 <p> | |
23 | 150 ロックを必要とせず、また破壊されることがないため、自由にコピーを作成することができる。 |
151 コピーを複数作成することで、アクセスを分散させることが可能であり、スケーラビリティが確保できる。 | |
152 </p> | |
153 <p> | |
154 この非破壊的木構造を取り扱うデータベースが Jungle である。 | |
20 | 155 </p> |
156 </article> | |
157 | |
158 <article> | |
23 | 159 <h3>非破壊的木構造データベース Jungle</h3> |
160 <p> | |
161 Jungle は複数の木を保持することができる。 | |
162 それぞれの木には名前がついており、名前を用いることで最新のルートノードへアクセスすることができる。 | |
163 </p> | |
164 <p> | |
165 木のノードには、属性と属性値の組がある。 | |
166 また、順序のある子ノードを持つ。 | |
167 </p> | |
168 <p> | |
169 ノードの属性と属性値、子ノードは編集可能である。 | |
170 編集には、ルートノードと編集するノードへのパスによって行われる。 | |
171 編集すると新しい木が作成される。 | |
172 </p> | |
173 <p> | |
174 最新版は、サーバ毎に異なる可能性がある。 | |
175 木へのアクセスは並行して行われ、競合したアクセスはマージにより解決される | |
176 </p> | |
177 <p> | |
178 本研究では、Haskell による Jungle の再実装を行った。 | |
179 </p> | |
180 </article> | |
181 | |
182 <article> | |
183 <h3>Haskell で実装する利点</h3> | |
184 <p> | |
185 非破壊的木構造は、破壊的な代入のない Haskell と相性がよいと考えられる。 | |
186 Haskell は、破壊的な代入許さず、参照透過性を持つ。 | |
187 </p> | |
20 | 188 <p> |
23 | 189 参照透過性を持つため、ソースコードは明瞭となる。 |
190 また、どのようなタイミングで評価しても結果は同じとなるため、並行に評価することができる。 | |
191 </p> | |
192 <p> | |
193 Haskell は定理証明支援系との相性がよく、信頼性の高いシステムソフトウェアができる可能性がある | |
194 </p> | |
195 </article> | |
196 | |
197 <article> | |
198 <h3>コード行数及び開発期間の短縮</h3> | |
199 <p> | |
200 Haskell では、再帰的なデータ構造を定義することが可能で、木構造がデータ型として定義できる。 | |
201 また、パターンマッチにより、シンプルに場合分けをすることが可能である。 | |
202 そのため、コード行数を短くすることが可能で、開発期間の短縮にも繋がった。 | |
203 </p> | |
204 <p> | |
205 Java 版の Jungle の実装と比較すると、コード行数は約 3000 行から約 150 行へ短くなった。 | |
206 また開発期間は Java 版の実装で、3 ヶ月程度かかったが、 Haskell 版の実装は 2 週間程度であった。 | |
207 </p> | |
208 </article> | |
209 | |
210 <article> | |
211 <h3>Haskell 版 Jungle の API</h3> | |
212 <p> | |
213 Jungle は、様々なシステムに組み込んで使用できる。 | |
214 Haskell 版 Jungle の利用方法について述べる。 | |
215 </article> | |
216 | |
217 <article> | |
218 <h3>木の作成</h3> | |
219 <p> | |
21 | 220 Jungle は複数の木を保持することができる。 |
23 | 221 木には名前がついており、名前を利用して、木構造の取得や削除を行うことができる。 |
21 | 222 </p> |
223 <pre> | |
224 jungle = createJungle | |
225 new_jung = createTree jungle "new_tree" | |
226 </pre> | |
227 <p> | |
23 | 228 createTree 関数を利用して、"new_tree"という名前の木構造を作成するコードである。 |
21 | 229 </p> |
230 </article> | |
231 | |
232 <article> | |
23 | 233 <h3>ルートノードの取得</h3> |
21 | 234 <p> |
23 | 235 ルートノードを取得するためには以下のように記述する。 |
21 | 236 </p> |
237 <pre> | |
238 tree = getTreeByName new_jung "new_tree" | |
239 node = getRootNode tree | |
240 </pre> | |
241 <p> | |
242 getTreeByName 関数で名前を指定することで木構造を取得できる。 | |
243 getRootNode 関数でルートノードを取得できる。 | |
23 | 244 </p> |
245 </article> | |
246 | |
247 <article> | |
248 <h3>子の追加及び属性の追加</h3> | |
249 <p> | |
250 addNewChildAt 関数で、ノードに新しい子を追加することができる。 | |
251 また、putAttribute 関数で、ノードに属性を追加できる。 | |
252 </p> | |
253 <pre> | |
254 new_tree = addNewChildAt tree [0,1] 0 | |
255 new_tree2 = putAttribute new_tree [0,1,0] "key" "value" | |
256 </pre> | |
257 <p> | |
258 どのノードを編集するかという情報は、ルートノードからのパスを渡すことで解決する。 | |
21 | 259 </p> |
260 </article> | |
261 | |
262 <article> | |
23 | 263 <h3>パス</h3> |
21 | 264 <p> |
23 | 265 パスは Haskell のリストとして定義する。 |
266 ルートノードからスタートし、ノードの子供の場所を次々に指定していくことで編集対象のノードの場所を表す。 | |
20 | 267 </p> |
268 <p> | |
23 | 269 <div style="text-align:center"> |
270 <img src="images/nodepath.png"> | |
271 </div> | |
20 | 272 </p> |
273 </article> | |
21 | 274 |
275 <article> | |
24
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
276 <h3>掲示板システム</h3> |
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
277 <p> |
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
278 これらのAPIを利用して、ウェブサービスを構築できる。 |
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
279 Jungle を用いた CMS として掲示板システムを作成した。 |
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
280 </p> |
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
281 <p> |
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
282 掲示板システムの HTTP サーバには、Warp を用いる。 |
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
283 Warp は、Haskell で書かれた軽量・高速な HTTP サーバでプログラムに組み込んで利用することが可能である。 |
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
284 </p> |
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
285 </article> |
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
286 |
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
287 <article> |
23 | 288 <h3>ベンチマーク</h3> |
21 | 289 <p> |
24
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
290 掲示板システムを利用して、Haskell 版 Jungle と Java 版 Jungle の性能比較を行う。 |
21 | 291 </p> |
292 <p> | |
24
ac7ac8ef7a01
add bulletin board page.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
293 Java 版 Jungle には、HTTP サーバ Jetty を用いた掲示板システムの実装があり、それを採用する。 |
20 | 294 </p> |
295 <p> | |
23 | 296 実験方法を以下に示す。 |
20 | 297 </p> |
298 <ul> | |
299 <li>複数のクラスタを利用して、サーバに対して並列にアクセスを5000回行い、それぞれクラスタの実行平均時間をとる | |
300 <li>クラスタの台数を増やすことにより負荷を上昇させる | |
301 <li>測定するのは書き込みと読み込みであり、 掲示板のメッセージの取得と掲示板のメッセージの編集を行う | |
302 </ul> | |
303 </article> | |
304 | |
305 <article> | |
23 | 306 <h3>実験環境</h3> |
21 | 307 <p> |
308 負荷をかける対象であるサーバは、マルチコア環境が生かされているか確認するためにコア数の多いマシンを用いる | |
309 </p> | |
310 <p> | |
311 性能評価に使用するサーバ | |
312 </p> | |
313 <table> | |
314 <tr> | |
315 <td> | |
316 OS | |
317 <td> | |
318 Fedora 16 | |
319 <tr> | |
320 <td> | |
321 CPU | |
322 <td> | |
323 Intel Xeon X5650 2.67GHz * 2 | |
324 <tr> | |
325 <td> | |
326 論理コア数 | |
327 <td> | |
328 24 | |
329 <tr> | |
330 <td> | |
331 物理メモリ | |
332 <td> | |
333 132 GB | |
334 </table> | |
20 | 335 </article> |
336 | |
337 <article> | |
23 | 338 <h3>実験結果</h3> |
21 | 339 <div style="float:left;"> |
340 <img src="images/read.png", width="350px"> | |
341 </div> | |
342 <div style="float:left;"> | |
343 <img src="images/write.png", width="350px"> | |
344 </div> | |
345 <br clear="both"> | |
346 | |
347 <p> | |
348 左が読み込み、右が書き込みの実験結果である。 | |
23 | 349 縦軸は実行時間、横軸はノード数である。 |
21 | 350 </p> |
23 | 351 <p> |
352 ノード数が増えると負荷が上昇するため、実行にかかる時間が伸びている。 | |
353 </p> | |
21 | 354 <p> |
355 Haskell 版および Java 版の Jungle は、ほぼ同程度の速度が出ていることが分かる。 | |
356 </p> | |
20 | 357 </article> |
358 | |
359 <article> | |
23 | 360 <h3>Haskell 版 Jungle の課題</h3> |
21 | 361 <p> |
23 | 362 Haskell版 Jungle は、Java 版と同程度の速度が出ているが、まだ速度向上の余地がある。 |
363 </p> | |
364 <p> | |
365 並列実行と、メモリ領域効率の改良が可能である。 | |
21 | 366 </p> |
20 | 367 </article> |
368 | |
369 <article> | |
23 | 370 <h3>並列実行</h3> |
371 <p> | |
372 Haskell 版 Jungle では、並列実行に改良の余地がある。 | |
373 現在、Haskell 版 Jungle はシングルコアで実行している。 | |
374 </p> | |
375 | |
21 | 376 <p> |
23 | 377 並列実行を行った場合、複数のスレッドが立ち上がり、処理を行っていることは確認できた。 |
378 しかしながら、シングルコアで実行した場合と比較して実行結果が遅くなる。 | |
379 マルチコアで実行した際の速度向上の達成のために、オーバーヘッドとなっている部分を見直し改善する必要がある。 | |
21 | 380 </p> |
23 | 381 <div style="text-align:center"> |
382 <img src="images/para.png", width="400px"> | |
383 </div> | |
20 | 384 </article> |
385 | |
386 <article> | |
23 | 387 <h3>メモリ領域の効率</h3> |
388 <p> | |
389 Haskell 版 Jungle は、全ての評価を遅延評価で行っている。 | |
390 書き込みの際、何かしらの結果を表示するまで、簡約可能な式の状態で積まれたままとなる。 | |
391 </p> | |
21 | 392 <p> |
23 | 393 適切な箇所で、即時評価を行うように変更することでメモリ領域の効率を改善できる。 |
394 </p> | |
395 <p> | |
396 メモリ領域の効率は、大量に書き込みだけを行った場合に問題となる。 | |
397 大量に書き込みだけを行った場合、簡約可能な式が積まれ続ける。 | |
398 その際、効率のよい領域に入りきらないサイズになると実行結果が遅くなる。 | |
399 現在は、推奨されるヒープ領域のサイズを変更している。 | |
21 | 400 </p> |
20 | 401 </article> |
402 | |
23 | 403 <article class="nobackground"> |
404 <h3>メモリ領域の効率</h3> | |
21 | 405 <p> |
23 | 406 ヒープ領域のサイズを変更しない場合の実験結果を示す。 |
407 また、読み込みを行った際に、実行速度が改善することを示すために、クラスタ台数を10台増やすごとに一度読み込みを挟む。 | |
21 | 408 </p> |
23 | 409 <div style="text-align:center"> |
410 <img src="images/delay.png", width="350px"> | |
411 </div> | |
21 | 412 <p> |
413 書き込みを繰り返すと実行時間が悪化し、読み込み後、実行時間が下がる。 | |
414 読み込みの際には、数万回以上の書き込みを処理するため数秒から数十秒かかる。 | |
415 書き込みの順序は正しく処理されている。 | |
416 </p> | |
417 </article> | |
418 | |
20 | 419 <article> |
420 <h3> | |
421 まとめ | |
422 </h3> | |
423 <ul> | |
23 | 424 <li>Haskell による 非破壊的木構造データベース Jungle を実装した |
425 <li>実装した Haskell 版 Jungle は Java 版 Jungle と同程度の性能を達成できた | |
426 <li>Haskell 版 Jungle は、Java の実装と比較してコード行数および開発期間は短くなった | |
20 | 427 </ul> |
428 </article> | |
429 | |
430 <article> | |
431 <h3> | |
432 今後の課題 | |
433 </h3> | |
434 <ul> | |
23 | 435 <li>マルチスレッドで実行した際に、速度の向上を計る |
436 <li>いくつかの式を即時評価するように変更し、メモリ領域の効率改善を行う | |
437 <li>分散環境で Jungle を効率よく利用するために、木構造をマージする仕組みの実装を行う | |
20 | 438 </ul> |
439 </article> | |
440 </body> | |
441 </html> |