31
|
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 による並列データベースの実装
|
|
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>
|
70
|
41 <h1> 関数型言語 Haskell による並列データベースの実装 </h1>
|
31
|
42 <p>
|
|
43 Daichi TOMA
|
|
44 <br>
|
66
|
45 Feb 12, 2014
|
31
|
46 </p>
|
|
47 </article>
|
|
48
|
70
|
49 <article>
|
|
50 <h3> 研究概要 </h3>
|
|
51 <p> Haskell を用いて信頼性の高い並列データベースを実装した </p>
|
|
52 <p> Haskell は rseq により並列実行を指示し、STMにより共有データを実現する</p>
|
|
53 <p> Haskellの並列処理は、最新のコンパイラで性能がでることがわかった</p>
|
|
54 <p> 読み込みに関して 12 コアで実行した場合、10.37 倍 という性能向上率が確認できた </p>
|
|
55 <p> Web 掲示板サービスを開発し、Java と比較して読み込みで 3.25 倍、書き込みで 3.78 倍の性能差が確認できた </p>
|
|
56 <p> Network および IO の並列性能はあまり出てないことがわかった</p>
|
|
57 </article>
|
31
|
58
|
70
|
59 <article>
|
|
60 <h3> Haskellによる信頼性の高いサービスの構築</h3>
|
|
61 <p> Web サービスの脆弱性を悪用されると多大な被害がでる </p>
|
|
62 <p> 脆弱性の大半はBuffer Overflowや、Cross site scripting、SQL injection </p>
|
|
63 <p> これらは型エラー。Haskell は、これらをコンパイル時にチェック</p>
|
|
64 <p> 入力として受け取った文字列が、HTML型に実行時に自動変換されたりしない<br>
|
|
65 ⇒ クロスサイトスクリプティングが防げる </p>
|
|
66 </article>
|
31
|
67
|
70
|
68 <article>
|
|
69 <h3> Haskellの型検査の例(list) </h3>
|
|
70 :
|
|
71 / \
|
|
72 1 []
|
43
|
73 <pre>
|
70
|
74 let a = 0 : [1,2,3] -- [0,1,2,3]
|
|
75 let b = 'a' : [1,2,3] -- error
|
|
76 let c = 1 : ['a','b','c'] -- error
|
43
|
77 </pre>
|
70
|
78 </article>
|
43
|
79
|
70
|
80 <article>
|
|
81 <h3> 型推論 </h3>
|
|
82 <p> 前提として関数に以下のような型が定義されているとする </p>
|
46
|
83 <pre>
|
|
84 getNode :: Node -> Path -> Node
|
|
85 elems :: Map k a -> [a]
|
|
86 children :: Node -> Map Int Node
|
|
87 </pre>
|
70
|
88 <p> 新しくgetChildrenという関数を定義する</p>
|
43
|
89 <pre>
|
66
|
90 getChildren node path = elems (children (getNode node path))
|
|
91 </pre>
|
70
|
92 <p> 型をHaskellが自動で導出する </p>
|
66
|
93 <pre>
|
|
94 *Jungle> :type getChildren
|
|
95 getChildren :: Node -> Path -> [Node]
|
43
|
96 </pre>
|
46
|
97 </article>
|
|
98
|
70
|
99 <article>
|
|
100 <h3> 実用的なデータベースには並列実行が必須 </h3>
|
|
101 <p> 現在、CPU はマルチコア化がすすんでいる </p>
|
|
102 <p> 実用的なデータベースとするためにはマルチコアに対応させる必要性がある </p>
|
|
103 <p> 並列に処理できればマルチコアで性能が出る </p>
|
|
104 <p> Haskell は Eval モナド(rpar)といったモナドで並列実行の機能を提供</p>
|
|
105 <p> モナドは、Haskellでメタ計算を提供する構文あるいはAPI</p>
|
|
106 <p> システムコールのようなものと考えてよい</p>
|
|
107 <p> モナドの例:IOモナド、エラーモナド、STMモナド </p>
|
|
108 </article>
|
46
|
109
|
70
|
110 Haskell の並列処理
|
|
111 rparの例
|
43
|
112 <article>
|
|
113 <h3>
|
68
|
114 Haskell の遅延評価
|
|
115 </h3>
|
|
116 <p>
|
69
|
117 並列実行は遅延評価が問題になる
|
|
118 </p>
|
|
119 <p>
|
68
|
120 haskell では値が必要となるまで式の評価が行われない
|
|
121 </p>
|
|
122 <p>
|
|
123 並列に実行するように指示しても、評価が行われなければ並列に動かない
|
|
124 </p>
|
|
125 </article>
|
|
126
|
|
127 <article>
|
|
128 <h3>
|
|
129 Haskell の遅延評価
|
|
130 </h3>
|
|
131 <p>
|
|
132 sprintは評価を行わずに値を表示するコマンド
|
|
133 </p>
|
|
134 <p>
|
|
135 _ は未評価の式を表し、thunk と呼ばれる
|
|
136 </p>
|
|
137
|
|
138 <pre>
|
|
139 ghci> let y = map (+1) [1,2,3] :: [Int]
|
|
140 ghci> :sprint y
|
69
|
141 y = _
|
68
|
142 ghci> length y
|
|
143 3
|
|
144 ghci> :sprint y
|
69
|
145 y = [_,_,_]
|
68
|
146 ghci> head y
|
|
147 2
|
|
148 ghci> :sprint y
|
|
149 y = [2,_,_]
|
|
150 </pre>
|
69
|
151 <p>
|
|
152 並列実行時には出力などを挟んで強制的に即時評価されるようにする
|
|
153 </p>
|
68
|
154 </article>
|
|
155
|
|
156 <article>
|
|
157 <h3>
|
|
158 データベースの設計 - 非破壊的木構造
|
31
|
159 </h3>
|
|
160 <p>
|
66
|
161 マルチコア上で、データベースの性能向上をさせるためには、各コアからデータに同時にアクセスできるようにする
|
31
|
162 </p>
|
|
163 <p>
|
46
|
164 非破壊的木構造という手法を用いる。
|
31
|
165
|
46
|
166 非破壊的木構造は、元となる木構造を書き換えずに編集できる。
|
|
167 </p>
|
31
|
168 <p>
|
43
|
169 既にあるデータを変更しないので、データの競合状態が発生しない。並列に読み書きできる
|
|
170 </p>
|
46
|
171 <br>
|
31
|
172 <div align="center">
|
46
|
173 <img src="images/concurrent_edit.png" width="400px">
|
31
|
174 </div>
|
|
175 </article>
|
|
176
|
70
|
177 <article>
|
|
178 <h3> Haskell でのRoot Node の管理 </h3>
|
31
|
179
|
70
|
180 <p> Root Node は最新のNode → 状態を持つ</p>
|
|
181 <p> 共有された状態を作るには Software Transactional Memory (STM) を使う </p>
|
|
182 <p> STM は、ノンブロッキングで共有データを扱える </p>
|
|
183 <p> 共有データの変更は以下の様に行われる </p>
|
31
|
184 <ul>
|
66
|
185 <li>他から変更がなければそのまま適用
|
|
186 <li>変更している間に、他から変更されれば変更処理をやり直し
|
31
|
187 </ul>
|
70
|
188 </article>
|
31
|
189
|
43
|
190
|
|
191 <article>
|
|
192 <h3>
|
66
|
193 非破壊的木構造データベース Jungle
|
43
|
194 </h3>
|
|
195 <p>
|
66
|
196 非破壊的木構造を扱うデータベース Jungle を開発した
|
|
197 </p>
|
|
198 <p>
|
|
199 Jungle の基本的な使い方
|
|
200 </p>
|
|
201 <ul>
|
|
202 <li> 木構造を保持する Jungle を作成
|
|
203 <li> Jungle に新しい木を作成
|
|
204 <li> 木から最新のルートノードを取ってきて、データを参照する
|
|
205 <li> もしくは、ノードを編集し、木の最新のルートノードを更新する
|
|
206 </ul>
|
|
207 </article>
|
|
208
|
|
209 <article>
|
|
210 <h3>
|
|
211 木構造を保持する Jungle の作成
|
|
212 </h3>
|
|
213 <pre>
|
|
214 data Jungle = Jungle (TVar (Map String Tree))
|
|
215 </pre>
|
|
216 <p>
|
|
217 TVarがついているのはSTMを使っている変数
|
|
218 </p>
|
|
219 <p>
|
69
|
220 各スレッドから新しく木を作ったりできるように木構造の保持にSTMを使っている
|
66
|
221 </p>
|
|
222 <p>
|
|
223 Jungle は複数の Tree を名前で管理する
|
43
|
224 </p>
|
31
|
225 <div align="center">
|
66
|
226 <img src="images/jungle_type.png" width="500px">
|
31
|
227 </div>
|
|
228 </article>
|
|
229
|
66
|
230
|
|
231 <article>
|
|
232 <h3>
|
67
|
233 木から最新のルートノードを取ってくる
|
66
|
234 </h3>
|
|
235 <p>
|
|
236 木から最新のルートノードを取ってくるにはgetRootNodeという関数を使う
|
|
237 </p>
|
|
238 <pre>
|
43
|
239 getRootNode :: Jungle -> String -> IO Node
|
66
|
240 </pre>
|
|
241 <p>
|
|
242 Jungleと木の名前を渡すと最新のルートノードが返ってくる
|
|
243 </p>
|
|
244 </article>
|
|
245
|
70
|
246 <article>
|
|
247 <h3> ノード </h3>
|
|
248 <p> Node はChildren(Node)とattributesを持つ </p>
|
|
249 <p> Jungle の参照や変更の関数は全てノードに対して行う </p>
|
66
|
250 <div align="center">
|
|
251 <img src="images/node_component.png" width="500px">
|
|
252 </div>
|
70
|
253 </article>
|
66
|
254
|
70
|
255 <article>
|
|
256 <h3> ノードを編集し、木の最新のルートノードを更新する </h3>
|
|
257 <p> updateRootNodeやupdateRootNodeWithで更新できる </p>
|
|
258 <p> 内部でSTMを使っているのでIOモナドを返す</p>
|
66
|
259 <pre>
|
43
|
260 updateRootNode :: Jungle -> String -> Node -> IO ()
|
|
261 updateRootNodeWith :: (Node -> Node) -> Jungle -> String -> IO ()
|
|
262 </pre>
|
70
|
263 <p> updateRootNodeには編集したNodeを渡すことで木の最新のルートノードを更新できる </p>
|
|
264 <p> updateRootNodeWithにはNodeを編集する関数を渡すことで木の最新のルートノードを更新できる </p>
|
|
265 </article>
|
31
|
266
|
|
267 <article>
|
|
268 <h3>
|
43
|
269 性能計測
|
31
|
270 </h3>
|
|
271 <p>
|
43
|
272 Jungle がマルチコアプロセッサで性能が出るのか、実用的なWebサービスが提供できるのか確認する
|
31
|
273 </p>
|
|
274 <p>
|
66
|
275 性能の計測に用いるサーバの仕様
|
|
276 </p>
|
|
277 ハイパースレッディングで24コアまで使える<br>
|
|
278 ハイパースレッディングはおよそ20%程度クロックあたりの性能が向上する
|
33
|
279 </p>
|
|
280 <table>
|
|
281 <tr>
|
|
282 <th>名前</th>
|
|
283 <th>概要</th>
|
|
284 </tr>
|
|
285 <tr>
|
|
286 <td>CPU</td>
|
|
287 <td>Intel(R) Xeon(R) CPU X5650@2.67GHz * 2</td>
|
|
288 </tr>
|
|
289 <tr>
|
|
290 <td>コア数</td>
|
|
291 <td>12</td>
|
|
292 </tr>
|
|
293 <tr>
|
|
294 <td>メインメモリ</td>
|
|
295 <td>126 GB</td>
|
|
296 </tr>
|
|
297 <tr>
|
|
298 <td>OS</td>
|
66
|
299 <td>Fedora 19</td>
|
33
|
300 </tr>
|
|
301 </table>
|
31
|
302 </article>
|
|
303
|
66
|
304 <article>
|
|
305 <h3>
|
|
306 Haskell コンパイラ
|
|
307 </h3>
|
|
308 <p>
|
|
309 Haskell のコンパイラには The Glasgow Haskell Compiler (GHC) を利用する
|
|
310 </p>
|
|
311 <p>
|
|
312 現在の GHC の安定版 7.6.3 は並列時にIOマネージャーがスケールしないという問題がある
|
|
313 </p>
|
|
314 <p>
|
70
|
315 リリース候補版である 7.8 を用いることにより、よりよい性能を得ることができた
|
66
|
316 </p>
|
|
317 </article>
|
|
318
|
|
319 <article>
|
|
320 <h3>
|
70
|
321 親和性機能(affinity)を利用する
|
66
|
322 </h3>
|
|
323 <p>
|
67
|
324 親和性機能とは OS スレッドをCPUコアに固定する機能
|
66
|
325 </p>
|
|
326 <p>
|
|
327 並列実行時の性能が向上するため性能計測で利用する
|
|
328 </p>
|
|
329 <p>
|
|
330 Haskell は実行時に -qa オプションを使うこと親和性機能を使うように指示できる
|
|
331 </p>
|
|
332 </article>
|
|
333
|
43
|
334 <article class="smaller">
|
|
335 <h3>
|
66
|
336 読み込みの性能計測
|
43
|
337 </h3>
|
|
338 <p>
|
|
339 木構造の読み込みにかかる時間を計測する
|
|
340 </p>
|
|
341 <p>
|
66
|
342 12 スレッドで親和性機能を使って実行した場合 10.37 倍の性能向上
|
43
|
343 </p>
|
|
344 <p>
|
67
|
345 親和性機能を使って24スレッドで実行すると実行時間が大幅に伸びる。
|
|
346 スレッドが CPU に固定されるため、性能計測以外のプログラムがうまくスケジューリングされないためだと考えられる
|
43
|
347 </p>
|
|
348 <table>
|
|
349 <tr>
|
|
350 <th>CPU数</th>
|
66
|
351 <th>親和性機能なし</th>
|
|
352 <th>親和性機能あり</th>
|
43
|
353 </tr>
|
|
354 <tr>
|
|
355 <td>1</td>
|
66
|
356 <td>60.95 s</td>
|
|
357 <td>61.00 s</td>
|
43
|
358 </tr>
|
|
359 <tr>
|
|
360 <td>2</td>
|
66
|
361 <td>30.83 s</td>
|
|
362 <td>33.95 s</td>
|
43
|
363 </tr>
|
|
364 <tr>
|
|
365 <td>4</td>
|
66
|
366 <td>15.49 s</td>
|
|
367 <td>16.10 s</td>
|
43
|
368 </tr>
|
|
369 <tr>
|
|
370 <td>8</td>
|
66
|
371 <td>10.31 s</td>
|
|
372 <td>8.79 s</td>
|
43
|
373 </tr>
|
|
374 <tr>
|
|
375 <td>12</td>
|
66
|
376 <td>8.49 s</td>
|
|
377 <td>5.88 s</td>
|
43
|
378 </tr>
|
|
379 <tr>
|
|
380 <td>16</td>
|
66
|
381 <td>5.82 s</td>
|
|
382 <td>5.81 s</td>
|
43
|
383 </tr>
|
|
384 <tr>
|
|
385 <td>20</td>
|
66
|
386 <td>6.54 s</td>
|
|
387 <td>5.48 s</td>
|
43
|
388 </tr>
|
|
389 <tr>
|
|
390 <td>24</td>
|
66
|
391 <td>8.21 s</td>
|
|
392 <td>125.09 s</td>
|
43
|
393 </tr>
|
|
394 </table>
|
|
395 </p>
|
|
396 </article>
|
|
397
|
66
|
398 <article class='nobackground'>
|
31
|
399 <h3>
|
66
|
400 読み込みの性能計測
|
43
|
401 </h3>
|
|
402 <p>
|
66
|
403 親和性機能を使った場合、実コアの12スレッドまでほぼ線形にスケールする
|
43
|
404 </p>
|
|
405 <div align="center">
|
|
406 <img src="images/read.png" width="700px">
|
|
407 </div>
|
|
408 </article>
|
|
409
|
|
410 <article class="smaller">
|
|
411 <h3>
|
66
|
412 書き込みの性能計測
|
31
|
413 </h3>
|
33
|
414 <p>
|
43
|
415 木構造の書き込みにかかる時間を計測する
|
|
416 </p>
|
|
417 <p>
|
66
|
418 12 スレッドで親和性機能を使って実行した場合 3.82 倍の性能向上
|
43
|
419 </p>
|
67
|
420 <p>
|
|
421 読み込みと同様に親和性機能を使って24スレッドで実行すると実行時間が大幅に伸びる
|
|
422 </p>
|
43
|
423 <table>
|
|
424 <tr>
|
|
425 <th>CPU数</th>
|
66
|
426 <th>親和性機能なし</th>
|
|
427 <th>親和性機能あり</th>
|
43
|
428 </tr>
|
|
429 <tr>
|
|
430 <td>1</td>
|
66
|
431 <td>49.70 s</td>
|
|
432 <td>49.61 s</td>
|
43
|
433 </tr>
|
|
434 <tr>
|
|
435 <td>2</td>
|
66
|
436 <td>27.77 s</td>
|
|
437 <td>30.76 s</td>
|
43
|
438 </tr>
|
|
439 <tr>
|
|
440 <td>4</td>
|
66
|
441 <td>18.06 s</td>
|
|
442 <td>18.05 s</td>
|
43
|
443 </tr>
|
|
444 <tr>
|
|
445 <td>8</td>
|
66
|
446 <td>16.66 s</td>
|
|
447 <td>12.50 s</td>
|
43
|
448 </tr>
|
|
449 <tr>
|
|
450 <td>12</td>
|
66
|
451 <td>15.62 s</td>
|
|
452 <td>12.96 s</td>
|
43
|
453 </tr>
|
|
454 <tr>
|
|
455 <td>16</td>
|
66
|
456 <td>14.91 s</td>
|
|
457 <td>13.11 s</td>
|
43
|
458 </tr>
|
|
459 <tr>
|
|
460 <td>20</td>
|
66
|
461 <td>15.31 s</td>
|
|
462 <td>13.84 s</td>
|
43
|
463 </tr>
|
|
464 <tr>
|
|
465 <td>24</td>
|
66
|
466 <td>18.11 s</td>
|
|
467 <td>71.66 s</td>
|
43
|
468 </tr>
|
|
469 </table>
|
|
470 </p>
|
|
471 </article>
|
|
472
|
66
|
473 <article class='nobackground'>
|
43
|
474 <h3>
|
66
|
475 書き込みの性能計測
|
43
|
476 </h3>
|
66
|
477 <p>
|
|
478 4 倍程度で性能向上が頭打ちになっている
|
|
479 </p>
|
|
480 <p>
|
|
481 同時に書き込みがあった場合、STMが処理をやり直すため並列度が下がる
|
|
482 </p>
|
43
|
483 <div align="center">
|
|
484 <img src="images/write.png" width="700px">
|
|
485 </div>
|
|
486 </article>
|
|
487
|
|
488 <article>
|
|
489 <h3>
|
46
|
490 考察
|
43
|
491 </h3>
|
|
492 <p>
|
66
|
493 読み込みが高速
|
43
|
494 </p>
|
|
495 <p>
|
66
|
496 書き込みより読み込みが多用されるシステムに向いている
|
43
|
497 </p>
|
|
498 </article>
|
|
499
|
|
500 <article>
|
|
501 <h3>
|
66
|
502 Webサービスに組み込んでの性能計測
|
43
|
503 </h3>
|
|
504 <p>
|
66
|
505 Haskell の HTTP サーバ Warp と組み合わせて Web掲示板サービスを開発する
|
|
506 </p>
|
|
507 <p>
|
|
508 測定ツール weighttp を用いて掲示板に読み込みと書き込みで負荷をかける。
|
43
|
509 </p>
|
|
510 <p>
|
67
|
511 Warp は、ハイパースレッディングで明らかに遅くなるので使わない
|
33
|
512 </p>
|
66
|
513 </article>
|
|
514
|
|
515 <article class="nobackground">
|
|
516 <h3>
|
|
517 ネットワークのボトルネック
|
|
518 </h3>
|
|
519 <p>
|
|
520 ネットワークのボトルネックが大きい
|
|
521 </p>
|
|
522 <p>
|
|
523 並列環境でどのようにスケールするか計測したいため、ネットワークを介さずに性能計測を行う
|
|
524 </p>
|
|
525 <br>
|
|
526 <div align="center">
|
|
527 <img src="images/warp.png" width="600px">
|
|
528 </div>
|
31
|
529 </article>
|
|
530
|
|
531 <article>
|
|
532 <h3>
|
66
|
533 実験環境
|
43
|
534 </h3>
|
|
535 <p>
|
66
|
536 3 コアを測定ツール weighttp に使い、
|
|
537 8 コアを Web 掲示板サービスに使う
|
|
538 </p>
|
|
539 <br>
|
|
540 <div align="center">
|
|
541 <img src="images/request.png" width="400px">
|
|
542 </div>
|
|
543 </article>
|
|
544
|
|
545 <article>
|
|
546 <h3>
|
|
547 Webサービスに組み込んでの性能計測
|
|
548 </h3>
|
|
549 <p>
|
|
550 読み込みと書き込みの実験結果
|
43
|
551 </p>
|
|
552 <p>
|
66
|
553 1秒間あたりどれだけリクエストを捌けるかという指標で比較
|
|
554 大きければ大きいほど性能が良い
|
|
555 </p>
|
|
556 <p>
|
|
557 8 スレッドで実行時、読み込みは 6.18 倍、書き込みは3.93倍の性能向上
|
43
|
558 </p>
|
|
559 <table>
|
|
560 <tr>
|
|
561 <th>CPU数</th>
|
66
|
562 <th>読み込み</th>
|
|
563 <th>書き込み</th>
|
43
|
564 </tr>
|
|
565 <tr>
|
|
566 <td>1</td>
|
66
|
567 <td>22,624 req/s</td>
|
|
568 <td>28,552 req/s</td>
|
43
|
569 </tr>
|
|
570 <tr>
|
|
571 <td>2</td>
|
66
|
572 <td>43,083 req/s</td>
|
|
573 <td>53,765 req/s</td>
|
43
|
574 </tr>
|
|
575 <tr>
|
|
576 <td>4</td>
|
66
|
577 <td>92,548 req/s</td>
|
|
578 <td>98,691 req/s</td>
|
|
579 </tr>
|
|
580 <tr>
|
|
581 <td>6</td>
|
|
582 <td>119,310 req/s</td>
|
|
583 <td>99,009 req/s</td>
|
43
|
584 </tr>
|
|
585 <tr>
|
|
586 <td>8</td>
|
66
|
587 <td>139,965 req/s</td>
|
|
588 <td>112,212 req/s</td>
|
43
|
589 </tr>
|
|
590 </table>
|
|
591 </article>
|
|
592
|
66
|
593 <article class='nobackground'>
|
43
|
594 <h3>
|
66
|
595 Webサービスに組み込んでの性能計測
|
31
|
596 </h3>
|
43
|
597 <p>
|
66
|
598 Jungle 単体での実験結果と同じで、読み込みのほうがスケールする
|
43
|
599 </p>
|
66
|
600 <div align="center">
|
|
601 <img src="images/bbs.png" width="700px">
|
|
602 </div>
|
43
|
603 </article>
|
|
604
|
|
605 <article>
|
|
606 <h3>
|
66
|
607 Java との比較
|
43
|
608 </h3>
|
66
|
609 <p>
|
|
610 HaskellとJavaで同様のWeb掲示板サービスを用意する
|
|
611 </p>
|
|
612 <p>
|
|
613 実環境を想定して、ブレードサーバ2台用意し、ネットワークを介して負荷をかける
|
|
614 </p>
|
|
615 <p>
|
|
616 100 万リクエストを処理するのにかかる時間を計測
|
|
617 </p>
|
43
|
618
|
|
619 <table>
|
|
620 <tr>
|
|
621 <th>測定</th>
|
|
622 <th>Haskell</th>
|
|
623 <th>Java</th>
|
|
624 </tr>
|
|
625 <tr>
|
|
626 <td>読み込み</td>
|
66
|
627 <td>16.31 s</td>
|
43
|
628 <td>53.13 s</td>
|
|
629 </tr>
|
|
630 <tr>
|
|
631 <td>書き込み</td>
|
66
|
632 <td>20.17 s</td>
|
43
|
633 <td>76.4 s</td>
|
|
634 </tr>
|
|
635 </table>
|
|
636 <p>
|
66
|
637 読み込みで 3.25 倍、書き込みで 3.78 倍の性能差
|
43
|
638 </p>
|
|
639 <p>
|
66
|
640 Haskell は実用的なWebサービスを開発できる
|
46
|
641 </p>
|
|
642 </article>
|
|
643
|
|
644 <article>
|
|
645 <h3>
|
66
|
646 Java との比較 - 生産性
|
46
|
647 </h3>
|
|
648 <p>
|
66
|
649 生産性の面からも Java との比較を行う
|
46
|
650 </p>
|
|
651 <p>
|
66
|
652 Haskell 版 Jungle は 284 行、
|
|
653 Java 版 Jungle は 3,390 行
|
|
654 </p>
|
|
655 <p>
|
|
656 実装が 1/12 程度のサイズとなっている
|
|
657 </p>
|
|
658 <p>
|
67
|
659 再帰的なデータ型の定義ができることや、関数の再利用が行いやすいことが要因
|
66
|
660 </p>
|
|
661 <p>
|
|
662 同じ機能を実装する場合でも、Haskell は Java と比較してコード行数が短くなる
|
43
|
663 </p>
|
31
|
664 </article>
|
|
665
|
|
666 <article>
|
|
667 <h3>
|
|
668 まとめ
|
|
669 </h3>
|
45
|
670 <p>
|
|
671 純粋関数型言語 Haskell を用いて並列データベースの実装をおこなった
|
|
672 </p>
|
|
673 <p>
|
66
|
674 読み込みに関して 12 コアで実行した場合、10.37 倍 という性能向上率が確認できた
|
45
|
675 </p>
|
|
676 <p>
|
66
|
677 また、Web 掲示板サービスを開発し、Java と比較して読み込みで 3.25 倍、書き込みで 3.78 倍の性能が確認できた
|
45
|
678 </p>
|
|
679 </article>
|
|
680
|
|
681 <article>
|
|
682 <h3>
|
|
683 今後の課題
|
|
684 </h3>
|
|
685 <p>
|
46
|
686 書き込み処理の性能向上
|
45
|
687 </p>
|
|
688 <p>
|
|
689 分散データベースとしての実装
|
|
690 </p>
|
|
691 <p>
|
|
692 永続性の実装
|
|
693 </p>
|
31
|
694 </article>
|
|
695
|
68
|
696 <article>
|
|
697 <h3>
|
|
698 GHC 7.6.3 の IO マネージャーの問題
|
|
699 </h3>
|
|
700 <p>
|
|
701 GHC 7.6.3 には 並列実行時に IO マネージャーがスケールしないという問題がある
|
|
702 </p>
|
|
703 <div align="center">
|
|
704 <img src="images/ghc.png" width="700px">
|
|
705 </div>
|
|
706 </article>
|
|
707
|
31
|
708 </body>
|
|
709 </html>
|