Haskellによる非破壊的木構造を用いたCMSの実装
Daichi TOMA
Sep 13, 2013
はじめに
本研究室では非破壊的木構造データベース Jungle の開発を行っている。
非破壊的木構造は、通常の木構造と違い、木構造自体を破壊せずに編集を行うことが可能である。
Jungle には、既に Java による実装があるが、本研究ではHaskellによる再実装を行った。
その結果、Java 版と同程度の性能を得ることができた。また、Java 版の実装と比較し、開発期間及びコード行数の短縮ができた。
非破壊的木構造データベース Jungle
非破壊的木構造を取り扱うデータベースである。
既に Java による実装が存在する。
特徴を以下に示す。
- 複数の非破壊的木構造を扱える
- 編集者は、提供されるAPIを利用して編集を行う
破壊的木構造
- 木構造で保持するデータを直接書き換える
- 編集および参照する際にロックを行う必要がある
ロックを行わなければ、参照中に他の編集者が編集してしまうと、整合性がなくなってしまう。
図を入れる。見やすいように線とか太くする。
非破壊的木構造
- 元の木構造を書き換えることなく、編集を行う
- ルートノードの更新以外にロックは必要ない
参照中に他の編集者が編集してしまっても、整合性がなくなることはない。
図を入れる。見やすいように線とか太くする。
非破壊的木構造の特徴
非破壊的木構造は、破壊的木構造と異なり以下の利点がある。
- 一度作成された木構造は破壊されることがない
- 破壊されることがないため、自由にコピーを行っても構わない
- 自由にコピーを行なっても構わないのでロックを必要としない
ロックを必要とせず、自由にコピーを行えるため、スケーラブルなシステムに有用である。
Haskell
Haskell は、純粋関数型プログラミング言語である。
変数への代入は一度のみで、書き換えることはできない。
非破壊的木構造は変数への代入が発生しないことから、関数型言語と相性が良いと考えられる。
そのため、Haskell を用いて再実装を行った。
性能評価
非破壊的木構造データベース Jungle を用いて簡易掲示板システムを作成し、既存の Java 版との性能比較を行った。
Haskell 版 Jungle の HTTP サーバには、Haskell によって書かれた Warp を用いた。
Java 版 Jungle の HTTP サーバには、Jetty を用いた。
実験方法
- 複数のクラスタを利用して、サーバに対して並列にアクセスを5000回行い、それぞれクラスタの実行平均時間をとる
- クラスタの台数を増やすことにより負荷を上昇させる
- 測定するのは書き込みと読み込みであり、 掲示板のメッセージの取得と掲示板のメッセージの編集を行う
実験環境
xeon使ったよーとか
実験結果
ほぼ同じぐらい
並列実行
- Haskell 版 Jungle では、並列実行に問題を抱えている
- 複数のスレッドが立ち上がり、並列実行していることは確認したが、シングルコアで実行した場合と比較して実行結果が遅くなる
並列実行
- 本研究とは別に、簡単な例題を並列で動かした場合でも期待する実行速度の向上は得られなかった。並列処理で速度向上を達成することは今後の課題である
遅延評価
- Haskell は遅延評価を行うが、書き込みの際に問題が生じる
- 何かしらの結果を表示するまで、簡約可能な式の状態で積まれたままとなる
- その際メモリを消費し、効率のよい領域に入りきらないサイズになると非常に実行結果が遅くなる
遅延評価
- 評価を行ったあとに実行時間がどのように変わるかを示すために、実験方法を変更した。クラスタ台数を変更する際に10台増やすごとに一度読み込みを挟むようにした。書き込みを繰り返すと実行時間が悪化し、読み込み後、急激に実行時間が下がる。
- 読み込みの際には、数万回以上の書き込みを処理するため数秒から数十秒かかる
- 書き込みは、インクリメントしている値を書き込んでいるが順序などは正しく処理できている
- この問題を解決するために、全て遅延評価するのではなく、適切な箇所で即時評価を行うことで領域効率を改善する必要がある
まとめ
- Haskell による非破壊的木構造を用いた CMS の実装を行った。
- 木構造データベース Jungle と、HTTP サーバ Warp を用いて、簡易掲示板システムを開発し、既存の Java の実装と同程度の性能を達成できた
- Java の実装と比較して開発期間およびコード行数は非常に短くなった。
今後の課題
- マルチスレッドで実行した際の実行速度の向上
- 書き込みの際に、遅延評価のためにメモリを多く使用する問題がある。いくつかの式を即時評価するように変更し、領域効率の改善を計る。
- 木構造を永続化する仕組みの実装
- 分散環境でJungleを効率よく利用するために、木構造をマージする仕組みを実装