- 関数型言語 Haskell による並列データベースの実装 -
+関数型言語 Haskell による並列データベースの実装
Daichi TOMA
@@ -48,141 +46,69 @@
# HG changeset patch
# User kono
# Date 1392260904 -32400
# Node ID 0b1a059c49fa45fde7e434faec64e511cd3fcbac
# Parent 5e39ab004ae02c9204374ea8438c9da25178a167
fix
diff -r 5e39ab004ae0 -r 0b1a059c49fa slides/master.html
--- a/slides/master.html Thu Feb 13 11:17:15 2014 +0900
+++ b/slides/master.html Thu Feb 13 12:08:24 2014 +0900
@@ -38,9 +38,7 @@
slides below. -->
Daichi TOMA
- Haskell を用いて並列データベースを実装した
-
- 読み込みに関して 12 コアで実行した場合、10.37 倍 という性能向上率が確認できた
-
- また、Web 掲示板サービスを開発し、Java と比較して読み込みで 3.25 倍、書き込みで 3.78 倍の性能差が確認できた
-
- Web サービスの脆弱性を悪用されると多大な被害がでる
-
- Haskell は型検査でバッファオーバーフローや、クロスサイトスクリプティング、SQL インジェクションを防げる
-
- Haskell を用いることで信頼性の高いデータベースとWebサービスを開発できる
- Haskell を用いて信頼性の高い並列データベースを実装した Haskell は rseq により並列実行を指示し、STMにより共有データを実現する Haskellの並列処理は、最新のコンパイラで性能がでることがわかった 読み込みに関して 12 コアで実行した場合、10.37 倍 という性能向上率が確認できた Web 掲示板サービスを開発し、Java と比較して読み込みで 3.25 倍、書き込みで 3.78 倍の性能差が確認できた Network および IO の並列性能はあまり出てないことがわかった
- Haskellは、全てに型がある
-
- 文字列やHTMLを型として定義し、別の型として扱うことができる
-
- 入力として受け取った文字列が、HTML型に自動変換されたりしない Web サービスの脆弱性を悪用されると多大な被害がでる 脆弱性の大半はBuffer Overflowや、Cross site scripting、SQL injection これらは型エラー。Haskell は、これらをコンパイル時にチェック 入力として受け取った文字列が、HTML型に実行時に自動変換されたりしない
- Haskellは、実行時に型に起因するエラーが起きない
-
- [1,2,3]のリストに文字'a'を追加することや、['a','b','c']のリストに 1 を追加することはできない
-
- コンパイル時にエラーになる
-
- Haskell 自体が型の不整合を防ぐ
-
- 型エラーを検出するために全ての式や関数に型を書いていくのは大変
-
- Haskell は 型を推論してくれる
-
- 前提として関数に以下のような型が定義されている
- 前提として関数に以下のような型が定義されているとする
- 新しくgetChildrenという関数を定義するとき型を自動で導出できる
- 新しくgetChildrenという関数を定義する
- Haskell が推論した型を確認する
- 型をHaskellが自動で導出する
- 現在、CPU はマルチコア化がすすんでいる
-
- 実用的なデータベースとするためにはマルチコアに対応させる必要性がある
-
- 並列に処理できればマルチコアで性能が出る
- 現在、CPU はマルチコア化がすすんでいる 実用的なデータベースとするためにはマルチコアに対応させる必要性がある 並列に処理できればマルチコアで性能が出る Haskell は Eval モナド(rpar)といったモナドで並列実行の機能を提供 モナドは、Haskellでメタ計算を提供する構文あるいはAPI システムコールのようなものと考えてよい モナドの例:IOモナド、エラーモナド、STMモナド
- Eval モナドといったモナドで並列実行の機能を提供
-
- Haskell では様々な目的にモナドを使う
- 非破壊的木構造の並列実行のネックとなるものがルートノード
-
- ルートノードは、どの木構造が最新なのかを表す情報
-
- スレッド間で共有する状態を持つため、並列度を高めるにはルートノードの設計が重要
-
- ソフトウェア・トランザクショナル・メモリ (STM) を使う
-
- STM は、ノンブロッキングで共有データを扱える
-
- 共有データの変更は以下の様に行われる
- Root Node は最新のNode → 状態を持つ 共有された状態を作るには Software Transactional Memory (STM) を使う STM は、ノンブロッキングで共有データを扱える 共有データの変更は以下の様に行われる
- 共有データにアクセスする時に待ちがない
-
- 読み込みは他の変更を気にせず並列に行える
-
- 高速に読み込める
-
- Tree は最新のルートノードの情報と木の名前を持っている
-
- 関数型言語 Haskell による並列データベースの実装
-
+ 関数型言語 Haskell による並列データベースの実装
@@ -48,141 +46,69 @@
- 研究概要
-
-
- 研究背景
-
- 研究概要
+
- 型による区別
-
-
- - > クロスサイトスクリプティングが防げる
- Haskellによる信頼性の高いサービスの構築
+
+ ⇒ クロスサイトスクリプティングが防げる
- 実行時型エラーがない
-
- Haskellの型検査の例(list)
+ :
+ / \
+ 1 []
-abc = 'a' : [1,2,3] -- error
-cde = 1 : ['a','b','c'] -- error
+let a = 0 : [1,2,3] -- [0,1,2,3]
+let b = 'a' : [1,2,3] -- error
+let c = 1 : ['a','b','c'] -- error
-
- 型推論
-
-
- 型推論
-
- 型推論
+
getNode :: Node -> Path -> Node
elems :: Map k a -> [a]
children :: Node -> Map Int Node
-
getChildren node path = elems (children (getNode node path))
-
*Jungle> :type getChildren
getChildren :: Node -> Path -> [Node]
- 実用的なデータベースの開発
-
- 実用的なデータベースには並列実行が必須
+
- Haskell での並列実行
-
-
- I/O 処理を行うための IO モナドはよく使われる
-
Haskell の遅延評価
@@ -248,57 +174,19 @@
- 非破壊的木構造 - ルートノード
-
- Haskell でのRoot Node の管理
-
- Haskell でのルートノードの管理
-
-
-
- STM のメリット
-
-
@@ -339,22 +227,6 @@
- Jungle に新しい木を作成
-
-
-data Tree = Tree (TVar Node) String
-
-
-
-
@@ -371,42 +243,26 @@
- Jungle で最も基本的な構成要素 -
-- Jungle の参照や変更の関数は全てノードに対して行う -
--data Node = Node (Map Int Node) (Map String ByteString) -+
Node はChildren(Node)とattributesを持つ
+Jungle の参照や変更の関数は全てノードに対して行う
- updateRootNodeやupdateRootNodeWithで更新できる -
+updateRootNodeやupdateRootNodeWithで更新できる
+内部でSTMを使っているのでIOモナドを返す
updateRootNode :: Jungle -> String -> Node -> IO () updateRootNodeWith :: (Node -> Node) -> Jungle -> String -> IO ()-
- updateRootNodeには編集したNodeを渡すことで木の最新のルートノードを更新できる -
-- updateRootNodeWithにはNodeを編集する関数を渡すことで木の最新のルートノードを更新できる -
-updateRootNodeには編集したNodeを渡すことで木の最新のルートノードを更新できる
+updateRootNodeWithにはNodeを編集する関数を渡すことで木の最新のルートノードを更新できる
+- リリース候補版である 7.8 を用いる + リリース候補版である 7.8 を用いることにより、よりよい性能を得ることができた
親和性機能とは OS スレッドをCPUコアに固定する機能