Mercurial > hg > Papers > 2015 > nozomi-prosym
comparison paper-last/prosym.tex @ 4:a1f6921de16c
add mesureresult
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 29 Nov 2015 18:15:15 +0900 |
parents | |
children | 50de9b120af4 |
comparison
equal
deleted
inserted
replaced
3:9994b9edfaff | 4:a1f6921de16c |
---|---|
1 % withpage: ページ番号をつける (著者確認用) | |
2 % english: 英語原稿用フォーマット | |
3 \documentclass[techrep, ,dvipdfmx]{ipsjprosym} | |
4 %\documentclass[withpage,english]{ipsjprosym} | |
5 | |
6 \usepackage[dvipdfmx,hiresbb]{graphicx} | |
7 \usepackage{listings} | |
8 \usepackage{url} | |
9 \lstset{% | |
10 language={Java},%使用言語 | |
11 basicstyle={\small},%書体 | |
12 commentstyle={\small\itshape},%コメントの書体 | |
13 keywordstyle={\small\bfseries},%キーワードの書体 | |
14 %identifierstyle={\small},% | |
15 %ndkeywordstyle={\small},% | |
16 stringstyle={\small},%文字列の書体 | |
17 frame={trlb},%外枠 | |
18 breaklines=true,%改行 | |
19 columns=[l]{fullflexible},% | |
20 xrightmargin=0zw,% | |
21 xleftmargin=3zw,% | |
22 numbers=left,%行番号の表示 | |
23 numberstyle={\scriptsize},%行番号の書体 | |
24 numbersep=1zw,% | |
25 stepnumber=1, | |
26 lineskip=-0.5ex,% | |
27 captionpos=b,%キャプションの位置 | |
28 moredelim=**[s][\color{red}]{\"compressed}{\"}, | |
29 } | |
30 \renewcommand{\lstlistingname}{Code} | |
31 \input{dummy.tex} %% Font | |
32 | |
33 \begin{document} | |
34 | |
35 % Title, Author %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
36 \title{分散フレームワークAliceのPC画面配信システムへの応用} | |
37 \author{照屋 のぞみ}{Nozomi Teruya}{琉球大学工学部情報工学科}[dpop@cr.ie.u-ryukyu.ac.jp] | |
38 \author{河野 真治}{Shinji Kono}{琉球大学工学部情報工学科}[kono@ie.u-ryukyu.ac.jp] | |
39 | |
40 \begin{abstract} | |
41 当研究室ではデータを Data Segment、タスクを Code Segment という単位で分割して記述する手法を提唱しており、 | |
42 それに基づく並列分散フレームワークAliceを開発している。 | |
43 Aliceが分散プログラムを記述する能力を有することは水族館の例題等において確認された。 | |
44 しかし、実用的な分散アプリケーションを構築するには圧縮形式で通信を行う機能等が必要であることが分かった。 | |
45 本研究では、 実用的なアプリケーションである画面共有システムTreeVNCをAliceで実装するにあたり必要となった圧縮機能等をMeta Computationとして実装した。 | |
46 データの多態性の実現により、扱うデータの形式を元のコードを大きく変更することなく指定することができ、ノード間通信における自由度の向上を図った。 | |
47 \end{abstract} | |
48 | |
49 \begin{jkeyword} | |
50 並列分散フレームワーク | |
51 \end{jkeyword} | |
52 | |
53 \maketitle | |
54 | |
55 % Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
56 \section{研究背景と目的} | |
57 当研究室ではデータをData Segment、タスクをCode Segmentという単位で記述する分散フレームワークAliceの開発を行っている。 | |
58 Aliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する。 | |
59 ここで言う信頼性とは、定められた環境下で安定して仕様に従った動作を行うことを指す。 | |
60 | |
61 Aliceでは、処理をComputationとMeta Computationに階層化し、コアな仕様と複雑な例外処理に分離する。 | |
62 そして分散環境の構築に必要な処理をMeta Computationとして提供する。 | |
63 プログラマはコアな仕様の変更を抑えつつプログラムの挙動変更ができるため、信頼性の高い分散アプリケーションの記述が可能となる。 | |
64 | |
65 先行研究 \cite{senkokenkyu} の水族館の例題等において、Aliceが分散プログラムを記述する能力を有することは確認された。 | |
66 しかし、実用的な分散アプリケーションを作成するためには、動的トポロジーを管理・構成する機能や通信時にData Segmentを圧縮形式で扱う機能が必要な場合がある。 | |
67 本研究では、Alice上に実用的な分散アプリケーションの例題である画面共有システムTreeVNC \cite{treeVNC} を構築する。 | |
68 構築するにあたり必要となった圧縮などの機能を、AliceのMeta Computationとして実装する。 | |
69 そして Alice を使用していないTreeVNCとの比較を行うことでMeta Computationの役割と有効性を示す。 | |
70 | |
71 \section{分散フレームワークAlice} | |
72 \subsection{Code Segment と Data Segment} | |
73 AliceではCode Segment(以下CS)とData Segment(以下DS)の依存関係を記述することでプログラミングを行う。 | |
74 CSは実行に必要なDSが全て揃うと実行される。CSを実行するために必要な入力DSはInputDS、CSが計算を行った後に出力されるDSはOutput DSと呼ばれる。 | |
75 データの依存関係にないCSは並列実行が可能である(図 \ref{fig:CS} )。 | |
76 CSの実行においてDSが他のCSから変更を受けることはない。そのためAliceではデータが他から変更され整合性がとれなくなることはない。 | |
77 | |
78 \begin{figure}[htbp] | |
79 \begin{center} | |
80 \includegraphics[width=70mm]{images/dsandcs2.pdf} | |
81 \end{center} | |
82 \caption{CodeSegmentの依存関係 } | |
83 \label{fig:CS} | |
84 \end{figure} | |
85 | |
86 実際にはAliceはJavaで実装されており、DSはJavaObjectでCSはRunnableThreadである。プログラマーがCSを記述する際は、CodeSegmentクラスを継承し、DSを操作するAPIを使用する。 | |
87 | |
88 \subsection{DataSegmentManager} | |
89 DSは数値や文字列などの基本的なデータの集まりを指し、Aliceが内部にもつデータベースによって管理されている。このデータベースをAliceではDS Manager(以下DSM)と呼ぶ。 | |
90 | |
91 DSには対になるString型のkeyが存在し、このkeyを指定してDSの保存・取得を行う。 | |
92 一つのkeyに対して複数のDSを登録することもでき、その場合DSはqueueに保存されFIFOで取り出される。 | |
93 | |
94 DSMにはLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のデータベースである。 | |
95 Remote DSMは他ノードのLocal DSMに対応するproxyであり、接続しているノードの数だけ存在する(図 \ref{fig:RemoteDSM} )。 | |
96 他ノードのLocal DSMに書き込みたい場合はRemote DSMに対して書き込めば良い。 | |
97 Remote DSMを立ち上げるには、DataSegment.classが提供するconnectメソッドを用いる。 | |
98 接続したいノードのipアドレスとport番号、そして任意のManager名を指定することで立ちあげられる。その後はManager名を指定してData Segment APIを用いてDSのやり取りを行う。 | |
99 \begin{figure}[h] | |
100 \begin{center} | |
101 \includegraphics[width=70mm]{images/remote_datasegment.pdf} | |
102 \end{center} | |
103 \caption{Remote DSMは他のノードのLocal DSMのproxy } | |
104 \label{fig:RemoteDSM} | |
105 \end{figure} | |
106 | |
107 \newpage | |
108 | |
109 \subsection{Data Segment API} | |
110 DSの保存・取得にはAliceが提供するAPIを用いる。 | |
111 putとupdateはOutput DS APIと呼ばれ、DSをDSMに保存する際に用いる。 | |
112 peekとtakeはInput DS APIと呼ばれ、DSをDSMから取得する際に使用する。 | |
113 | |
114 \begin{itemize} | |
115 \item {\ttfamily void put(String managerKey, String key, Object val)} | |
116 \end{itemize} | |
117 DSをDSMに追加するためのAPIである。第一引数はLocalDSMかRemoteDSMかといったManager名を指定する。そして第二引数で指定されたkeyに対応するDSとして第三引数の値を追加する。 | |
118 \begin{itemize} | |
119 \item {\ttfamily void update(String managerKey, String key, Object val)} | |
120 \end{itemize} | |
121 updateもDSをDSMに追加するためのAPIである。putとの違いは、queueの先頭のDSを削除してからDSを追加することである。そのためAPI実行前後でqueueの中にあるDSの個数は変わらない。 | |
122 | |
123 \begin{itemize} | |
124 \item {\ttfamily void take(String managerKey, String key)} | |
125 \end{itemize} | |
126 takeはDSを読み込むためのAPIである。読み込まれたDSは削除される。要求したDSが存在しなければ、CSの待ち合わせ (Blocking)が起こる。putやupdateによりDSに更新があった場合、takeが直ちに実行される。 | |
127 | |
128 \begin{itemize} | |
129 \item {\ttfamily void peek(String managerKey, String key)} | |
130 \end{itemize} | |
131 peekもDSを読み込むAPIである。takeとの違いは読み込まれたDSが削除されないことである。 | |
132 | |
133 | |
134 \subsection{Data Segmentの表現} | |
135 DSの表現にはMessagePack for Java \cite{MessagePack} を利用している。 | |
136 \begin{itemize} | |
137 \item {\ttfamily DSは一般的なJavaのクラスオブジェクト} | |
138 \item {\ttfamily MessagePackを用いて変換したbyte[]で表現されたバイナリオブジェクト} | |
139 \end{itemize} | |
140 の2種類があり、LocalDSMにputされた場合は一般的なJavaのクラスオブジェクトとして追加される。 | |
141 RemoteDSMにputされた場合は通信時にbyteArrayに変換されたバイナリオブジェクトが追加される。 | |
142 | |
143 \subsection{Code Segmentの記述方法} | |
144 CSをユーザーが記述する際にはCodeSegment.classを継承して記述する(ソースコード \ref{src:StartCodeSegment} , \ref{src:CodeSegment})。 | |
145 継承することによりCode Segmentで使用するData Segment APIを利用する事ができる。 | |
146 | |
147 \begin{table}[html] | |
148 \lstinputlisting[label=src:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java} | |
149 \lstinputlisting[label=src:CodeSegment, caption=CodeSegmentの例]{source/TestCodeSegment.java} | |
150 \end{table} | |
151 | |
152 Alice には、Start CS (ソースコード \ref{src:StartCodeSegment} )というC の main に相当するような最初に実行される CS がある。 | |
153 Start CSはどのDSにも依存しない。つまりInput DSを持たない。 | |
154 このCSをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。 | |
155 | |
156 ソースコード \ref{src:StartCodeSegment} は、5行目で次に実行させたいCS(ソースコード \ref{src:CodeSegment} )を作成している。8行目でOutput DS APIを通してLocal DSMに対してDSをputしている。 | |
157 Output DS APIはCSの{\tt ods}というフィールドを用いてアクセスする。 | |
158 {\tt ods}は{\tt put}と{\tt update}を実行することができる。 | |
159 TestCodeSegmentはこの"cnt"というkeyに対して依存関係があり、8行目でputが行われるとTestCodeSegmentは実行される。 | |
160 | |
161 | |
162 \ref{src:CodeSegment}は、0から9までインクリメントする例題である。 | |
163 2行目で取得されたDSが格納される受け皿を作る。Input DS APIがもつcreateメソッドを使うことで作成できる。 | |
164 \begin{itemize} | |
165 \item {\ttfamily Receiver create(CommandType type)} | |
166 \end{itemize} | |
167 | |
168 引数にはCommandTypeが取られ、指定できるCommandTypeは{\tt PEEK}または{\tt TAKE}である。 | |
169 Input DS API はCSの{\tt ids}というフィールドを用いてアクセスする。 | |
170 Output DSは、{\tt ods}が提供するput/updateメソッドをそのまま呼べばよかったが、Input DSの場合{\tt ids}にpeek/takeメソッドはなく、create/setKeyメソッド内でCommandTypeを指定して実行する。 | |
171 | |
172 4行目から6行目はコンストラクタである。コンストラクタはオブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化を行う関数である。 | |
173 | |
174 TestCodeSegmentのコンストラクタが呼ばれた際には、 | |
175 \begin{enumerate} | |
176 \item CSが持つフィールド変数 {\tt Receiver input}に{\tt ids.create(CommandType.TAKE)}が行われ、{\tt input}が初期化される。 | |
177 \item 5行目にあるTestCodeSegmentのコンストラクタのTAKEが実行される。 | |
178 \end{enumerate} | |
179 | |
180 5行目はInput DS APIがもつsetKeyメソッドによりLocal DSMからDSを取得している。 | |
181 \begin{itemize} | |
182 \item \verb+void setKey(String managerKey, String key)+ | |
183 \end{itemize} | |
184 setKeyメソッドはpeek/takeの実行を行う。どのDSMのどのkeyに対してpeekまたはtakeコマンドを実行させるかを指定できる。コマンドの結果がレスポンスとして届き次第CSは実行される。 | |
185 | |
186 runメソッドの内容としては | |
187 \begin{enumerate} | |
188 \item 10行目で取得されたDSをInteger型に変換してcountに代入する。 | |
189 \item 12行目でcountをインクリメントする。 | |
190 \item 16行目で次に実行されるCSが作られる。(この時点で次のCSはInput DSの待ち状態に入る) | |
191 \item 17行目でcountをLocal DSMにputする。Input DSが揃い待ち状態が解決されたため、次のCSが実行される。 | |
192 \item 13行目が終了条件であり、countの値が10になれば終了する。 | |
193 \end{enumerate} | |
194 となっている。 | |
195 | |
196 \section{Meta Computation} | |
197 Aliceでは、計算の本質的な処理をComputation、Computationとは直接関係ないが別のレベルでそれを支える処理をMeta Computationとして分けて考える。 | |
198 AliceのComputationは、keyによりDSを待ち合わせ、DSが揃ったCSを並列に実行する処理と捉えられる。 | |
199 それに対して、AliceのMeta Computation は、Remoteノードとの通信時のトポロジーの構成や切断・再接続の処理と言える。 | |
200 つまりトポロジーの構成はAliceのComputationを支えているComputationとみなすことができる。 | |
201 | |
202 Aliceの機能を追加するということはプログラマ側が使うMeta Computationを追加すると言い換えられる。 | |
203 AliceではMeta Computationとして分散環境の構築等の機能を提供するため、プログラマーはCSを記述する際にトポロジー構成や切断、再接続という状況を予め想定した処理にする必要はない。 | |
204 プログラマーは目的の処理だけ記述し、切断や再接続が起こった場合の処理をMeta Computationとして指定する。 | |
205 このようにプログラムすることで、通常処理と例外処理を分離することができるため、仕様の変更を抑えたシンプルなプログラムを記述できる。 | |
206 現在Aliceには、動的・静的トポロジーの管理構成機能、ノードとの接続状態確認機能、切断・再接続時の処理を指定できる機能などのMeta Computationが用意されている。 | |
207 | |
208 \section{AliceVNC} | |
209 AliceのMeta Computationが実用的なアプリケーションの記述において有用であることを確認する。 | |
210 そのために、TreeVNCをAliceを用いて実装したAliceVNCの作成を行った。 | |
211 | |
212 TreeVNCとは、当研究室で開発を行っている授業向け画面共有システムである。 | |
213 オープンソースのVNCであるTightVNC \cite{tightVNC} をもとに作られている。 | |
214 授業でVNCを使う場合、1つのコンピュータに多人数が同時につながるため、性能が大幅に落ちてしまう。 | |
215 この問題をノード同士を接続させ、木構造を構成することで負荷分散を行い解決したものがTreeVNCである(図 \ref{fig:TreeVNC} )。 | |
216 TreeVNCは通信処理部分の記述が大変複雑になっている。しかし、Aliceで記述すれば本質的な処理とそれを支える通信処理部分で分離できる。 | |
217 そのため、TightVNCからの修正も少なく、見通しの良い記述で構成可能と期待される。 | |
218 | |
219 \begin{figure}[h] | |
220 \begin{center} | |
221 \includegraphics[width=80mm]{images/TreeVNC.pdf} | |
222 \end{center} | |
223 \caption{AliceVNC の構造} | |
224 \label{fig:TreeVNC} | |
225 \end{figure} | |
226 | |
227 \newpage | |
228 \section{Aliceの新機能} | |
229 実用的なアプリケーションであるTreeVNCをAlice上で実装することで、Aliceに必要な機能を洗い出した。 | |
230 \subsection{転送機能} | |
231 Input DSをRecieverに取得したあと、プログラマーはRecieverから値を任意の型で取り出し、値を操作した後putメソッドで再度別クラスに変換されOutput DSとして出力する。 | |
232 しかし、Input DSとして取得したデータをそのまま子ノードにOutput DSとして出力する場合、一度Recieverから取り出し再変換する操作は無駄である。 | |
233 | |
234 そこで、Input DSとして受け取ったDSをそのままOutput DSとして転送する機能をput/updateとは別にflipメソッドをData Segment APIに実装した。 | |
235 Input DSであるReceiverを展開せずにflipメソッドに引数として渡すことで、展開のオーバーヘッドをなくしている。 | |
236 TreeVNCでは親ノードから受け取った画面データをそのまま子ノードに配信するため、Meta Computationとして転送機能が有用である。 | |
237 | |
238 \subsection{Data Segmentの表現の追加(圧縮機能)} | |
239 TreeVNCでは画面配信の際、データを圧縮してノード間通信を行っている。 | |
240 そのため、AliceVNCにも圧縮されたデータ形式を扱える機能が必要だと考えた。 | |
241 しかし、ただデータを圧縮する機構を追加すればいいわけではない。 | |
242 | |
243 AliceVNCでは、ノードは受け取った画面データを描画すると同時に、子ノードのRemote DSMに送信する。 | |
244 ノードはDSを受信するとそれを一度解凍して画面を表示し、再圧縮して子ノードに送信する。 | |
245 しかし、受け取ったデータを自分の子ノードに対して送信する際には、解凍する必要はない。 | |
246 圧縮状態のまま子ノードに送信ができれば、解凍・再圧縮するオーバーヘッドを無くすことができる。 | |
247 | |
248 そこで、1つのData Segmentに対し複数の表現を持たせることで、必要に応じた形式でDSを扱うことを可能にした。 | |
249 DSを扱うReceiveData.classに、次の3種類の表現を同時に持つことができる。 | |
250 | |
251 \begin{enumerate} | |
252 \item 一般的なJavaのクラスオブジェクト | |
253 \item MessagePack for Javaでシリアライズ化されたバイナリオブジェクト | |
254 \item 2を圧縮したバイナリオブジェクト | |
255 \end{enumerate} | |
256 | |
257 ソースコード \ref{src:ReceiveData} はReceiveData.classが持つ表現であり、{\tt val}に(1) 一般的なJavaのクラスオブジェクト の表現でデータ本体が保存される。 | |
258 {\tt messagePack}には(2) シリアライズ化されたバイナリオブジェクトが保存され、通常のRemoteDSMへの通信にこの表現が扱われる。 | |
259 そして、{\tt zMessagePack}には(3) 圧縮されたバイナリオブジェクトが保存される。 | |
260 | |
261 \begin{table}[html] | |
262 \lstinputlisting[label=src:ReceiveData, caption=データを表現するクラス]{source/ReceiveData.java} | |
263 \end{table} | |
264 | |
265 \newpage | |
266 また、圧縮状態を持つDSを扱うDSMとしてLocalとRemoteそれぞれにCompressed Data Segment Managerを追加した。 | |
267 Compressed DSMの内部では、put/updateが呼ばれた際にReceiveData.classが圧縮表現を持っていればそれを使用し、持っていなければその時点で圧縮表現を作ってput/updateを行う。 | |
268 | |
269 ソースコード \ref{src:before} はRemoteからDSをtakeしインクリメントしてLocalにputすることを10回繰り返す例題である。 | |
270 これをDSを圧縮形式で行いたい場合、ソースコード \ref{src:after} のように指定するDSM名の先頭に"compressed"をつければCompressed DSM内部の圧縮Meta Computationが走りDSを圧縮状態で扱うようになる。 | |
271 | |
272 これによりユーザは指定するDSMを変えるだけで、他の計算部分を変えずに圧縮表現を持つDSを扱うことができる。 | |
273 ノードは圧縮されたDSを受け取った後、そのまま子ノードにflipメソッドで転送すれば圧縮状態のまま送信されるので、送信の際の再圧縮がなくなる。 | |
274 画面表示の際はReceiveData.class内の{\tt asClass()}(ソースコード\ref {src:asClass} )を使うことで適切な形式でデータを取得できる。 | |
275 {\tt asClass()}はDSを目的の型にcastするメソッドであり、ReceiveData.classが圧縮表現だけを持っている場合はこのメソッド内で解凍してcastを行っている。 | |
276 これによりDSの表現を必要になったときに作成できる。 | |
277 | |
278 \newpage | |
279 \begin{table}[html] | |
280 \lstinputlisting[label=src:before, caption=通常のDSを扱うCSの例]{source/beforeCompress.java} | |
281 \end{table} | |
282 | |
283 \begin{table}[html] | |
284 \lstinputlisting[label=src:after,caption=圧縮したDSを扱うCSの例]{source/afterCompress.java} | |
285 \end{table} | |
286 | |
287 \begin{table}[html] | |
288 \lstinputlisting[label=src:asClass, caption=asClassの処理]{source/asClass.java} | |
289 \end{table} | |
290 | |
291 \subsection{Aliceの通信プロトコルの変更} | |
292 2.4 Data Segmentの表現 で述べたように、Remoteからputされたデータは必ずシリアライズ化されておりbyteArrayで表現される。 | |
293 しかし、TreeVNCのようにもとからbyteArrayの画像データをputする場合、MessagePackでシリアライズされたものかの判別が付かない。 | |
294 また、データの表現に圧縮したbyteArrayを追加したため、RemoteからputされたbyteArrayが圧縮されているのかそうでないのかを判断する必要がある。 | |
295 | |
296 そこで、Aliceの通信におけるヘッダにあたるCommandMessage.class(ソースコード \ref{src:CommandMessage} )にシリアライズ状態表すフラグと、圧縮状態を表すフラグを追加した。 | |
297 | |
298 \begin{table}[html] | |
299 \lstinputlisting[label=src:CommandMessage, caption=CommandMessage]{source/CommandMessage.java} | |
300 \end{table} | |
301 | |
302 \newpage | |
303 \begin{table}[htbp] | |
304 \caption{CommandMessageの変数名の説明} | |
305 \label{tb:variable} | |
306 \begin{center} | |
307 \begin{tabular} {|l|l|} | |
308 \hline | |
309 変数名&説明\\ | |
310 \hline | |
311 type&CommandType {\tt PEEK, PUT}などを表す\\ | |
312 \hline | |
313 seq&\shortstack{Data Segmentの待ち合わせを行っている\\Code Segmentを表すunique number }\\ | |
314 \hline | |
315 key&どのKeyに対して操作を行うか指定する\\ | |
316 \hline | |
317 | |
318 quickFlag&SEDAを挟まずCommandを処理を行うかを示す\\ | |
319 \hline | |
320 serialized&データ本体のシリアライズ状態を示す\\ | |
321 \hline | |
322 | |
323 compressed&データ本体の圧縮状態を示す\\ | |
324 \hline | |
325 | |
326 dataSize&圧縮前のデータサイズを表す\\ | |
327 \hline | |
328 | |
329 \end{tabular} | |
330 \end{center} | |
331 \end{table} | |
332 | |
333 | |
334 これによってputされたDSMはフラグに応じた適切な形式でReceiveData.class内にDSを格納できる。 | |
335 また、CommandMessage.classに圧縮前のデータサイズも追加したことで、適切な解凍が可能になった。 | |
336 | |
337 \section{評価と考察} | |
338 TreeVNCをAlice上で構築するために必要な機能をAliceのMeta Computationとして実装した。 | |
339 それにより、AliceVNCが簡潔な記述でTreeVNCと同等の性能を出せれば、実用的な分散アプリケーションの実装においてAliceのMeta Computationは有用であるといえる。 | |
340 そこで、TreeVNCとAliceVNCの性能評価としてメッセージ伝達速度の比較を、コードの評価としてコード量とその複雑度の比較を行った。 | |
341 | |
342 また、AliceのMeta Computationの価値を明確にするため、他言語・フレームワークとの比較を行った。 | |
343 | |
344 \subsection{メッセージ伝達速度の比較} | |
345 TreeVNC/AliceVNCにおいて、配信する画像データは構成した木を伝ってノードに伝搬され、接続する人数が増える毎に木の段数は増えていく。 | |
346 そこで、木の段数ごとにメッセージの到達にどれぐらい時間がかかっているかを計測した。 | |
347 | |
348 \textbf{実験環境} | |
349 | |
350 講義内で学生に協力してもらい、最大17名の接続がある中でTreeVNC、AliceVNC(圧縮・転送機能あり)、AliceVNC(圧縮・転送機能なし)の木の段数1~3の測定を行った。 | |
351 | |
352 \textbf{実験内容} | |
353 | |
354 ルートノードから画面データを子ノードに伝搬する際に、計測用のヘッダをつけたパケットトを子ノードに送信する。 | |
355 各子ノードはパケットを受け取り自身のViewerに画面データを表示すると同時に、計測用ヘッダ部分のみのDSを作成し、親ノードに送り返す(図 \ref{fig:mesure}) 。 | |
356 計測用DSは木を伝ってルートノードまで送り返され、ルートノードは受け取った計測用DSから到達時間を計算する。 | |
357 \begin{figure}[h] | |
358 \begin{center} | |
359 \includegraphics[width=70mm]{images/delay.pdf} | |
360 \end{center} | |
361 \caption{各ノードごとに到達時間を測定} | |
362 \label{fig:mesure} | |
363 \end{figure} | |
364 | |
365 計測用のヘッダは以下の要素で構成されている。 | |
366 \begin{table}[htbp] | |
367 \caption{計測用ヘッダの変数名の説明} | |
368 \label{tb:variable} | |
369 \begin{center} | |
370 \begin{tabular} {|l|l|} | |
371 \hline | |
372 変数名&説明\\ | |
373 \hline | |
374 time&ルートノードがパケットを送信した時刻\\ | |
375 \hline | |
376 depth&木の段数。初期値=1。\\ | |
377 \hline | |
378 dataSize&送信時の形式に変換済みの画面データのサイズ\\ | |
379 \hline | |
380 \end{tabular} | |
381 \end{center} | |
382 \end{table} | |
383 timeにはパケットの送信時刻を、dataSizeには画面データのサイズを付けて送信する。 | |
384 今回、TreeVNCとAliceVNC(圧縮・転送機能あり)では圧縮形式の画面データのサイズを、AliceVNC(圧縮・転送機能なし)ではMessegePack形式でのサイズをdataSizeにセットする。 | |
385 depthは各ノードに到達するごとにインクリメントされる。 | |
386 | |
387 計算方法をソースコード \ref{src:mesurement}に示す。 | |
388 到達時間は、計測用DSを受け取った時刻とDSのtime(送信した時刻)の差をとる。 | |
389 この到達時間は画面データがノードまで到達した時間と計測DSをルートまで送り返す時間を含めているが、送り返す時間は誤差として考える。 | |
390 また、depthは各ノードに到達するごとにインクリメントされるため、送り返す際もインクリメントされる。そのため、木の段数を計算するにはdepthを1/2した値となる。 | |
391 | |
392 \begin{table}[html] | |
393 \lstinputlisting[label=src:Mesurement, caption=到達時間・木の段数の計測方法]{source/mesurement.java} | |
394 \end{table} | |
395 | |
396 \textbf{実験結果} | |
397 | |
398 木の段数ごとに散布図を示す(図\ref{fig:TreeVNC_delay} ~ \ref{fig:AliceVNC_notcompress_delay})。 | |
399 X軸が画面データのサイズ(byte)、Y軸が計算した到達時間(ms)である。 | |
400 実験時間の都合上、AliceVNC(圧縮・転送機能あり)の計測時間が他より短くなってしまったためプロットされた点の数が少なくなっている。 | |
401 また、それぞれ3段目の図で処理に10秒以上かかっている点の集合が見られるが、これは今回の実験において3段目にPCのスペック上処理が遅いノードが1台あったためである。そのため比較においてこの点集合は無視する。 | |
402 | |
403 どの図も同様の傾向があり、画面データのサイズが小さいうちは処理時間も5ms程度だが、50000byte以上から比例して処理時間も遅くなっている。このことからAliceVNCはTreeVNCと同等の処理・同等の性能があることがわかる。 | |
404 | |
405 また、AliceVNCを圧縮機能の有無でデータサイズ比較すると、圧縮機能のないAliceVNCはデータサイズがほとんど1000byte以上なのに対し、圧縮機能のあるAliceVNCではTreeVNC同様10byte程度のサイズに抑えることに成功している。 | |
406 | |
407 さらに転送機能の有無で比較した場合、転送機能がないAliceVNCでは木の段数に関係なく1000ms近く到達に時間がかかってしまっているが、転送機能のあるAliceVNCではデータサイズが大きくなっても100ms程度に抑えられている。 | |
408 このことから、圧縮・転送のMeta Computationは分散通信において有用であると言える。 | |
409 \newpage | |
410 \begin{figure}[h] | |
411 \begin{center} | |
412 \includegraphics[width=70mm]{images/TreeVNC_depth1.pdf} | |
413 \includegraphics[width=70mm]{images/TreeVNC_depth2.pdf} | |
414 \includegraphics[width=70mm]{images/TreeVNC_depth3.pdf} | |
415 \end{center} | |
416 \caption{TreeVNCの測定結果} | |
417 \label{fig:TreeVNC_delay} | |
418 \end{figure} | |
419 | |
420 \newpage | |
421 \begin{figure}[h] | |
422 \begin{center} | |
423 \includegraphics[width=70mm]{images/AliceVNC_notcompress_depth1.pdf} | |
424 \includegraphics[width=70mm]{images/AliceVNC_notcompress_depth2.pdf} | |
425 \includegraphics[width=70mm]{images/AliceVNC_notcompress_depth3.pdf} | |
426 \end{center} | |
427 \caption{AliceVNC(圧縮・転送機能なし)の測定結果} | |
428 \label{fig:AliceVNC_notcompress_delay} | |
429 \end{figure} | |
430 | |
431 \newpage | |
432 \begin{figure}[h] | |
433 \begin{center} | |
434 \includegraphics[width=70mm]{images/AliceVNC_compress_depth1.pdf} | |
435 \includegraphics[width=70mm]{images/AliceVNC_compress_depth2.pdf} | |
436 \includegraphics[width=70mm]{images/AliceVNC_compress_depth3.pdf} | |
437 \end{center} | |
438 \caption{AliceVNC(圧縮・転送機能あり)の測定結果} | |
439 \label{fig:AliceVNC_compress_delay} | |
440 \end{figure} | |
441 \newpage | |
442 | |
443 \subsection{コードの比較} | |
444 \textbf{コード量} | |
445 | |
446 TreeVNCとAliceVNCのコード量を比較した表が表\ref{tb:code}である。 | |
447 TightVNCを含むコード全体にwcを行い、行数と単語数を比較した。 | |
448 また、hg diffでTightVNCからの変更行数を調べ変更量を比較した。 | |
449 | |
450 表からわかるように、Aliceを用いればコードの行数が25\%削減できる。 | |
451 また、TreeVNCではTightVNCに大幅に修正を加えながら作成したため仕様の変更が多かった。 | |
452 しかし、AliceVNCではTightVNCにほとんど修正を加えることなくトポロジー構成等のAliceのMeta Computationを使うために新しいクラスを作成したのみであった。 | |
453 そのためTreeVNCに比べ75\%も仕様の変更が抑えられている。 | |
454 \begin{table}[htbp] | |
455 \caption{コード量の比較} | |
456 \label{tb:code} | |
457 \begin{center} | |
458 \begin{tabular} {|l|l|l|l|} | |
459 \hline | |
460 &行数&単語数&変更行数\\ | |
461 \hline | |
462 TreeVNC&19502&73646&7351\\%11369+8133=19502,47010+26636,2094+5257 | |
463 \hline | |
464 AliceVNC&14647&59217&1129\\%689+7094+6864=14647,23035+34610+1572,689+395+45 | |
465 \hline | |
466 減少率(\%)&25&20&75\\ | |
467 \hline | |
468 \end{tabular} | |
469 \end{center} | |
470 \end{table} | |
471 | |
472 | |
473 \textbf{コードの複雑度} | |
474 | |
475 コード量の比較で述べたように、TreeVNCはTightVNCからの変更が多い。 | |
476 その理由の一つがトポロジーの構成や通信処理がコアな仕様と分離できておらず、 | |
477 そのためTreeVNCは大変複雑な記述になってしまっている。 | |
478 | |
479 そこでTreeVNCとAliceVNCにおいてコードの複雑度を比較した。 | |
480 今回、複雑度の指標としてThomas McCabeが提案した循環的複雑度\cite{complaxy}を用いた。 | |
481 循環的複雑度とはコード内の線形独立な経路の数であり、if文やfor文が多ければ複雑度も高くなる。 | |
482 一般的に、循環的複雑度が10以下であればバグ混入率の少ない非常に良いコードとされる。 | |
483 計測にはIntelliJのCodeMetrics計測プラグインであるMetricsReloadedを使用した。 | |
484 | |
485 表\ref{tb:complex}はTightVNC、TreeVNC、AliceVNCにおける循環的複雑度の比較である。 | |
486 プロジェクト全体でのクラスの複雑度の平均値と最高値をとった。 | |
487 平均値・最高値ともにAliceVNCのほうが複雑度が低いことから、Aliceではシンプルな記述が可能だということがわかる。 | |
488 また、TreeVNCで最高値を出したTreeRFBProto.classは全てプログラマが記述したコードであり、通信処理や画面データの読み込みなどの記述が入り組んで書かれている。 | |
489 しかし、AliceVNCで最高値を出したSwingViewerWindow.classはTightVNCで最高値を出したクラスと同じであり、コード量の比較でも示したようにAliceVNCで変更を加えた点がほとんどない。つまりこの複雑度は元来TightVNCが持っている複雑度と言える。 | |
490 | |
491 \begin{table}[htbp] | |
492 \caption{複雑度の比較} | |
493 \label{tb:complex} | |
494 \begin{center} | |
495 \begin{tabular} {|l|l|l|} | |
496 \hline | |
497 &平均値&最高値\\ | |
498 \hline | |
499 TightVNC&13.63&97\\ | |
500 \hline | |
501 TreeVNC&15.33&141\\ | |
502 \hline | |
503 AliceVNC&10.95&99\\%(4.12+13.64)/2 (4.12+9.16+19.59)/3 | |
504 \hline | |
505 \end{tabular} | |
506 \end{center} | |
507 \end{table} | |
508 | |
509 AliceVNCとTreeVNCの性能比較・コード比較から、AliceVNCはTreeVNCと同等の性能を持つ分散アプリケーションの記述ができ、かつコードの修正量・複雑度共に低く抑える能力を有することがわかった。 | |
510 | |
511 \subsection{他言語・フレームワークとの比較} | |
512 \textbf{Erlang} | |
513 | |
514 \textbf{Akka} | |
515 | |
516 \textbf{?} | |
517 | |
518 | |
519 | |
520 \section{まとめ} | |
521 並列分散フレームワークAliceの計算モデルと実装について説明を行い、Aliceにおけるプログラミング手法を述べた。 | |
522 | |
523 Aliceが実用的なアプリケーションを記述するために必要なMeta Computationとして、データの多態性を実現し、指定するDSMの切り替えで扱うデータ表現を変えるようにした。 | |
524 これにより、必要に応じた形式を扱うことができ、ユーザが記述するComputation部分を大きく変えずに自由度の高い通信を行うことが可能になった。 | |
525 同様の手法を用いれば、圧縮形式以外にも暗号形式・JSON形式などの複数のデータ表現をユーザに扱いやすい形で拡張することができる。 | |
526 Aliceに圧縮等のMeta Computationを追加したことで、AliceVNCではシンプルな記述でTreeVNCと同等の性能を提供できると期待される。 | |
527 | |
528 今後の課題としては、圧縮機能をAliceVNCで用いることでMeta Computationの有効性を測る必要がある。 | |
529 また、AliceのMeta ComputationにProxy機能を実装することで、TreeVNCでは実装が困難であったNAT越えの機能を提供できると期待される。 | |
530 | |
531 | |
532 | |
533 \nocite{*} | |
534 \bibliographystyle{ipsjunsrt} | |
535 \bibliography{prosym} | |
536 | |
537 | |
538 \end{document} |