changeset 12:500bcb11d251

add server setting
author Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
date Wed, 29 Jan 2014 21:46:00 +0900
parents 31df2d4d0e9c
children 17676e245515
files paper/chapter4.tex paper/master_paper.bib paper/master_paper.pdf paper/master_paper.tex
diffstat 4 files changed, 165 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/paper/chapter4.tex	Tue Jan 28 18:16:32 2014 +0900
+++ b/paper/chapter4.tex	Wed Jan 29 21:46:00 2014 +0900
@@ -1,8 +1,147 @@
 \chapter{ベンチマーク}\label{ch:bench}
-前章では木構造データベース Jungle の利用方法及び詳細な実装について述べた。
-本章では、まず始めに木構造データベース Jungle の読み込みと書き込みの性能の計測を行う。
-次に簡単な掲示板システムを作成し、既存の Java の並列データベースの実装との性能比較を行う。
-また、Web アプリケーションの性能計測の際の諸注意について述べる。
+本章では、非破壊的木構造データベース Jungle の読み込みと書き込みの性能の計測を行う。
+また、簡単な掲示板ウェブアプリケーションを作成し、Java を用いた非破壊的木構造データベースとの性能比較を行う。
+
+\section{実験環境の構築}
+学科が提供するブレードサーバを用いて、実験環境を構築する。
+ブレードサーバの仕様を表\ref{tab:server_spec}に示す。
+
+\begin{table}[!htbp]
+\caption{学科が提供するブレードサーバの仕様}
+\label{tab:server_spec}
+\begin{center}
+\begin{tabular}{|c||c|} \hline
+名前 & 概要 \\ \hline \hline
+CPU & Intel(R) Xeon(R) CPU X5650@2.67GHz * 2\\ \hline
+物理コア数 & 12 \\ \hline
+論理コア数 & 24 \\ \hline
+Memory & 126GB \\ \hline
+OS & Fedora 14 \\ \hline
+\end{tabular}
+\end{center}
+\end{table}
+
+非破壊的木構造データベース Jungle の読み込みと書き込みの性能の計測には1台、
+簡単な掲示板ウェブアプリケーションを用いた Java との性能比較には2台のブレードサーバを利用する。
+2台使用するのは、サーバと負荷をかけるクライアントを別々に実行するためである。
+
+\subsubsection{Haskell および Java のバージョン}
+Haskell のコンパイラには The Glasgow Haskell Compiler(GHC)を使用する。
+GHC は、Haskell で最も広く使われているコンパイラである。
+ソフトウェア・トランザクショナル・メモリをサポートするなど、並列プログラミングのためのHaskellの拡張が行われている。
+
+Haskell および Java のバージョンを表\ref{tab:compiler}に示す。
+
+\begin{table}[!htbp]
+\caption{ベンチマークで利用したHaskellとJavaのバージョン}
+\label{tab:compiler}
+\begin{center}
+\begin{tabular}{|c||c|} \hline
+言語 & バージョン \\ \hline \hline
+Haskell & Glasgow Haskell Compiler, Version 7.6.3 \\ \hline
+Java & Java(TM) SE Runtime Environment (build 1.7.0\_51-b13) \\ \hline
+\end{tabular}
+\end{center}
+\end{table}
+
+\subsubsection{サーバのチューニング}
+ウェブアプリケーションのベンチマークを行う際、サーバの設定に注意を払う必要がある。
+適切に設定を行わないと、サーバがボトルネックとなってしまい正しい結果が得られない。
+ウェブアプリケーションのベンチマークを行う際の注意点について述べる。
+
+データを受信したり送信したりするのは OS カーネルである。
+多くの TCP パケットを要求し、各パケットのサイズが1500バイトといった大きなファイルを提供する場合、
+ウェブアプリケーションというよりOSカーネルのテストになってしまう。
+
+接続には、HTTP Keep-Alivesを利用する。
+新しい TCP 接続を確立するのはとても遅く、OS カーネルによって行われる。
+毎秒多くの新しい接続を作成するようなベンチマークを行うと、OSカーネルのテストとなってしまう。
+
+アプリケーションやOSカーネルが完全にハードウェアを使用できるようにするためにいくつか調整を行う必要がある。
+最初の問題は、ファイル記述子の欠如である。
+デフォルトはプロセスあたり、1,024 files で非常に貧弱な結果しか得られない。
+ファイル記述子の現在のリミットは以下のコマンドで取得できる。
+
+\begin{lstlisting}[caption=ファイル記述子のリミットの取得]
+$ ulimit -aH 
+\end{lstlisting}
+
+リミットを変更するには、以下のコマンドを実行する。
+
+\begin{lstlisting}[caption=ファイル記述子のリミットの設定]
+$ sudo sh -c ulimit -HSn 200000
+\end{lstlisting}
+
+再起動後も有効にするためには、システムファイルの編集を行う。\\
+/etc/security/limits.conf へ以下の記述を追加する。
+
+\begin{lstlisting}[caption=リミットの設定の追加]
+ * soft nofile 200000
+ * hard nofile 200000
+\end{lstlisting}
+
+次に問題となるのは listenキューの制限である。
+listen キューとは、保留中のコネクションが繋がれるキューのことである。
+このキューの長さの制限が小さいと、同時にたくさんのコネクション要求がきた場合、制限を超えた要求を拒否する。
+listen キューや、その他の設定も含めてベンチマーク用にサーバの設定を変更する。\\
+/etc/sysctl.conf に以下の記述を追加する。
+
+\begin{lstlisting}[caption=システム設定の変更]
+fs.file-max = 5000000
+net.core.netdev_max_backlog = 400000
+net.core.optmem_max = 10000000
+net.core.rmem_default = 10000000
+net.core.rmem_max = 10000000
+net.core.somaxconn = 100000
+net.core.wmem_default = 10000000
+net.core.wmem_max = 10000000
+net.ipv4.conf.all.rp_filter = 1
+net.ipv4.conf.default.rp_filter = 1
+net.ipv4.ip_local_port_range = 1024 65535
+net.ipv4.tcp_congestion_control = bic
+net.ipv4.tcp_ecn = 0
+net.ipv4.tcp_max_syn_backlog = 12000
+net.ipv4.tcp_max_tw_buckets = 2000000
+net.ipv4.tcp_mem = 30000000 30000000 30000000
+net.ipv4.tcp_rmem = 30000000 30000000 30000000
+net.ipv4.tcp_sack = 1
+net.ipv4.tcp_syncookies = 0
+net.ipv4.tcp_timestamps = 1
+net.ipv4.tcp_wmem = 30000000 30000000 30000000    
+net.ipv4.tcp_tw_reuse = 1
+net.ipv4.tcp_tw_recycle = 1
+\end{lstlisting}
+
+ファイルを保存後、設定を反映させるには以下のコマンドを実行する。
+
+\begin{lstlisting}[caption=設定の反映]
+$ sudo sysctl -p /etc/sysctl.conf
+\end{lstlisting}
+
+ベンチマークを行う際、小さなテストでは妥当性が低くなってしまうので注意する。
+TCP/IPのスタックは保守的な方法で動作し、ダウンロード速度に合わせて徐々に速度を増大させるためである。
+
+また、テストするサーバより遅いベンチマーククライアントを用いると正しい結果は得られない。
+シングルスレッドで稼働したり、Ruby や Python といった低速なベンチマークツールでテストを行うと、
+すべてのテストする対象が同じようなパフォーマンスを持っているように見えてしまう。
+
+\subsubsection{weighttp}
+ウェブアプリケーションの性能測定には、weighttpを用いる。
+weighttpはWebサーバの性能測定ツールで、マルチコアCPUを使ってテストできる。
+また、livev を使うことで、モダンなポール・システムコールを利用し、測定性能を向上できるといった特徴を持つ。
+同様の性能測定ツールには、Apache Benchやhttprefが存在するが非力であり、ボトルネックとなってしまうため使用しない。
+
+weighttp を起動するには、以下の様にコマンドを入力する。
+\begin{lstlisting}[caption=weighttpの起動]
+$ weighttp -n 1000000 -c 1000 -t 10 -k "http://bldsv12.cr.ie.u-ryukyu.ac.jp:3000"
+\end{lstlisting}
+
+\begin{itemize}
+ \item n ... HTTP リクエストの総数
+ \item c ... 同時に接続するコネクションの数
+ \item t ... 作製するネイティブスレッドの数
+ \item k ... HTTP Keep-Alives を有効にする
+\end{itemize}
 
 \section{並列読み込み}
 木構造データベース Jungle の並列読み込みの実験を行う。
@@ -16,21 +155,6 @@
 実験を行うサーバの仕様について表\ref{tab:server_spec_1}に示す。
 Haskell のコンパイラには、The Glasgow Haskell Compiler (GHC) の 7.63 を使用する。
 
-\begin{table}[!htbp]
-\caption{実験を行うサーバの仕様}
-\label{tab:server_spec_1}
-\begin{center}
-\begin{tabular}{|c||c|} \hline
-名前 & 概要 \\ \hline \hline
-CPU & Intel(R) Xeon(R) CPU X5650@2.67GHz * 2\\ \hline
-物理コア数 & 12 \\ \hline
-論理コア数 & 24 \\ \hline
-Memory & 126GB \\ \hline
-OS & Fedora 14 \\ \hline
-GHC & 7.63 \\ \hline
-\end{tabular}
-\end{center}
-\end{table}
 
 \subsubsection{実験結果}
 並列読み込みの実験結果を表\ref{tab:par_read}に示す。
@@ -59,6 +183,7 @@
 \section{並列書き込み}
 木構造データベース Jungle の並列書き込みの実験を行う。
 \subsubsection{実験方法}
+
 12コア CPU のマシン上で、プログラムを実行するコア数を変更しながら並列に書き込む実験を行う。
 木構造データベース Jungle を利用し、1000個ほどの子を持つ木構造を並列に作成する。
 木構造を作成するTaskの数は1000であり、それを各コアで分割して実行する。
--- a/paper/master_paper.bib	Tue Jan 28 18:16:32 2014 +0900
+++ b/paper/master_paper.bib	Wed Jan 29 21:46:00 2014 +0900
@@ -53,6 +53,12 @@
   note = "[Online; accessed 19-July-2013]"
 }
 
+@misc{ghc,
+  title = {The Glasgow Haskell Compiler},
+  howpublished = "\url{http://www.haskell.org/ghc/}",
+  note = "[Online; accessed 29-Jan-2014]"
+}
+
 @misc{deos,
   title = {DEOS},
   howpublished = "\url{http://www.dependable-os.net/osddeos/data.html}",
Binary file paper/master_paper.pdf has changed
--- a/paper/master_paper.tex	Tue Jan 28 18:16:32 2014 +0900
+++ b/paper/master_paper.tex	Wed Jan 29 21:46:00 2014 +0900
@@ -8,11 +8,23 @@
 
 \lstset{
     language=Haskell,%プログラミング言語によって変える。
-    basicstyle={\ttfamily\footnotesize},
     tabsize=2,
     frame=single,
-    breaklines=true,%折り返し
-    captionpos=b
+    basicstyle={\footnotesize},%
+    identifierstyle={\footnotesize},%
+    commentstyle={\footnotesize\itshape},%
+    keywordstyle={\footnotesize\bfseries},%
+    ndkeywordstyle={\footnotesize},%
+    stringstyle={\footnotesize\ttfamily},
+    breaklines=true,
+    columns=[l]{fullflexible},%
+    numbers=left,%
+    xrightmargin=0zw,%
+    xleftmargin=1zw,%
+    numberstyle={\scriptsize},%
+    stepnumber=1,
+    numbersep=0.5zw,%
+    lineskip=-0.5ex%
 }
 
 \input{font.sty}