# HG changeset patch # User Daichi TOMA # Date 1391108684 -32400 # Node ID 729ec8d5a16dd5017376dcaa232127c6d4b6850a # Parent 17676e245515b24db02658809089ec3c936ea24d finish benchmark chapter diff -r 17676e245515 -r 729ec8d5a16d paper/chapter4.tex --- a/paper/chapter4.tex Thu Jan 30 17:29:07 2014 +0900 +++ b/paper/chapter4.tex Fri Jan 31 04:04:44 2014 +0900 @@ -252,13 +252,11 @@ 非破壊的木構造データベース Jungle は、書き込みは並列化率が低くなってしまい並列実行に向いていない。 読み込みが高速なため、書き込みより読み込みが多用されるシステムに向いているといえる。 -ブログや、Wiki、SNSなどはそうしたシステムである。 -本研究では、簡単な掲示板ウェブアプリケーションを開発しての実験も行った。 - \clearpage \section{ウェブアプリケーションに組み込んでの性能評価} +\subsection{簡単な掲示板ウェブアプリケーションの実装} \subsubsection{簡単な掲示板ウェブアプリケーション} 木構造データベース Jungle と Haskell の HTTP サーバ Warp を用いて簡易掲示板システムを作成する。 @@ -266,6 +264,7 @@ Warp は、軽量・高速な HTTP サーバである。 Haskell の軽量スレッドを活かして書かれている。 Haskell のウェブフレームワークである Yesod のバックエンドとして用いられており、現在も開発が続けられている。 +Warp のバージョンは 2.0.2 を用いる。 Warp を用いてウェブアプリケーションを構築する方法について説明する。 @@ -330,53 +329,124 @@ \end{center} \end{table} +\subsection{読み込み} +\subsubsection{計測方法} +掲示板に対して読み込みを行い、負荷をかける。 +掲示板を立ち上げるサーバと、weighttpを用いて負荷をかけるサーバの 2 台ブレードサーバを用いて測定を行った。 -\subsection{読み込み} -\subsection{書き込み} -\subsection{Javaを用いた非破壊的木構造データベースとの比較} -\subsubsection{評価方法} -Warp とは ~~ である。 -10スレッドから、1スレッドあたり100並列に1000回リクエストを投げる。 -負荷をかけるマシンおよび、かけられるマシンは共に12コアのコア数の多いマシンを用いる。 +weighttpの起動時のオプションは以下の通りである。 +リクエストの総数は 100 万、同時に接続するコネクションの数は 1,000、実行時のスレッド数は10、HTTP Keep-Alivesを有効とする。 +\begin{lstlisting}[caption=weighttpの起動時のオプション] +weighttp -n 1000000 -c 1000 -t 10 -k "http://bldsv12.cr.ie.u-ryukyu.ac.jp:3000/showBoardMessage?bname=hello" +\end{lstlisting} + +HTTP サーバ Warp は、ハイパースレッディングの効果がなくハイパースレッディング利用時に遅くなるため、12 スレッドまでの計測とする。 + +\subsubsection{計測結果} + +掲示板の読み込みの計測結果を表\ref{tab:bbs_read}に示す。 -\subsubsection{実験結果} +並列で実行した場合、実行時間が短くなっているが性能向上率が低いことが分かる。 +これは HTTP サーバ Warp がボトルネックとなってしまっているためだと考えられる。 -読み込みが止まってしまう時、1秒あたり35000 reqほど -webサーバのボトルネックにかかってる? +Warp を用いてアクセスした際に、"hello, world"と返すだけのプログラムを作成し測定する。 +結果を表\ref{tab:warp}に示す。 +1 スレッドで実行した場合は、Jungle と組み合わせた掲示板より速い。 +しかしながら、スレッド数が増えていくと掲示板の読み込みとあまり結果が変わらなくなってしまう。 + +ウェブアプリケーションを用いて実験する場合、データベースだけがボトルネックとなるように負荷をかけるのは難しい。 +ただ単にデータを大きくするだけでは、文字列をHTMLに変換するコストが大きくなってしまうためである。 + \begin{table}[!htbp] -\caption{読み込み} -\label{tab:par_write2} +\caption{掲示板を利用した読み込みの計測結果} +\label{tab:bbs_read} \begin{center} \begin{tabular}{|c||r|} \hline CPU数 & 実行時間 \\ \hline -1 コア& 60.78 s\\ \hline -2 コア& 37.19 s\\ \hline -4 コア& 26.87 s\\ \hline -6 コア& 28.61 s\\ \hline -8 コア& 28.21 s\\ \hline -10 コア& 28.60 s\\ \hline -12 コア& 28.46 s\\ \hline -24 コア& 51.31 s\\ \hline +1 & 60.72 s\\ \hline +2 & 37.74 s\\ \hline +4 & 28.97 s\\ \hline +8 & 27.73 s\\ \hline +12 & 28.33 s\\ \hline \end{tabular} \end{center} \end{table} \begin{table}[!htbp] -\caption{書き込み} -\label{tab:par_write3} +\caption{Warpの計測結果} +\label{tab:warp} \begin{center} \begin{tabular}{|c||r|} \hline CPU数 & 実行時間 \\ \hline -1 コア& 54.16 s\\ \hline -2 コア& 36.71 s\\ \hline -4 コア& 31.74 s\\ \hline -6 コア& 32.76 s\\ \hline -8 コア& 31.58 s\\ \hline -10 コア& 32.64 s\\ \hline -12 コア& 32.68 s\\ \hline -24 コア& 73.84 s\\ \hline +1 & 49.28 s\\ \hline +2 & 35.45 s\\ \hline +4 & 25.70 s\\ \hline +8 & 27.90 s\\ \hline +12 & 29.23 s\\ \hline \end{tabular} \end{center} \end{table} -ただのpingpongとそんなに変わらない… +\subsection{書き込み} +\subsubsection{計測方法} +掲示板に対して書き込みを行い、負荷をかける。 +掲示板を立ち上げるサーバと、weighttpを用いて負荷をかけるサーバの 2 台ブレードサーバを用いて測定を行った。 + +weighttpでは、GET しかできないためURLのクエリ文字列でデータを書き込めるように掲示板ウェブアプリケーションを変更した。 +weightttp起動時のオプションは、読み込みと同じである。 +\subsubsection{計測結果} + +掲示板の書き込みの計測結果を表\ref{tab:bbs_write}に示す。 +並列で実行した場合、実行時間が短くなっているが性能向上率が低いことが分かる。 +これも HTTP サーバ Warp がボトルネックとなってしまっているためだと考えられる。 + +\newpage +\begin{table}[!htbp] +\caption{掲示板を利用した書き込みの計測結果} +\label{tab:bbs_write} +\begin{center} +\begin{tabular}{|c||r|} \hline +CPU数 & 実行時間 \\ \hline +1 & 54.16 s\\ \hline +2 & 36.71 s\\ \hline +4 & 31.74 s\\ \hline +8 & 31.58 s\\ \hline +10 & 32.64 s\\ \hline +12 & 32.68 s\\ \hline +\end{tabular} +\end{center} +\end{table} + +\subsection{Javaを用いた非破壊的木構造データベースとの比較} +非破壊的木構造データベースは、Haskell 版と Java 版の2つ存在する。 +簡単な掲示板ウェブアプリケーションを両方の言語で実装し、比較を行う。 +Haskell ではフロントエンドとして Warp を利用したが、Java では Jetty を利用する。 +Jetty のバージョンは 6.1.26 を用いる。 + +Haskell 版と Java 版の簡単な掲示板ウェブアプリケーションをブレードサーバ上で実行し、 +weightttpで負荷をかけ100万リクエストを処理するのにかかる時間を計測する。 +Haskell と Java の測定結果を表\ref{tab:compare}に示す。 + +\begin{table}[!htbp] +\caption{HaskellとJavaの比較} +\label{tab:compare} +\begin{center} +\begin{tabular}{|c||r|r|} \hline + 測定 & Haskell & Java \\ \hline \hline + 読み込み & 28.33 s & 55.63 s \\ \hline + 書き込み & 32.68 s & 76.4 s \\ \hline +\end{tabular} +\end{center} +\end{table} + +Haskell 版は、Java 版と比較して読み込みで 1.96 倍、書き込みで 2.3 倍の性能が出ている。 + +書き込みが読み込みより性能差が出ている理由として遅延評価が考えられる。 +Haskell では書き込みを行う際、完全に評価せず thunk として積み上げていく。 +thunkとは、未評価の式を追跡するのに使われるものである。 +遅延評価は、グラフ簡約があるため先行評価より簡約ステップ数が増えることはない。 +また、不要な計算が省かれるので簡約ステップ数が少なくなることもある。 +しかしながら、計算の所用領域が増えてしまうのが難点で、 +ハードウェアが効率的に利用できるメモリの範囲内に収まらなければ即時評価より実行時間が遅くなってしまうことがあるので注意が必要である。 +本実験では、潤沢にメモリを割り当てているためそういった問題は起きない。 + diff -r 17676e245515 -r 729ec8d5a16d paper/master_paper.pdf Binary file paper/master_paper.pdf has changed diff -r 17676e245515 -r 729ec8d5a16d paper/master_paper.tex --- a/paper/master_paper.tex Thu Jan 30 17:29:07 2014 +0900 +++ b/paper/master_paper.tex Fri Jan 31 04:04:44 2014 +0900 @@ -29,7 +29,7 @@ \input{font.sty} -\jtitle{関数型言語 Haskell による並列データベースの設計と実装} +\jtitle{関数型言語 Haskell による並列データベースの実装} \etitle{} \year{平成26年度} \affiliation{\center% @@ -48,7 +48,7 @@ \end{minipage}} \markleftfoot{% 左下に挿入 \begin{minipage}{.8\textwidth} - 関数型言語 Haskell による並列データベースの設計と実装 + 関数型言語 Haskell による並列データベースの実装 \end{minipage}} \newcommand\figref[1]{図 \ref{fig:#1}}