MVA ユーザーズ ガイド

目次

1.はじめに

MVAは平均値解析に基づいた性能評価ツールである。 目的は、計算機システムを中心に、生産システム、 通信システムなどの性能を予測することにある。

MVA は入出力に、数値計算用フレームワーク「ポコム」を使っている。 MVA が供給するファイルはつぎのとおり。

pocom.h ポコムのシステムを記述したC言語ファイル
Mva.c MVA の計算を記述したC言語ファイル
Mva.htmlこのファイル
test.txt例題データ ファイル

MVAは、どのようなジョブが、どのようにノードを使用するかを入力とする。 計算機システムを例に挙げると、ジョブとは処理のことである。 例えばデータ・ベースの登録処理であったり、検索処理である。 また、ノードとは、サービスをする所である。 CPUであったり、ディスク、あるいは端末である。

出力はジョブのスループット、応答時間や、ノードの稼働率、系内数である。

MVAは平均値解析に基づいたツールなので、ジョブの到着は、 ポアソン分布に従うとみなされる。 また、ジョブがノードで受けるサービス時間は、指数分布に従うとみなされる。 そして、出力については、スループット、応答時間、稼働率、 系内数のそれぞれの平均値が得られる。

2.入力モデルの例

以下に入力モデルの例を示す。 これは小規模な計算機システムの待ち行列網モデルをあらわす。 この計算機システムは、1台のCPU、ディスク、通信モジュール、 3台の端末A、5台の端末Bから構成される。ジョブ、すなわち、 処理は登録処理、検索処理、外部処理の3タイプを考える。

      →        →          →          
外界      通信      CPU      ディスク
      ←        ←          ←          
                 ↓ ↑  ↓ ↑           
                 端末A  端末B          

CPUは、微小なタイム・スライスで、 待っているジョブ全てにすこしづつサービスをする。 このようなタイプのノードはプロセッサ・シェアリング(SHARE)と呼ぶ。

通信とディスクは、待ち行列の先頭にあるジョブからサービスをする。 このようなタイプのノードは、 先入れ先出し(FCFS,First Come First Served)と呼ぶ。

端末Aや端末Bは、 複数のジョブを待ち時間なしでサービスをするノードである。 ジョブは到着したらすぐにサービスをされる。 このようなタイプのノードはディレイ・サーバー(DELAY)と呼ぶ。 複数の端末Aや端末Bを一つ一つをノードにしてもよいが、 同じ種類のノードは一つにまとめたほうが簡単である。 複数のジョブを同時にサービスするので、 稼働率は1を越える場合がある。

登録処理は端末Aで行われ、検索処理は端末Bで行われる。 そしてさらに、これらはCPUとディスクを使用する。 これらのジョブは計算機システムの内部を巡回する。 登録処理は端末の数が3台あるので3個のジョブが巡回することになる。 同様に検索処理は5個となる。 1秒間に何個のジョブを処理できるかをスループットと呼ぶ。 これはMVAの計算で得られる。 このようなジョブを閉じたジョブ(CLOSED)と呼ぶ。

外部処理は、 外界から通信モジュールに1秒あたり平均 0.05 回の割合で到着する。 そしてさらに、CPUとディスクを使用する。 外界には、無限のジョブが待ち状態にあると仮定するので、 計算機システム内に巡回しているジョブ数は不定である。 到着する数が多すぎると、 CPUやディスクで待ち状態になるジョブ数が無限になり、 パンクする場合がある。 しかし、パンクしないかぎり、 スループットは与えられた到着率と等しくなる。 このようなジョブを開いたジョブ(OPEN)と呼ぶ。

3.入力ファイルと出力ファイルの例

以下に、入力ファイルの例 test.txt を示す。 これはエディタで作成する。

 Title 
 -------------------
 "MVA  例題ファイル"
 -------------------

 Node      TypeN
 [CPU]     SHARE
 [disk]    FCFS
 [通信]    FCFS
 [端末A]   DELAY
 [端末B]   DELAY

 Job        TypeJ  LoadJ  NodeL    VisitL  ServL
 (登録処理) CLOSED     3  [CPU]      10.0    0.5
                          [CPU]       1.0    0.75
                          [disk]      2.0    2.25
                          [端末A]     1.0   32.0
                          [端末A]     4.0   12.5 ;
 (検索処理) CLOSED     5  [CPU]       8.0    1.7
                          [CPU]       9.0    0.5
                          [disk]      5.0    5.4
                          [端末B]     5.0   42.0
                          [端末B]     4.0   15.0 ;
 (外部処理) OPEN    0.05  [CPU]       4.0    1.0
                          [disk]      3.0    1.0
                          [通信]      2.0    7.5 ;

 Solve

 Print Title
 Print Node UtilN ResidN
 Print Job RespJ ThrouJ NodeS UtilS ResidS RespS

 Output report.txt
 Print Title
 Print Node UtilN ResidN
 Print Job RespJ ThrouJ NodeS UtilS ResidS RespS
 Output -

; は配列の行末を表す。$ は配列の終わりを表す。 Title,Node,TypeN,Job,TypeJ,LoadJ,NodeL,VisitL,ServL は、 入力変数を示している。

入力変数
名前説明
Title タイトルを記録する。スペースを含む時は ' で囲む。
Nodeノードの名前を記録する。
TypeN ノードが SHARE,FCFS,DELAY のどれかを記録する。
Jobジョブの名前を記録する。
TypeJ ジョブが OPEN か CLOSED かを記録する。
LoadJ ジョブが OPEN の時は1秒間に到着するジョブの数を記録し、 ジョブが CLOSED の時は巡回するジョブの数を記録する。 例では端末の数となる。
NodeL ジョブがどのノードを訪問するかを記録する。
VisitL ジョブがそのノードを何回訪問するかを記録する。
ServL ジョブが1回の訪問で、平均どれだけサービスを受けるかを記録する。

例えば、登録処理は、CPUを11回訪問し、 そのうち10回は平均 0.5 秒間サービスを受ける。 残りの1回は 0.75 秒間サービスを受ける。 そして、ディスクを2回訪問し平均 2.25 秒間サービスを受ける。 さらに、端末Aを5回訪問し、 そのうち1回は平均 32 秒間サービスを受ける。 残りの4回は12.5 秒間サービスを受ける。

ディスクや通信のように、FCFS のノードでは、 1つのジョブに対して、複数のサービス時間は指定できない。 この制限に注意すること。

Solve は、計算の実行をするコマンドである。 Print は、計算結果を出力するコマンドである。 Output は、出力するファイルを決めている。 最後の行のように、Output - とすると、画面に出力が戻る。 この例ならば、画面と report.txt の両方に結果が出力される。

ここで、出力変数 UtilN,ResidN,RespJ,ThrouJ,NodeS,UtilS,ResidS,RespS について説明する。

出力変数
名前説明
UtilN 各ノードの稼働率を示す。 端末Aのようなディレイ・サーバーは一度に、 複数のジョブをサービスできるので、 稼働率が1を越えることがある。
ResidN各ノードの平均系内数をしめす。
RespJジョブの応答時間を示す。
ThrouJジョブのスループットを示す。
NodeSジョブがどのノードを使うかを示す。
UtilS ジョブについてノードごとに分けた稼働率を示す。
ResidS ジョブについてノードごとに分けた平均系内数を示す。
RespS はジョブについてノードごとに分けた応答時間を示す。

以下に出力結果を示す。

 Title
 -------------------
 "MVA  例題ファイル"
 -------------------

 Node       UtilN     ResidN   
 [CPU]         0.6005    1.3635
 [disk]        0.6378    1.6312
 [通信]        0.7500    3.0000
 [端末A]       2.2040    2.2040
 [端末B]       3.6687    3.6687

 Job        RespJ     ThrouJ  NodeS      UtilS    ResidS   RespS    
 (登録処理)  111.6172  0.0269 [CPU]        0.1545   0.3432   12.7678
                              [disk]       0.1209   0.4529   16.8493
                              [端末A]      2.2040   2.2040   82.0000 ;
 (検索処理)  367.9733  0.0136 [CPU]        0.2459   0.5476   40.3010
                              [disk]       0.3669   0.7836   57.6723
                              [端末B]      3.6687   3.6687  270.0000 ;
 (外部処理)   77.3475  0.0500 [CPU]        0.2000   0.4727    9.4539
                              [disk]       0.1500   0.3947    7.8936
                              [通信]       0.7500   3.0000   60.0000 ;

4.MVAの基本オペレーション

前の章で作成した test.txt を解析する時は、 以下のようにコマンドを使う。

C:\>mva test.txt

ファイルを指定せずに起動すると、変数と関数のコメントを表示する。

C;\>mva

それによって、変数は以下のうちのどれかに分類できることがわかる。

型の一覧
構造
単純変数 int code realstr
ベクトル(vector) iveccvec rvecsveccdef
固定列行列(matrix) imatcmat rmatsmat
可変列行列(jagged) ijagcjag rjagsjag

MVA には、以下に示す5種類の行がある。

空白行
行が空か、スペースかタブのみの行。データ行の終わりを表す。
注釈行
注釈行は # で始まります。注釈行は無視される。
関数行
関数名が先頭に来て、後にパラメータが続く。
変数行
データを読み込む順番を決める行。 # より右は読み込みまない。
データ行
変数行で指定した順番にならんだデータの集まり。 # より右は読み込まない。 空白 # ; $ を含む文字列やコードの名前を指定する時は " か ' で囲む。 また、変数名や関数名と一致する文字列やコード定義を指定する時も、 " か ' で囲む。 また、0xで始めると16進数と見なす。 ; で行列の行末を決る。 固定列行列を複数並べた時は、 それぞれの行末に ; を付ける必要があるが、 可変列行列を複数並べた場合は、1つだけ ; を付ける。 空白行または $ は配列の終わりを決めます。$ より右は読み込まない。

変数行を書く時は、次の順番を守って変数を並べなければならない。

[単純変数]  [ベクトル・固定列行列]  [可変列行列]

さらに、ベクトル、固定列行列、可変列行列を複数並べる時は、 行サイズを指定する整数変数が同じものでなければならない。 また、可変列行列を複数並べる時は、 列サイズを示す整数ベクトル変数も等しくなければならない。

変数行の後には、それに応じた量のデータが必要になる。 この行をデータ行と呼ぷ。 データ行での読み込みの順番は、変数行での順序から次のように決る。

順番さえあっていれば、改行や注釈は自由に配置できる。 従って、工夫次第で、読みやすく、 かつページ数が少ないデータ ファイルを書くことができる。

ここで、MVA で使用できるポコム関数についてまとめておく。

ポコム関数
名前説明
Alias変数/関数に別名をつけます。日本語も指定できます。
例  Alias  N 数
Append以降の出力を指定されたファイルへ追加書き込みする。- を指定すると標準出力へ書く。 + を指定すると標準エラーへ書く。
Clock起動した時からの経過時間を表示する。引数の文字列を後ろに表示する。
Echo文字列の表示。# よりも後ろの文字列も出力される。
Format変数の出力桁数を変更する。 出力の精度を高くしたり、 画面にたくさんのデータを表示したりするときに使用する。 下2桁が全体の桁数を表し、百の桁が小数点以下の桁数を示す。 浮動小数点で -209 のように負の符号を付けると、3.14e+000 の形式で出力する。 整数で -4 のように負の符号を付けると16進数で出力する。 浮動小数点で0または -1 に指定した時は、必要に応じた精度で表示する。 浮動小数点で -2 または -3 に指定した時は、16進数で表示する。 固定列行列以外の配列で、0に指定した場合は、 単独で表示したときでも要素ごとに改行される。 また、RVEC、RJAG で、-2 に指定した場合も、 単独で表示したときでも要素ごとに改行される。 同時に複数の変数の桁数を変えることができる。
例  Format  UtilS 408   ResidS 408  RespS 408
List変数と関数の一覧を表示する。引数は取らない。
Load指定されたファイルを読む。- を指定すると標準入力を読む。
Output以降の出力を指定されたファイルへ書く。 同じ名前のファイルがあるときは上書きされる。 - を指定すると標準出力へ書く。+ を指定すると標準エラーへ書く。
Print変数の表示。複数の変数を同時に指定する時は、 読み込みと同様変数の順番とサイズが合ってなければならない。
PrintCSVCSVフォーマットに従って変数の値を表示する。 エクセルで読み込むのに使用する。
PrintTSVタブ区切りフォーマットに従って変数の値を表示する。 エクセルで読み込むのに使用する。
Range 整数、浮動小数点、コード型変数の取る値を制限する。 範囲条件の種類として==、!=、>、>=、<、<=が使える。
    例  Range N > 0  # N は 1 以上に制限される。
また、複数の範囲条件を設定することができる。
例  Range N > 0 <= 10 != 5
この場合 N は 1,2,3,4,6,7,8,9,10 に制限される。 (注意! 範囲条件を表す記号の前後に必ず空白を置くこと。)