view paper/slides/sample.markdown @ 45:0da3636c105b default tip

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 22 Feb 2018 12:10:56 +0900
parents 14c72ace429b
children
line wrap: on
line source

title: 分散版 Jungle データベースの性能測定方法
author: 仲松栞
profile:琉球大学 工学部 情報工学科  河野研

# 研究背景
* スマートフォン等の普及により、Webサービスの利用者が増え、Webサーバーにかかる負荷も増大している
* この問題を解決する為に当研究室では、スケーラビリティを持つ分散データベースとしてJungleを開発している
* ここで言うスケーラビリティとは、複数のマシンに処理を分散させたりすることで、ユーザの人数に関わらずサービスの質を維持することを指す

# 問題提起
* これまでJungleの分散性能を測定する方法はWebサーバー込みで行われていた
* Webサーバーを使用した測定方法は、テストの準備が難しい
* TORQUEなどのPCクラスタタスクスケジューラを使用することができなかった
* Webサーバーや負荷器の性能に依存する為、Jungleの単体の分散性能を測定できなかった

# 研究目的
* Jungle単体の分散性能を測定できる環境を構築したい
* また、Jungleを用いるデータの伝搬方式や、トランザクションのmergeに関する研究開発をしやすくしたい
* 本研究ではWebサーバーを取り除き、木構造に構築したJungleのノード上で、いくつかのノードから書き込みを伝搬させて、変更が全体に伝搬するまでの実験を行える環境を構築した

# JUngleデータベースの構造
* 一般的なウェブサイトの構造は大体が木構造であるため、データ構造として木構造を採用している
* 木の変更を非破壊で行なっている
* 木の変更をLogとして持っている
* そのLogを通信することにより、木を分散させる
* Logの通信には当研究で開発している分散フレームワークAliceを用いている
* 異なる変更履歴を1つにまとめるMergeという機能を持っている

# Jungleの分散機構
* 今回のJungleの分散機構はツリートポロジーを想定している
* ツリー型であれば、一度トップまでデータを伝搬させることで木全体のデータを同期できる

<div>
        <img src="./pictures/tree4.svg" alt="message" style="float: left;width: 50%;">
        <div style="float: right; width: 50%;">
        <ol>
            <li>node1からnode0へデータが送られる</li>
            <li>node0でデータがupdateされ、そのデータがnode1,node2へ送られる</li>
            <li>node1からnode3,node4へデータが送られ、全体でデータの同期が完了する</li>
      </ol>
      </div>
      <div style="clear: both;"></div>
</div>

#実験の準備
* Webサーバーを取り除いた、Jungleの純粋な性能を計測する環境を構築する
* 学科のVM16台でPCクラスタを構築し、クラスタ上にジョブスケジューラーTORQUEを設定した
* 本研究で用いたVMの性能を以下に示す
<table style="border-collapse: collapse;border:1px solid #000000;">
        <th style="border:1px solid #000000;padding:5px 15px 5px 15px;">マシン台数</th>
        <th style="border:1px solid #000000;padding:5px 15px 5px 15px;">OS</th>
        <th style="border:1px solid #000000;padding:5px 15px 5px 15px;">CPU</th>
        <th style="border:1px solid #000000;padding:5px 15px 5px 15px;">Memory</th>

        <tr>
        <td style="border:1px solid #000000;padding:5px 15px 5px 15px;">16台</td>
        <td style="border:1px solid #000000;padding:5px 15px 5px 15px;">CentOS Linux release 7.2.1511 (Core) </td>
        <td style="border:1px solid #000000;padding:5px 15px 5px 15px;">QEMU Virtual CPU 2.3GHz</td>
        <td style="border:1px solid #000000;padding:5px 15px 5px 15px;">1GB</td>
        </tr>
</table>


#TORQUE Resource Manager
* TORQUEはジョブスケジューラーであり、分散された複数のノードに一度にジョブを投入することができる為、本研究で採用した
* TORQUEはジョブを管理・投下・実行する3つの処理で構成されている
* ジョブの管理・投下を担うヘッダーノードから、ジョブの実行を担う計算ノードへジョブが投下される
* 本実験では、TORQUEを用いて、計測用のスクリプトを15台のJungleに一度に投入するスクリプトを投入した

<div align="center"><img src="./pictures/torque2.svg" style="center"></div>


#TORQUEの使い方
* ジョブはqsubコマンドで投入する
```c
$ qsub scripts/LogupdateTest-qsub.sh 
```
* ジョブの処理状況はqstatコマンドで確認できる
	* Sは現在のジョブの処理状況を示し、Rは処理中であり、Cは処理完了を表している
```c
$ qstat

Job ID                    Name             User            Time Use  S Queue
------------------------- ---------------- ---------------  -------- - -----
563.tino-VM1              LogUpdateTest    ie-user                 0 C jungle 
```

# これまでのまとめ 
* 以上が実験の環境についての説明である
* つづいて、このTORQUEを用いて、Jungleの分散性能を測定する

# 実験
* 以下にJungleの分散性能を測定する手順を示す
<div>
        <img src="./pictures/gaiyou3.svg" alt="message" style="float: left;width: 50%;">
        <div style="float: right; width: 50%;">
        <ul>
            <li>学科のVM16台のうち、1台でTopologyManagerを起動し,残りの15台でJungleを1つずつ起動する</li>
            <li>TopologyManagerは指定されたトポロジーの情報に従い、接続先の情報をJungleノードに送る</li>
            <li>Jungleは送られてきた接続先のIPアドレス、ポート番号、接続名に従い、トポロジーを形成する</li>
            <li>複数の子ノードのJungleに書き込んだデータがrootノードのJungleへMergeし終わるまでの時間を計測する</li>
      </ul>
      </div>
      <div style="clear: both;"></div>
</div>

#TopologyManager
* TopologyManagerは、Aliceが持つネットワーク上の複数のサーバーノードにトポロジーを形成さる機能である
* TopologyManagerにトポロジーの内容が書かれたトポロジーファイルを渡すことで、任意のトポロジーを構成させることができる。
* 本実験ではTopologyManagerにツリー型のトポロジーファイルを渡すことで、15台のJungleでツリートポロジーを構成させた。

<div align="center"><img src="./pictures/topologymanager6.svg" style="center"></div>

# 実験をするにあたりぶつかった問題点とその対処法
* ところが、TORQUEにジョブを投入しても、実験がうまくいかなかった
* 原因は、Jungleには、自身の処理を終了させる機能が備わっていないことだった
	* Jungleがデータを書き込み終わる時に、TopologyManagerへnullLogを送るコードを実装した
	* TopologyManagerはnullLogを受け取ることで、全てのノードがタスクを終了したことを確認する
	* 確認とともに、TopologyManagerはJungleへ"finish"を送り、テストを終了させる

# 実験の準備の為に行なったこと
* TORQUEに使用するperlスクリプトを用意した 
* また、環境構築の際に、JungleとAliceは異なるパッケージで作られていた為、バージョンがズレていた
	* mavenリポジトリのキャッシュをクリアし、アップデートを行うことで修正した 

# まとめと今後の課題
* 本研究ではJungleの分散性能の測定方法の提案と測定環境の構築を行なった
* それにあたり、Jungleが分散ノード全体を終了させることができない問題が起きた
	* データ書き込みの最後にTopologyManagerにnullLogを送り、Jungleを終了させるコードを実装した

* 今回構築した測定環境で、現在のJungleのmergeや分散アルゴリズムを研究したい
* 再接続時に、Jungleのノードのデータを再ロードできるプロトコルを定義したい
	* 方法としては、他のノード、もしくはディスクからデータを読み込む
* ディスク上にあるJungleの木を読み出すプロトコルを定義したい

# 分散フレームワークAlice
* Aliceは当研究室で開発している並列分散フレームワークである
* Alice は、ネットワーク上の複数のサーバーノードにトポロジーを形成させ、通信する機能を提供する
* 本実験では、Aliceを用いて15台のJungleにツリートポロジーを形成させ、子ノードとrootノード間のデータの通信を行なった

#計測結果(1/2)
* 1台に書き込み/1回書き込み
```c
TopologymanagerTime = 5285

hostname: node6  time  = 214 
```
* 7台に書き込み/1回書き込み
```c
TopologymanagerTime = 5115

hostname: node9  time  = 98 

```

#計測結果(2/2)
* 1台に書き込み/100回書き込み
```c
TopologymanagerTime = 5425

hostname: node14  time  = 278 
hostname: node14  time  = 210 
           ...
hostname: node14  time  = 5 
hostname: node14  time  = 4 
```
* 7台に書き込み/100回書き込み
```c
TopologymanagerTime = 5351

hostname: node10  time  = 290 
hostname: node10  time  = 209 
           ...
hostname: node10  time  = 17 
hostname: node10  time  = 16
```
* 現在解析中です

#ジョブスクリプト
```c
#!/bin/sh
#PBS -q jungle
#PBS -N LogUpdateTest
#PBS -l nodes=16,walltime=00:08:00

cd /mnt/data/jungle_workspace/Log
/usr/bin/perl /mnt/data/jungle_workspace/scripts/LogupdateTest.pl
```
* -q ... queueを指定。
* -N ... 実行結果の出力ファイル名
* nodes ... 使用するnodeの台数、
* walltime ... 実行制限時間
* Logディレクトリに移動し,今回政策したperlスクリプトを実行している
* 実行結果がLogディレクトリに吐き出される

#perlスクリプト
```c
mysystem("cd $jungleDir; ruby scripts/tree.rb $nodeNum > scripts/tree.dot");
mkdir "$logFile";
mysystem("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 > $logNum\" ",1);
$logNum++;
sleep 10;
for my $i (1..($#nodes-7)) {
  mysystem("ssh $nodes[$i] \"cd $logFile;java -jar ../../build/libs/logupdateTest-1.1.jar -host $nodes[0] -p 10003 -port 10000  --noKeepAlive > $logNum\" & ");
  $logNum++;
}

for my $j (($#nodes-6)..($#nodes)){
mysystem("ssh $nodes[$j] \"cd $logFile;java -jar ../../build/libs/logupdateTest-1.1.jar -host $nodes[0] -p 10003 -port 10000  -write -count 100 --noKeepAlive > $logNum\" &" );
}
for (@wait) {
    wait; #1がついている部分だけweit TopologyManagerだけweit 
}
```


# その言葉を待っていました
* 開発中です