annotate paper/chapter6.tex @ 26:aec4085dd5db

update
author Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
date Tue, 04 Feb 2014 03:50:01 +0900
parents 2d6118b66367
children 7149e38f717c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \chapter{画面共有システムTreeVNCの評価}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 \section{実験環境}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 TreeVNCは多人数の同時接続を可能にするソフトウェアである。よって、評価を行うためには多数のコンピュータが必要となる。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 今回は、学科の並列計算環境とOSの授業の時間を使用させてもらって実験を行った。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 使用した並列計算環境を表\ref{tab:cluster_spec}に示す。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 \begin{table}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 \caption{検証に利用するVMWareクラスタの仕様}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 \label{tab:cluster_spec}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 \begin{tabular}{|c||c|} \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 名前 & 概要 \\ \hline \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 CPU & Intel(R) Xeon(R) CPU X5650@2.67GHz \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 物理コア数 & 2 \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 論理コア数 & 4 \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 CPUキャッシュ & 12MB \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 Memory & 8GB \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 OS & CentOS 5.8 \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 HyperVisor & VMWare ESXi \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 \end{tabular}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 \end{table}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 \subsection{CUI Versionの作成}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 TreeVNCはGUI(Graphical User Interface)を使用したアプリケーションである。並列計算環境はCUI(Character User Interface)なので、そのままだと実行することができない。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 そこで、TreeVNCからGUIを使用している部分を取り除いてCUI環境で実行できるようにする必要があったので作成することにした。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 Listing\ref{src:tree}はTreeVNCのMain文の一部である。ここで継承されているJAppletは、GUIのコンポーネントなので、このクラスを使用するとCUI環境で実行することができない。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 CUI環境で実行するにはJAppletを継承していないクラスを作成する必要があるが、Listing\ref{src:getclass}のようなViewerクラスを受け渡す場所をすべてでCUIとGUIのクラスに対応しなければならない。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 この問題に対して、CUIとGUIの共通Interface(Listing\ref{src:interface})を作成し、このInterfaceを利用することで解決した。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 \begin{lstlisting}[language=java,frame=lrbt,label=src:main,caption=TreeVNCのMainClass,numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 public class Viewer extends JApplet implements Runnable, WindowListener
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 final ConnectionView connectionView = new ConnectionView(Viewer.this,
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 connectionPresenter, hasJsch);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 \begin{lstlisting}[language=java,frame=lrbt,label=src:getclass,caption=Viewerの受け取り,numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 public SwingViewerWindowFactory(boolean isSeparateFrame, boolean isApplet, Viewer viewer)
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 \begin{lstlisting}[language=java,frame=lrbt,label=src:interface,caption=ViewerImpl,numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 public interface ViewerImpl
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 public boolean getCuiVersion();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 public MyRfbProto getRfb();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 public void closeApp();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 public void run();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
55 \subsection{Capistrano}
26
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
56 今回の実験では、48台のサーバ上でCUI版のTreeVNCを立ち上げる必要がある。実験する度に、各サーバにログインしてアプリケーションを立ち上げるのは手間がかかりすぎてしまう。Capistranoを使用することで、この問題を解決することができる。\\
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
57 Capistranoは複数のサーバ上で同時に処理を実行するためのオープンソースなソフトウェアであり、Rubyを用いて作成されている。\\
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
59 Capistranoを実行する際に使用するスクリプトをListing\ref{src:capistrano}に示す。\\
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 スクリプトはListing\ref{src:cap_run}として実行することができる。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 \begin{lstlisting}[language=ruby,frame=lrbt,label=src:capistrano,caption=cap.rb,numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 set :user, "mass" //実行するユーザ
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 role :pall, "133.13.62.1" //ここに命令を送りたいマシンのアドレス
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 task :ls do // task名
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 run "ls -la" // 実行したい命令
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 end
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 \begin{lstlisting}[language=ruby,frame=lrbt,label=src:cap_run,caption=capistranoの実行,numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 % cap -f cap.rb ls
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 \section{木の深さによる遅延}
26
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
78 TreeVNCは、クライアントを木構造に配置し画像を配信している。
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 木の深さが深くなってしまうと、データが下に届くまでに遅延が発生してしまう可能性がある。
26
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
80 そこで、木の深さによる遅延がどの程度発生するのかを測定してみた。
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 \subsection{遅延の測定方法}
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
82 RFBプロトコルでは、送られてくるデータの先頭にどのような処理をするかの命令番号が入っている。\\
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 表\ref{tb:message}は送られてくるメッセージの一覧である。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 命令番号11(CheckDelay)はプロトコルを拡張して作成した命令である。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 \begin{table}[htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 \caption{Rfbプロトコルと追加したメッセージ一覧}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 \label{tb:message}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 \begin{tabular}{|c||c|c|} \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 命令番号 & 名前 & 説明 \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 0 & FrameBufferUpdate & 画像の更新情報\\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 1 & SetColourMapEntries & ピクセルフォーマットでColour Mapを使用\\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 2 & Bell & ビープ音機能\\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 11 & CheckDelay & 画像が届くまでのDelayを測定\\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 \end{tabular}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 \end{table}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
26
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
100 Listing\ref{src:delay_cli}、Listing\ref{src:delay_serv}は遅延を測るためのプログラムである。\\
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
101 Root NodeはSystem.currentTimeMillis()を用いて時間を取得し、Nodeへ送信する。
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
102 System.currentTimeMillis()は、システムの現在時刻をミリ秒(long型の数値)で取得する関数である。
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
103 Nodeはこの値を受け取ると、そのままサーバへ受け取った値を返す。
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 Root Nodeはクライアントからの返信を受け取るとSystem.currentTimeMillis()を取り、差分を出してDelayを求める。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 遅延を測る頻度は、画像を50回送信するごとに1回である。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 \begin{lstlisting}[language=java,frame=lrbt,label=src:delay_cli,caption=遅延を測るプログラム,numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 BufferedReader is = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 DataOutputStream os = new DataOutputStream(echoSocket.getOutputStream());
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 os.writeBytes("checkdelay\n");
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 os.writeBytes(String.valueOf(buf.getLong(16))+"\n");
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 \begin{lstlisting}[language=java,frame=lrbt,label=src:delay_serv,caption=遅延を測るプログラム,numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 Long delay = System.currentTimeMillis()-Long.parseLong(is.readLine());
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 \subsection{遅延の測定結果}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 2分木で木を構成した場合、Node数が48台だと深さが6となる。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 Root Nodeを起動し、並列計算環境48台を起動し、Root Nodeから一番下のNodeまでどのくらいの時間がかるのかを測定した。\\
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
120 \ref{tab:delay} はデータを20回ほど測定し最遅値を取った遅延の表である。\\
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 \begin{table}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 \caption{データ送信の遅延}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 \label{tab:delay}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 \begin{tabular}{|c||c|} \hline
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
126 段数 & 最遅値 \\ \hline \hline
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
127 2 & 32ミリ秒\\ \hline
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
128 4 & 244ミリ秒\\ \hline
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
129 6 & 446ミリ秒\\ \hline
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 \end{tabular}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 \end{table}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133
26
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
134 \begin{figure}[!htbp]
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
135 \begin{flushleft}
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
136 \includegraphics[scale = 0.8]{images/graph-lost.pdf}
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
137 \end{flushleft}
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
138 \caption{
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
139 段差(step)によるデータの遅延
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
140 }
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
141 \label{fig:graph-late}
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
142 \end{figure}
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
26
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
145 並列計算環境のVMは高速なネットワークでつながっているので、遅延が少ない可能性がある。
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
146 そこで、実際にOSの授業で、どの程度の遅延があるのかを測定してみた。\\
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
147 OSの授業のときは25Nodeであったので、段数にすると5段である。
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
148 結果は、164ミリ秒と並列計算環境より良い結果が出た。
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149
26
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
150 図\ref{fig:graph-late} は遅延の分布を示したヒストグラムである。X軸は試行の回数で、Y軸は遅延(ミリ秒)を表している。\\
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
151
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
152
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
153 \newpage
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 \section{画面のフリーズ}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 データがTimeOutによってどの程度損失しているのかを調べてみた。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 今回、測定するために画像データのヘッダーの前にシリアルナンバーを付加した(Listing\ref{src:serial})。これによりNode側は、順番通りに画像が来なかった場合、データが損失したことを知ることができる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 Node側の確認用コードをListing\ref{src:timeout}に示す。このコードはRoot Nodeから流れてきたデータを受け取り自分の持っているcheckCounterと比較して、違う値が出ていればデータが損失していることになる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 \begin{lstlisting}[language=java,frame=lrbt,label=src:serial,caption=データの確認プログラム(Root Node側),numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 ByteBuffer serialNum = ByteBuffer.allocate(8);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 serialNum.putLong(counter++);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 serialNum.flip();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 bufs.addFirst(serialNum);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 multicastqueue.put(bufs);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 \begin{lstlisting}[language=java,frame=lrbt,label=src:timeout,caption=データの確認プログラム(Node側),numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 private void getLost(Reader reader)
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 try
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 long num = reader.readInt64();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 if(num != ++checkCounter) {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 System.out.println("LostData:"+(num - checkCounter));
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 checkCounter = num;
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 } catch (TransportException e) {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 e.printStackTrace();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 現在の実装では、0.625秒データの読み込みがなければ、データをTimeOut Threadが読み込み、Node側には順番通りのデータが行かなくなるので画面がフリーズしたように見える。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 実験の結果、6段目のNodeでデータを受け取って表示してみた結果、データが損失するのを見ることができなかった。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 データがロストしなのは良いことであるが、その分Root Nodeのメモリ上にデータがあるので、Root NodeがMemoryOverFlowを起こす可能性がある。私のディスプレイ環境(1920*1080)では、MemoryOverFlowが起こることはなかったが、Retinaディスプレイなどの高解像度ディスプレイを使用している場合は、MemoryOverFlowを起こす可能性がある。TimeOutの時間は今後調整が必要である。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 \section{分木の最適化}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 木の分木数が少ないほうが一つ一つのコンピュータにかかるCPU負荷が少なくなる。しかし、分木数を少なくしてしまうと、Nodeが増えたとき、木の深さが深くなり、データの伝搬に遅延が起こる可能性がある。
26
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
191 上記の実験の結果、木の深さが6のときのデータ伝搬に最遅446ミリ秒(0.446秒)の遅延しか起こっていなく、データの欠損も見られなかった。
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 分木数を変更してもコネクションの数はかわらないし、スイッチに対する負荷も変わらない。よって、100人程度で使用する場合は2分木が最適であるということがわかった。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 \section{ZRLEとZRLEEのデータ圧縮率の比較}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 作成したTreeVNCでは、従来のVNCで使用されているエンコードを使用しておらず、独自で作成しているZRLEEエンコードを使用している。\\一見ZRLEは辞書が一つでZRLEEは辞書が一つ一つの画像データに付加されていて、データ量はZRLEEのほうが多くなってしまっている可能性があるので、ZRLEEとZRLEのデータ量にどの程度の差が出るのかを調べてみた。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 全く圧縮されていないRAWデータ,Zlib圧縮を使用しているZRLEE、ZRLEのデータ量の比較を行った。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 図6は1920 * 1080の画面の全描画にかかるデータ量を測った結果を示した図である。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 ZRLEEの方がデータ量が少なくですんでいる(図\ref{fig:compare_encoding})。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 これは、ZRLE(Zlib)が初めに送られた辞書を用いての解凍が余り有効的に働いていない場合があるからだと思われる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 つまりVNCの場合はZRLEEの様に毎回辞書のデータを付加させて送ってもデータ量に差がでない可能性があることが分かった。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 \includegraphics[scale = 0.8]{images/compare_encoding.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 \caption{
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 RAW,ZRLE,ZRLEEによる1画面(1920*1080)描画にかかるデータ量。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 x軸はピクセル数、y軸はバイト数を表している。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 \label{fig:compare_encoding}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 \newpage
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 \section{VNC Reflectorとの比較}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 TreeVNCを用いて、Vnc Reflectorとの比較を行った。並列計算環境のVM48台を使用し、Bladeサーバの外にTreeVNCとVnc Reflectorを起動させたPCを置き、VM48台にアクセスさせ実験を行った。一極集中型の Vnc Reflectorは、48台繋がった時にスループットが2MBpsから5KBpsへ下がっていた、一方、TreeVNCのスループットは48台繋がっている状態でも2MBpsを保つことができていた。一極集中型で繋がっているVNC Reflectorと違い、TreeVNCは48台のアクセスを複数の通信網へ分散しCPU負荷をNode側の分散したいるので、人数が増えてもスループットを落とすことなくアプリケーションを実行することができる。