annotate paper/evaluation.tex @ 6:d2f357e68afe

Chapter 5
author fuchita
date Thu, 14 Feb 2008 09:07:37 +0900
parents c6eefabf35c0
children f249657a801d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
1 \chapter{分散デバッグ機能と評価}
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
2 4章にてJava言語によるLindaサーバーとLinda APIの実装を行った事を報告した。
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
3 Java言語による実装を得た事により、Federated Lindaへの機能拡張を比較的容易に行う事が可能となった。
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
5 Federated LindaによるCompact Routingの実験においては、ルーティングテーブルの構築を例に、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
6 分散環境でのスケーラビリティをもった実装を確認しようとしたが、現状のLindaの実装では個々のノードが
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
7 どのような通信状態をもってスケーラビリティを達成するのか明確に確認することが困難なばかりか、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
8 meshトポロジにおける実験においてはどのような通信状態によってノード全体のスケーラビリティが低下
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
9 しているのかを確認するすべが存在しなかった。これを解決する為には、Federated Lindaの通信を阻害せずに
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
10 大域的な情報でデバッグが行えるインターフェースが必要である。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
11
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
12 よって本章では分散環境におけるデバッグの難しさと分散デバッグに必要な機能について説明し、
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
13 そのうちから通信状態のスケーラビリティを確認するという点において、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
14 Federated Lindaでの分散開発環境におけるデバッグ機能の追加を行う。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
15 本論文でFederated Lindaに追加する分散デバッグ機能のアプローチは、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
16 4章で必要性を述べた通信状態のデバッグをJava版Linda サーバーへの拡張を行う事で実現するものである。
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
17
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
18 %分散アルゴリズムのデバッグの難しさ
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
19 %逐次アルゴリズムのデバッグ手法 ーー二分法
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
20 %gdbの全ノードへの手法による限界、ログをprintfするのではダメ
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
21 %デバッグする対象 デッドロック、ライブロック、スケーラビリティ、通信の集中、大量のパケット(ACK)
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
22 %個々の部品が正しく動いていても全体として正しく動かない場合がある。二分法は無力、
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
23 %スナップショットがあれば二分法が使える、量はかなり多い、デッドロックの検出も可能、循環した依存性の検出
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
24 %分散デバッガでおかしなぶぶんを見つけて、入力タプルと出力タプルを特定
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
25 %そうすれば逐次型でデバッグできる
5
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
26 %重要なのはスナップショット、便利
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
27 %分散デバッグアルゴリズム自体がスケールしなければいけない、一カ所にデータを集めるのはいけない
5
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
28 %通信の集中は統計で見れる-> 今回はコレ
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
29 %ビジュアライゼーション、意味不明なprintfを視覚的に
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
30
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
31 \section{分散環境におけるデバッグ}
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
32 分散環境における分散プログラムのデバッグは逐次型プログラムに比べて困難である。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
33 それは、一般的に用いられるgdbやIDE(統合開発環境)のデバッガが逐次プログラムをデバッグする為に
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
34 機能を提供するのに対して、分散プログラムには、一般的なデバッガではデバッグが困難な特徴が
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
35 存在する為である。
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
36
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
37 ここでは一般的なデバッガを用いた二分法によるデバッグ手法と、分散プログラム開発での
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
38 シーケンシャルなデバッグ手法では解決困難な問題点について説明する。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
39 \newpage
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
40 \subsection{二分法による逐次アルゴリズムのデバッグ}
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
41 一般的なgdbやIDEのデバッガ等を用いた二分法での逐次アルゴリズムのデバッグは、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
42 プログラムの単体試験や結合試験工程では大変有効な手法である。
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
43
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
44 特にこの手法を用いるのにおいて適している状況は、プログラムにおけるバグの存在が既知であり、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
45 そのバグを生じさせることが確実であるという場合である。以下に二分法の基本的な方法を示す。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
46
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
47 \begin{center}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
48 \begin{itembox}[l]{二分法によるデバッグ}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
49 {\small
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
50 \begin{center}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
51 \begin{verbatim}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
52 [条件定義]
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
53 ・バグは既知であり、再現性があること
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
54 ・バグはプログラムの状態(大域変数と局所変数の値)から判断できること
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
55
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
56 [二分法]
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
57 1. プログラムの初期実行をα = s0とする
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
58 2. バグが発生している時点の実行ステートメントを β = sN とする
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
59 3. N' = N/2 とし sN'のプログラムの状態にバグがあるかどうかを調べる
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
60 4. バグがあるかないかによってα = sN'またはβ = sN'とする
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
61
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
62 5. 上記を繰り返す事により α +1 = β となる
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
63 6. これにより、バグが存在する時点の実行ステートメントとプログラムの状態を得る
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
64 \end{verbatim}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
65 \end{center}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
66 }
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
67 \end{itembox}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
68 \end{center}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
69
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
70 上記の手法は簡単ながらも非常に強力なデバッグ手法であり、半ば自動化された作業によってバグの特定を
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
71 可能とする。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
72 しかし、分散プログラムの開発工程においては、上記の手法では解決困難な状況が存在する。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
73 次は、そのような状況についてFeederated Lindaの通信状態のデバッグを例に説明する。
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
74 \subsection{シーケンシャルなデバッグ手法の問題点}
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
75 二分法を用いたシーケンシャルなデバッグ手法を前述したが、分散アルゴリズムの開発においては、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
76 二分法では解決できない状況が存在する。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
77
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
78 その状況とは、分散環境の各ノード、つまり全体を構成する個々の部品が正しく動いていても、全体としては
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
79 正しく動かないという状況が存在する事を指す。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
80
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
81 ここで、Federated Lindaの通信状態を例にシーケンシャルなデバッグ(つまり単体の部品のデバッグ)が
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
82 有効な場合と、単体のシーケンシャルなデバッグでは全体の動作の正しさをデバッグできない例をそれぞれ
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
83 示す。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
84
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
85 \newpage
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
86 \subsubsection{単体のデバッグが有効な例}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
87 図ref{seqdeb}に示すのはFederated Lindaにおける通信にて、単体のプロセスに対する逐次デバッグが
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
88 有効な場合の通信状態である。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
89 この通信の場合においては1つのInputに対して1つのOutputを持つプロセスのデバッグを行う事で、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
90 全体の動作に関係する通信の流れをとらえることが可能であるからである。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
91 \begin{figure}[htbp]
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
92 \begin{center}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
93 \includegraphics[width=8cm]{fig/pdf/seqdeb.pdf}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
94 \caption{単体のデバッグが有効なFederated Lindaの通信}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
95 \label{seqdeb}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
96 \end{center}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
97 \end{figure}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
98
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
99 \vspace{-1cm}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
100 \subsubsection{単体のデバッグでは全体の正しさをデバッグできない例}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
101 続いて図\ref{nonseqdeb}に示すのはFederated Lindaにおける通信で、単体のデバッグでは全体の正しさを
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
102 デバッグできない例である。なぜ全体の動作に対する正しさをデバッグできないかというと、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
103 図に示すデバッガを接続したプロセスが1つのInputに対して1つのOutputを正しく出力する事がデバッグ
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
104 できても、デバッグを行ったプロセスとは関係しない通信の流れが存在する為に、プロセスの全体の通信に対
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
105 する依存性をデバッグできない為である。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
106
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
107 \begin{figure}[htbp]
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
108 \begin{center}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
109 \includegraphics[width=8cm]{fig/pdf/nonseqdeb.pdf}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
110 \caption{単体ではデバッグが困難なFederated Lindaの通信}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
111 \label{nonseqdeb}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
112 \end{center}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
113 \end{figure}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
114
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
115 このような個々のプロセスをデバッグしただけでは全体の正しさが分からない場合、gdbやIDEのデバッガとい
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
116 った逐次デバッガを全ノードに対して接続することが考えられるが、このような手法は全体を構成するノード
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
117 が大規模化した場合においてその手間やリソースの集中におけるスケーラビリティの低下や、一度に大量の
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
118 デバッグ情報が取り扱われる為に、その中から求めている情報を取捨選択することの困難さ等が問題となる
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
119 ので、全ての分散環境におけるデバッグの手法としては正しくない。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
120
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
121 また、デバッガによるプロセスの停止によってネットワークの遅延や送信データの喪失が起これば、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
122 全体の通信の同期に必要とされるデータが揃わないまま同期を取ることになる。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
123 そうなると本当の意味での同期が取られていないということになり、バグ再現の為の条件が一定の通信状態
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
124 を要求する場合において問題がある。
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
125
6
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
126 \section{分散デバッグ機能の検討}
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
127 これまで二分法による逐次アルゴリズムのデバッグと分散環境におけるデバッグの問題点を述べた。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
128 ここでは、Federated Lindaに必要なデバッグ機能を提案するために、分散アルゴリズムにおいてデバッグ
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
129 すべき要素を挙げ、それらをデバッグ可能な機能としてスナップショットを用いた分散デバッグを説明する。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
130 %また、Federated Lindaを用いる事でスケーラビリティを持った分散デバッグ機能を実現することについても
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
131 %述べる。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
132 \subsection{分散アルゴリズムにおいてデバッグすべき対象}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
133 %デバッグする対象 デッドロック、ライブロック、スケーラビリティ、通信の集中、大量のパケット(ACK)
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
134 分散アルゴリズムにおいてデバッグすべき対象には以下のものがある。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
135 {\large
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
136 \begin{center}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
137 \begin{verbatim}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
138 ・デッドロック
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
139 ・ライブロック
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
140 ・スケーラビリティ
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
141 ・通信の集中
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
142 ・大量のパケットの送信
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
143 \end{verbatim}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
144 \end{center}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
145 }
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
146 \subsubsection{デッドロック}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
147 デッドロックとは、あるプロセスが永遠にブロックされている状態を示す。そのプロセスはある条件が
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
148 真になる(例えばある資源がreadできるようになる)のを待っているが、その条件を真にするはずの別の
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
149 プロセスがその条件を執行しないが為に、どちらも何もできなくなるのである。
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
150
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
151 Federated Lindaにおけるプロセスの通信は、porlingベースの通信ループを持ち、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
152 通信のパケットは一旦キューに溜め、ある一定のタイミングでまとめて通信を行うことから明確な「待ち」
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
153 というプロセス状態は発生しないが、ユーザープログラムによる「待ち」処理記述の可能性からデッド
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
154 ロックの検出は必要である。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
155
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
156 \subsubsection{ライブロック}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
157 ライブロックはデッドロックと異なり、プロセスは実行状態にあるものの、適用されるべきプログラム状態
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
158 の変化が何も成し遂げられない状態を指す。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
159
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
160 例としてFederated Lindaにおけるプロセス間通信で説明すると、あるルーティングテーブルの構築に対
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
161 して2つのプロセスがそれぞれルーティング情報を保持しており、それぞれが相手のプロセスの
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
162 保持するルーティング情報を必要としている場合に、両者が相手のルーティング情報を得る為に自身
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
163 の保持する情報を解放した場合が考えられる。当然ながら、この両方のプロセスは相手の情報を期待して
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
164 いる為に実質的に何も達成できないという状態になる。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
165
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
166 \subsubsection{スケーラビリティ}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
167 スケーラビリティとは、サービスを受けるユーザー数が小規模から大規模に変化しても同じ様に同等
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
168 の能力を発揮できるという性能基準のことである。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
169
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
170 Federated Lindaにおけるスケーラビリティの確認は、前提としてはノード数の増加に対する
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
171 プログラムの実行速度やサービス提供能力のパフォーマンスを、実際のアプリケーションを用いて
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
172 行う事があるが、現在の様に開発途中の段階では、部分的なプログラムの動作を見てその領域における
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
173 スケーラビリティを検証することが必要である。その点においてデバッグインターフェースによる
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
174 スケーラビリティの測定を可能とする事は重要であると考えられる。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
175
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
176 \subsubsection{通信の集中}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
177 分散プログラムの開発段階においては、通信の集中によるバグの発生は常に起こりうる事態である。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
178 事実、Federated LindaによるCompact Routingの実装では、ある1つのノードに対してルーティング情報が
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
179 集中的に転送されるというバグが発生した。しかもそのようなバグは通常の逐次デバッガを用いた
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
180 デバッグ手法では、パケット集中を行っている複数のノードに対して複合的なバグ原因を検証することは
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
181 困難である。やはりこのような事態をデバッグするには従来の逐次デバッグとは異なる、分散デバッグ
5
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
182 インターフェースをもってデバッグを行う事が必要と考える。
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
183
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
184 \subsubsection{大量のパケットの送信}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
185 前述した通信の集中とは逆に、大量のパケットを単体、または複数のノードに対して通常とは異なる
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
186 量で送信するバグも起こりうる。このような場合、大量のパケットによる多ノードへの通信集中はもち
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
187 ろん、送信したノードからのACKnowledgementが大量にネットワーク内に流れる事による、通信効率の
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
188 低下や輻輳の発生を生み出す可能性がある。この問題をデバッグする為には、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
189 プログラムが停止してからではデバッグできない事から、
5
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
190 輻輳を発生させているプロトコルを動的に検知する必要がある。%###シスコのルーターはそうやってる###
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
191 やはり、この場合も通常の逐次デバッガでは検知が困難なことから、分散デバッグインターフェースを
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
192 用いてデバッグを行う事が望ましいと考える。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
193
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
194
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
195 \subsection{スナップショットによる分散デバッグ}
5
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
196 %スナップショットがあれば二分法が使える、量はかなり多い、デッドロックの検出も可能、循環した依存性の検出
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
197 %分散デバッガでおかしなぶぶんを見つけて、入力タプルと出力タプルを特定
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
198 %そうすれば逐次型でデバッグできる
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
199 %重要なのはスナップショット、便利
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
200 %分散デバッグアルゴリズム自体がスケールしなければいけない、一カ所にデータを集めるのはいけない
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
201
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
202 現在主に用いられている単体の逐次デバッガは分散環境用に作られていないことから、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
203 分散環境でのデバッグの場合、1プロセスに対してデバッガを動かすか、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
204 複数プロセスに対してそれぞれデバッガを動かしてデバッグを行うかの
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
205 どちらかのスタイルがとられると述べたが、これではデバッグすべきプロセスが増えるとその
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
206 手間はかなりの物になり、現実的なデバッグ手法とは言えない。
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
207
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
208 また、分散プログラム環境下ではプログラム状態の非決定性が存在するため通常のデバッグには無い
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
209 問題があることも述べた。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
210 シーケンシャルなデバッグ手法では、通信の到着順序によっても分岐が変化してしまうことから、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
211 デバッグ対象のエラーに対して再現性を確保するのが難しいという問題である。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
212 通常、分散環境下でのデバッグではこれらの点をふまえて、
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
213
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
214 \begin{itemize}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
215 \item {通信におけるプログラムの状態が決定的になるようテストする}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
216 \item {非決定性をシミュレートする}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
217 \item {バリア同期で通信を止めてメモリ等の状態を調べる}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
218 \item {各ノードでスナップショットを取得し、ログを解析する}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
219 \end{itemize}
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
220
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
221 といった方法がとられる。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
222
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
223 今回、Federated Lindaを用いた分散プログラム開発の為のデバッグインターフェースを考えるにあたって、
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
224 上記のうちから「各ノードでスナップショットを取得し、ログを解析する」という手法が最も適している
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
225 と考える。
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
226
5
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
227 その理由は、スナップショットを用いる事で、Federated Lindaにおける各ノードの通信を止める事無く
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
228 デバッグに必要なプログラムの状態を確認できるという点と、各ノードの大域的な状態を保存する事で
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
229 先に述べた「分散アルゴリズムにおいてデバッグすべき対象」をそれぞれデバッグすることが可能となる
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
230 からである。
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
231
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
232 以下で大域的な状態とはどのような物かを説明し、どのようにスナップショットを用いたデバッグインタ
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
233 ーフェースを用いるべきかを説明する。
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
234
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
235 \subsubsection{大域的なプログラム状態とは}
6
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
236 Federated Lindaにおける大域的なプログラム状態には二つの要素があり、各ノードのメモリ状態
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
237 (あるいはそれに類するデータ構造)を持つ事を第一としている。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
238 このメモリ状態を各スナップショットでのタイミングごとに正確に
5
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
239 取得することにより、プログラムの大域変数や局所変数を用いたバグの特定を可能とする。
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
240
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
241 例えば、
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
242 先に述べた様なデッドロックの原因となる排他ロックの要求及び保持を検出する検出器の作成を行い、
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
243 スナップショットのログからデッドロックの追跡を行う事。または、二分法を用いてバグの存在するプロ
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
244 グラムの実行ステートメントとプログラム状態を取得する事が可能となる。
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
245
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
246 また、大域的なプログラム状態の要素として第二に、スナップショットを取るタイミングで実行中の
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
247 プロセスが発行した通信に対する状態についても取得すべきと考える。スナップショット取得のタイミングで
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
248 考えられる通信の状態は4つのパターンに分類され、そのパターンとは、
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
249 \\
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
250 \begin{itembox}[l]{-}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
251 {\large
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
252 \begin{center}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
253 \begin{verbatim}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
254 スナップショット取得のタイミング = T
6
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
255 通信受信先でのスナップショット取得のタイミング = T'
5
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
256 \end{verbatim}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
257 \end{center}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
258 }
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
259 \end{itembox}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
260
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
261 とすると、
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
262 \begin{itembox}[l]{-}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
263 \begin{itemize}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
264 \item {Tの前にパケットを送信し、T'よりも早くパケットを受け取る場合}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
265 \item {Tの前にパケットを送信し、T'よりも遅くパケットを受け取る場合}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
266 \item {Tの後にパケットを送信し、T'よりも早くパケットを受け取る場合}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
267 \item {Tの後にパケットを送信し、T'よりも遅くパケットを受け取る場合}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
268 \end{itemize}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
269 \end{itembox}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
270
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
271 という4つのパターンである。
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
272
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
273 この、スナップショット取得のタイミングに対する通信の状態は、プロセスの再現性や、
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
274 プロセスの状態がある時点でどのように保たれているかを検知する上での同期処理に密接に関わってくる。
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
275 通信の状態を同期する処理が行えなければ、ネットワークを介し他のノードと通信を行っている分散
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
276 プログラムの大域的状態を取得する事は、プログラム状態の決定性に欠けることとなる。
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
277 よって、分散環境でのスナップショットを考えるにあたっては、上記4パターン通信状態を
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
278 どのように同期するかが重要である。
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
279
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
280 \subsubsection{スナップショットを用いた分散デバッグ手法}
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
281 %スナップショットがあれば二分法が使える、量はかなり多い、デッドロックの検出も可能、循環した依存性の検出
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
282 %分散デバッガでおかしなぶぶんを見つけて、入力タプルと出力タプルを特定
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
283 %そうすれば逐次型でデバッグできる
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
284
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
285 ここまで、スナップショットを用いて分散デバッグを行う事と、そのための大域的プログラム状態について
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
286 説明した。ここでは、分散環境で取得したスナップショットをどのように用いてデバッグを行うべきかを
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
287 検討する。
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
288
6
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
289 \subsubsection{スナップショットのモニターツールと逐次デバッガによるデバッグ}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
290 スナップショットを取得した場合、そのスナップショット・ログは膨大である。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
291 よって、実際にスナップショット・ログからデバッグを行う為には様々な切り口で
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
292 情報を取捨選択できるモニターツールが必要であると考える。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
293 図\ref{snapdeb}にスナップショットのモニタツールを用いたデバッグの様子を示す。
5
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
294
6
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
295 \begin{figure}[htbp]
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
296 \begin{center}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
297 \includegraphics[width=12cm]{fig/pdf/snapdeb.pdf}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
298 \caption{スナップショット・ログを用いたデバッグ}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
299 \label{snapdeb}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
300 \end{center}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
301 \end{figure}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
302
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
303 上記の図ではスナップショット・ログより、大域的プログラム状態の項で
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
304 説明したプログラムのメモリー状態とスナップショット取得のタイミングにおける通信状態を同期させる
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
305 ことによってFederated Lindaの大域的状態を取得している。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
306 また、同期されたスナップショット・ログをモニタツールという、ユーザーが必要なデバッグ情報を取捨
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
307 選択するツールを用いる事を考える。ユーザーはモニタツールを用いて(例えば二文法によるバグ箇所の
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
308 検知などを利用)、どのプロセスから出力と入力があったタプルにバグの原因があるのかを特定するこ
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
309 とができる。そうすれば、その後のバグの修正においては逐次デバッガによるデバッグが可能となる。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
310
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
311 \subsection{分散デバッグ機能のスケーラビリティ}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
312 全ノードに対してデバッグプロセスを走らせてデバッグを行うような
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
313 手法は、デバッグのインターフェースにおけるスケーラビリティを考慮してはいない。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
314
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
315 事実、システム資源の異なるノードに対してネットワークを介したリモートデバッグの手法は
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
316 数多く開発されていても、それが大規模システムを想定した分散プログラムに対してスケーラビリティを
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
317 保ったままデバッグ可能という解を得てはいない。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
318
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
319 Federated Lindaはタプルのリレーという、より分散プログラムを意識したモデルであることから、デバッグ
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
320 インターフェースの大域的状態の取得にもスケーラビリティを持った実装を目指す。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
321 その基本的なアイデアは、デバッグ情報を取得するインターフェースに対してもLindaプロトコルによるタプ
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
322 ルの伝搬を利用して実装するというものである。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
323
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
324 下図\ref{FDLindaDebug}に示すように、Federated Lindaを用いたデバッグインターフェースは、デバッガ
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
325 プロセスからあるノードに対してデバッグ情報の取得を指示するオペレーションを発行し、デバッグ情報の
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
326 取得を行うデバッグプロトコルとしてタプル間を伝搬させる。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
327 デバッガが受け取る結果はFederared Linda内のスナップショットとしての大域的状態であり、それを元に
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
328 デバッグを行う。このような仕組みをとる事で、大規模な分散プログラム環境であってもスケーラビリティ
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
329 を保ったままデバッグを行う事が可能となる。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
330
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
331 \begin{figure}[htbp]
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
332 \begin{center}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
333 \includegraphics[width=14cm]{fig/pdf/FDLindaDebug.pdf}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
334 \caption{スケーラビリティを意識したデバッグインターフェース}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
335 \label{FDLindaDebug}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
336 \end{center}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
337 \end{figure}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
338
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
339 \section{通信状態デバッグインターフェースの実装}
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
340 ここまで、Federated Lindaを用いた分散環境環境における分散デバッグインターフェースの機能の検討
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
341 を行った。その結果、Federated Lindaで用いられるべき分散デバッグインターフェースはスナップショット
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
342 を用いて、デッドロック、ライブロック、スケーラビリティ、通信の集中、大量のパケットの送信、といった
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
343 要素のデバッグを行う事が必要との結論を得た。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
344
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
345 しかし、検討したスナップショットでのデバッグインターフェースの実装の為には、現実装の
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
346 Federated Lindaで用いられるProtocol Engineには更なる改良が必要である。なぜならば、現在のProtocol
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
347 Engineはルーティングテーブルを内部データとして保持することから、Federated Lindaの大域的状態を
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
348 取得するにはProtocol Engineまでのスナップショットが必要となるからである。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
349 これを解消する為にはProtocol Engineの内部状態をステートレスに実装し、その挙動はやり取りするXML
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
350 に全て埋め込むという実装が求められる。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
351
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
352 本論文ではスナップショットではなく、前述した分散アルゴリズムにおいてデバッグすべき対象のうちから、
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
353 通信の集中を検知するデバッグインターフェースについて実装を行った。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
354 このデバッグインターフェースを用いる事により、3章で提示したCompact Routingを用いるFederated Linda
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
355 において、meshトポロジで起こったデバッグ困難な通信の集中を伴う状態の検知を行う事を目標とする。
d2f357e68afe Chapter 5
fuchita
parents: 5
diff changeset
356 以下にその実装の詳細を示す。
5
c6eefabf35c0 Chapter 5 fix
fuchita
parents: 4
diff changeset
357
4
633fe343d3a7 add Chapter 5
fuchita
parents: 3
diff changeset
358
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
359
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
360 \subsection{Java版Linda サーバーへの機能実装}
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
361 \begin{center}
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
362 \begin{itembox}[l]{ComDebug機能拡張部分}
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
363 {\footnotesize
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
364 \begin{verbatim}
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
365 if (debug) {
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
366 System.out.println("data from : "+key.channel());
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
367 }
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
368 if((mode == '!') || (len == 0)) {
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
369 Connection_Close(key);
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
370 com_debug.reportCh_remove(key, reportCh_list);
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
371 }
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
372 else if(mode == PSX_CHECK) {
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
373 Check(key, command);
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
374 }
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
375 else if(mode == PSX_IN || mode == PSX_RD){
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
376 In_Rd(key, command, mode);
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
377 }
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
378 else if (mode == PSX_WAIT_RD) {
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
379 Wait_Rd(key, command, mode);
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
380 } else if(mode == PSX_OUT) {
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
381 Out(command, data);
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
382 } else {
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
383 System.out.println("Uncorrect buffer");
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
384 System.exit(1);
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
385 }
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
386
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
387 //COM_DEBUG
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
388 if(id > PRIVILEGED_ID_START && id < PRIVILEGED_ID_END){
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
389 ComDebug.addChannel(key, reportCh_list);
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
390 }
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
391 //DEBUG用カウンタ
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
392 ComDebug.Com_inc(key, com_Loggingtable, mode);
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
393 //DEBUG用レポート
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
394 ComDebug.Report(reportCh_list, command, com_Loggingtable.toString());
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
395
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
396 \end{verbatim}
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
397 }
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
398 \end{itembox}
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
399 \end{center}
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
400
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
401
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
402 \subsection{視覚的に通信状態を確認するツールの開発}
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
403 \begin{figure}[htbp]
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
404 \begin{center}
2
642ff24cf0bc fig modify
fuchita
parents: 0
diff changeset
405 \includegraphics[width=10cm]{fig/pdf/visual01.pdf}
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
406 \caption{通信量のグラフィカルな表示ツール}
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
407 \label{visual01}
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
408 \end{center}
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
409 \end{figure}
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
410
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
411 \section{Compact Rotingの実装を用いた評価}
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
412
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
413 \subsection{通信量のスケーラビリティ}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
414
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
415 \subsection{評価}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
416
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
417 \section{考察}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
418
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
419
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
420
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
421 %\subsection{Federated Lindaのデバッグ}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
422 %現在主流なデバッグ手法はプレークポイント等を用いてプログラムを停止し、その地点からの前後でプログ
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
423 %ラムの状態を確認する、二分法によるデバッグ手法である。
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
424 %Federated Lindaを用いた開発環境においてもこのような手法は大変有効ではあるが、通信の状態によって、
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
425 %デバッグが可能な場合と困難な場合とが存在する。
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
426
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
427 %以下の図\ref{seqdeb}に通常用いられるデバッグが有効なFederated Lindaの通信状態を示す。
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
428
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
429
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
430 %\begin{figure}[htbp]
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
431 %\begin{center}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
432 %\includegraphics[width=8cm]{fig/pdf/seqdeb.pdf}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
433 %\caption{デバッグ可能なFederated Lindaの通信}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
434 %\label{seqdeb}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
435 %\end{center}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
436 %\end{figure}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
437
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
438 %\begin{figure}[htbp]
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
439 %\begin{center}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
440 %\includegraphics[width=10cm]{fig/pdf/nonseqdeb.pdf}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
441 %\caption{デバッグが困難なFederated Lindaの通信}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
442 %\label{nonseqdeb}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
443 %\end{center}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
444 %\end{figure}
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
445
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
446
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
447 %\subsection{分散環境におけるデバッグ}
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
448
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
449
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
450 %今回は、Fedarated Lindaを用いた分散プログラム開発としてCompact Routingを用いるFederated Lindaの
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
451 %分散アルゴリズムの開発を行った経験にて、通信状態や通信量をデバッグできる機能が必要であるとの知見
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
452 %を得たことから、通信量のデバッグインターフェースを実装する。
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
453 %このデバッグインターフェースはLinda サーバーやクライアント(Protocol Engine)間での通信を止めずに、
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
454 %動いているFederated Lindaの通信量をデバッグする(すなわち、通信量のスケーラビリティを見る)
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
455 %インターフェースである。
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
456
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
457 %\subsection{Java版タプルサーバーへの通信量デバッグ機能の実装}
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
458
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
459
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
460
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
461 %\newpage
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
462 %\subsection{通信ログ情報のグラフィカルな表示ツール}
0
420c2d37b2bf Initial revision
fuchita
parents:
diff changeset
463
3
f3ef2f99653f *** empty log message ***
fuchita
parents: 2
diff changeset
464 %\section{通信量デバッグインターフェースによる評価}