Mercurial > hg > Papers > 2018 > suruga-thesis
view paper/final_main/chapter3.tex @ 11:d32ba99c8ed5
fix
author | suruga |
---|---|
date | Sat, 17 Feb 2018 23:33:14 +0900 |
parents | e15e674f4f6d |
children | b09b86ae9c81 |
line wrap: on
line source
\chapter{評価実験} 本研究は、Jungleの分散環境上での性能を正しく評価するための実験を行う。 本章では実験の概要について述べる。 まず、本研究の目的について述べ、 次に、分散フレームワーク Aliceによる、本研究の分散機構を構成する方法について述べる。 次に、木構造上に立ち上げたJungleへ投入するタスクを制御するジョブスケジューラー、TORQUEについて述べる。 最後に、本実験の測定用プログラムについて述べる。 \section{実験目的} jungleは現在、javaで実装されたものと、Huskellで実装されたものがある。 java版は、処理速度が早く、よりスケーラビリティの高いデータベースの実装を目的に開発された。 対してHuskell版は、モダンな型システムと、型推論と型安全という特徴を生かし、信頼性の高データベースの実装を目的に開発された。 そして、これまでの研究で、Java版とHaskell版のjungleの性能を測定する実験が行われている。 性能測定実験では、それぞれJetty,Wrapというwebサーバーをフロントエンドに用いたWeb掲示板サービスを使用している。 Java版とHuskell版のWeb掲示板サービスをブレードサーバー上で実行される。 計測方法は、掲示板に対して読み込みと書き込みを行い、ネットワークを介してweighhttpで負荷をかける。 weighthttpの設定は、1スレッドあたり100並列のリクエストを、10スレッド分投入し、合計100万のリクエストを処理させる。 Java と Haskell の測定結果が表\ref{tab:compare}のようになった。 \begin{table}[!htbp] \begin{center} \begin{tabular}{|c||r|r|} \hline 測定 & Haskell & Java \\ \hline \hline 読み込み & 16.31 s & 53.13 s \\ \hline 書き込み & 20.17 s & 76.4 s \\ \hline \end{tabular} \end{center} \caption{HaskellとJavaの比較} \label{tab:compare} \end{table} Huskell 版は、 Java 版と比較して、読み込みで3,25倍、書き込みで 3.78倍 の性能差がでている結果となってしまった。 処理速度においてはHuskellよりも高いことを予想されていたのにもかかわらず、Java版がHuskell版よりも遅くなってしまった原因は、 測定時のWeb掲示板サービスのフロントエンドに、どちらもWebサーバーを用いているということが考えられる。しかも、その際は言語の問題から、異なる種類のWebサーバーを使用している。 これでは、この性能結果が、異なる言語で実装されたJungleの性能差によるものなのか、Webサーバーの性能差によるものなのかがわからない。 そこで、本研究ではJava版のJungleにおいて、Webサーバーを取り除いた、純粋なJungleの性能を測定するプログラムを実装した。 \section{測定環境} 本実験では、 \section{TORQUE Resource Manager} 分散環境上でのJungleの性能を測定するにあたり、VM32台にJungle,AliceのTopologyManagerを起動させた後、Jungleを立ち上げたVMでデータを書き込むプログラムを動作させる。プログラムを起動する順番やタイミングは、TORQUE Resource Managerというジョブスケジューラーによって管理する。 TORQUE Resource Manager は、ジョブを管理・投下・実行する3つのデーモンで構成されており、 ジョブの管理・投下を担うデーモンが稼働しているヘッダーノードから、ジョブの実行を担うデーモンが稼働している計算ノードへジョブが投下される(図\ref{fig:torque} )。 \begin{figure}[htbp] \begin{center} \includegraphics[width=100mm]{./pic/torque.pdf} \end{center} \caption{TORQUEの構成} \label{fig:torque} \end{figure} ユーザーはジョブを記述したシェルスクリプトを用意し、スケジューラーに投入する。その際に、利用したいマシン数やCPUコア数を指定する。TORQUEは、ジョブに必要なマシンが揃い次第、受け取ったジョブを実行する。 今回、ジョブには、使用するVMの数や、実行させたいテストプログラムの参照先等を記述している。 \newpage \section{分散フレームワーク Alice による分散環境の構築} 本研究では、分散環境上でのJungleの性能を確認する為、VM32台分のサーバーノードを用意し、それぞれでJungleを起動することで、Jungle間で通信をする環境をつくる。 Jungleを起動したサーバーノード間の通信部分を、当研究室で開発している並列分散フレームワークAlice[1]にて再現する。 Aliceには、ネットワークのトポロジーを構成するTopologyManager[2]という機能が備わっている。サーバーノードはTopologyManagerに、誰に接続を行えばよいかを尋ねる。TopologyManagerは尋ねてきたサーバーノードに順番に、接続先のサーバーノードのIPアドレス、ポート番号、接続名を送り、受け取ったサーバーノードはそれらに従って接続する。 この時、TopologyManager自身はVM0を用いて立ち上げる。 よって、TopologyManagerはJungleをのせたVM1からVM32、計VM31台分のサーバーノードを、木構造を形成するように采配する(図\ref{fig:topologymanager} )。 \begin{figure}[H] \centering \includegraphics[width=100mm]{pic/topologymanager3.pdf} \caption{AliceによるJungleの木構造トポロジーの形成} \label{fig:topologymanager} \end{figure} %DataSegment CodeSegment Aliceはタスクを行うCodeSegmentと、CodeSegmentで使用するデータを扱うDataSegmentによってプログラムを行うスタイルを取る。 CodeSegmentはDataSegmentが必要なデータを受け取り次第、タスクを行う。DataSegmentがデータを受け取る為には、そのDataSegmentを示すキーが必要である。 TopologyManagerによって構成されたトポロジーのサーバーノードには、それぞれ自分自身を示す文字列であるキーが存在する。 このキーは自身のサーバーノードのDataSegmentがデータを受け取る際に指定する必要がある。 たとえば、servernode0,servernode1,servernode2により、(図\ref{fig:LogupdateTree})のように木構造が構成されたとする。 \begin{figure}[H] \centering \includegraphics[width=100mm]{pic/LogupdateTree.pdf} \caption{トポロジーの形成} \label{fig:LogupdateTree} \end{figure} この時、servernode0はservernode1、servernode2に対して親にあたる。逆に、servernode1,servernode2はservernode0に対して子にあたる。よって、(図\ref{fig:LogupdateTree})に矢印の隣にかかれている文字列"parent","child 1","child 2"のようにキーを指定している。 servernode0からservernode1へデータを送りたい場合、”child 1”というキーを追加すればいい。 このように、データアクセスしたいサーバーノードのキーを追加することで、そのサーバノードのDataSegmentへデータアクセスすることができる。 他のサーバーノードのDataSegmentへデータアクセスする際には、アクセス先のサーバーノードのキーを追加すればいい。 %TreeOperationLog トポロジー構成後、Jungle間の通信でのデータ形式にはTreeOperationLogを利用する。TreeOperationLogは、Jungleによるノードの編集の履歴などの情報が入っている。TreeOperationLogは、AliceのDataSegmentでも扱えるようシリアライズ化されたデータである。よって、Aliceによって構成されたネットワークトポロジーのサーバノード間でのデータのアクセスが可能になっている。 TreeOperationLogをAliceによって他のJungleへ送る。送信先のJungleでは、送られてきたTreeOperationLogを参照して送信元のJungleと同じノード編集を行う。こうして、Jungle間でのデータの同期を可能にしている。 \newpage \section{Jungleの分散性能測定用テストプログラムの実装} 本実験において、Jungleの性能を測定する為にテストプログラムを作成した。 テストプログラムは、木構造における子ノードに、データを複数書き込む機能を提供する。 末端の複数の子ノードにデータをそれぞれ書き込み、最終的にrootノードへデータをmergeしていく(図\ref{fig:logupdatetest} )。データを複数書き込む機能は、Jungleを立ち上げる際に-writeオプションと-countオプションをつけることで搭載される。 測定範囲は、末端ノードからrootノードへデータが到達する時間を測定する予定である。 \begin{figure}[htbp] \centering \includegraphics[width=100mm]{pic/logupdatetest2.pdf} \caption{TestプログラムによるJungleの性能測定} \label{fig:logupdatetest} \end{figure} 到達時間を測定するためには、AliceのTopologyManagerを立ち上げる際に、-show Time オプションをつける必要がある。これにより、出力される結果に末端ノードからrootノードへのデータの到達時間が表示されるようになる。 テストプログラムは、TopologyManagerとJungleの起動を行う。 TopologyManagerとJungleは、用意されたVM32台に起動される。 それぞれ、VMを何台用いて起動するかは、以下のように指定する。 %topologymanager まず、本実験のネットワークトポロジーを形成するためtopokogymanagerの起動を行う。 TopologyManagerはVM0に起動する。 AliceのTopologyManagerの起動はソースコード\ref{src:Logupdate.pl}のように行う。 \begin{lstlisting}[frame=lrbt,label=src:Logupdate.pl,caption=Alice によるネットワークトポロジーマネージャーの起動,numbers=left] % ssh $nodes[0] \"cd $logFile;java -cp ../../build/libs/logupdateTest-1.1.jar alice.topology.manager.TopologyManager -conf ../../scripts/tree.dot -p 10000 --showTime --noKeepAlive \end{lstlisting} -p オプションはTopologyManagerが開くポートの番号、-confオプションには dot ファイルのパスを渡している。 ポート番号はAliceのより記述された並列分散プログラムの起動時に渡す必要がある。 dot ファイルには、トポロジーをどのように構成するかが書かれている。dotファイルを読み込んだAliceのTopologyManagerに対して、サーバーノードは誰に接続を行えばよいかを尋ねる。TopologyManagerは尋ねてきたサーバーノードに対してノード番号を割り振り、dotファイルに記述している通りにサーバーノードが接続を行うように指示をだす。 このとき、子ノードからの書き込みがrootノードへ到達したときの時間の計測結果を表示する -showTime オプションも一緒につける。 %writeモードのjungle起動 -writeオプションをつけることで、jungleにデータを書き込む機能をつけることができる。 これを最大16台のJungleにつけて起動させる。 また、Jungleがデータを書き込む回数は、-countオプションをつけることで指定できる。今回は、1から100の回数分書き込みを行う。 -writeオプション、-countオプションを付けたwriteモードのjungleの起動はソースコード\ref{src:WriteCount}のように行う。 \begin{lstlisting}[frame=lrbt,label=src:WriteCount,caption=writeモードでのJungleの起動,numbers=left] % ssh $nodes[$#nodes] \"cd $logFile;java -jar ../../build/libs/logupdateTest-1.1.jar -host $nodes[0] -p 10003 -port 10000 -write -count 10 --noKeepAlive \end{lstlisting} %jungleの起動 TopologyManagerに1台、writeモードで立ち上げるJungleに16台使た後、残りの15台はそのままJungleを起動させる。 起動はソースコード\ref{src:jungle}のように行う。 \begin{lstlisting}[frame=lrbt,label=src:jungle,caption=Jungleの起動,numbers=left] % ssh $nodes[$i] \"cd $logFile;java -jar ../../build/libs/logupdateTest-1.1.jar -host $nodes[0] -p 10003 -port 10000 --noKeepAlive \end{lstlisting}