#nomenubar
*研究方針 [#k6f47fa1]

題目:PCクラスタ向けOS「SSS-PC」のための負荷分散スケジューラの設計

卒論本体に関しては[[Lab/卒業論文]]に。

#contents

-[[研究関係Wiki・SSS-PCへ戻る>Lab/SSS-PC]]

**検討課題 [#u18e11a2]

-タスクのtype・タスクの大きさ等はどうやって得るのか
-タスク毎の負荷って測定可能?
-マイグレーションのコストをどうやって設計に生かすか?
-IDMにコストはかからないのか?
-一定時間毎に実行し続けると、どんどんタスクを他ノードへ送ってしまうことになるが?
-タスク間通信がある場合(関連タスク?)はどうするのか
-タスク間通信がある場合(関連タスク?)はどうするのか(マイグレ後遅くならないか)
-同一のハードウェアでない可能性があることを考慮する(特にCPU usage)
-ずっと居座るタスクを動かすためにはLIFEが長いタスクを移送した方が効果的?

**アルゴリズム [#qb85f0eb]

本スケジューラーは、各ノードの負荷情報に基づき、タスクを適当なノードにマイグレーションすることによってクラスタシステム全体のロードバランシングを実現する。

-ノード内のスケジューリングはシステム依存

***1.他ノードと自ノードの負荷状態を比較し、最も負荷の低いノードを選ぶ [#i93878e5]

まず、ready状態のタスク数が2以上であることを確認する。

-unsigned int	ready_task;	/* ready状態のタスク数 */

スケジューラは、一定時間毎に各ノードの負荷状況から「マイグレーションが必要かどうか」を判断する。各ノードの負荷状況はCPU usageの数値を比較して判断する。以下はその判断基準の試案である。
ノードの情報については情報開示機構を用いる。

得る情報は以下の通り。

    unsigned int	short_cpu_usage; /* 100tick平均 10tick毎更新 */
    unsigned int	middle_cpu_usage; /* 1000tick平均 100tick毎更新 */
    unsigned int	long_cpu_usage; /* 10000tick平均 1000tick毎更新 */

全ノードのshort_cpu_usage、middle_cpu_usage、long_cpu_usageの値を比較し、それぞれ値が一番小さいノードを選び出す。選び出されたノードのうち2つ以上が同じノードであった場合、そのノードを「最も負荷の小さいノード」とする。

最も負荷の小さいノードが自ノードであった場合はマイグレーションは行わない。他ノードであった場合はマイグレーションを行う。ただし自ノードと対象ノードのCPU usageの値の差が小さい場合はマイグレーションを行う必要は無い(具体的な数値は未定)。

判断は2回繰り返し、2回連続で同じノードが「最も負荷の小さいノード」に選べれた場合、そのノードがマイグレーション先のノードとなる。

&color(black,#cccccc){その他、情報開示機構で得られるノードの情報は以下の通り。};

&color(black,#cccccc){取得方法・取得できる情報:[[Lab/SSS-PC/情報開示機構]]};

-unsigned int	phy_mem; /* all available phy_memory, 最小page 単位 */
-unsigned int	free_mem; /* 最小page 単位 */
-unsigned int	tick_unit; 	/* msec単位のtick時間 SSSMC_TIMER_UNIT */
-unsigned int	page_size;	/* システムの最小ページサイズ(byte単位) */

&color(black,#cccccc){負荷が最も小さいノードを選択するようにすると、複数のノードから一斉にタスクが移動して一気に負荷がかかる可能性や、移動するタスクの負荷の大きさによってノード毎にばらつきが出る可能性がある。};

***2.移転対象のタスクを決定する [#m30ef29c]

スケジューラが他ノードへのタスクのマイグレーションを実行すると決めた場合、どのタスクをマイグレーションさせるかを決定しなければならない。

以下のタスクは対象外。

-スケジューラ自身
-システム(シェルなど)に関係するタスク

これらはタスク名(psコマンド上ではname)と親タスク(creater)、そしてタスクの種類(type)で判断する。スケジューラ自身は自らのタスク名を取得すれば良い。システムの関係するタスクは、createrがBOOT、SHELL等になっており、またtypeは「p\_sys」もしくは「np\_sys」となっているので判別可能である。

ノード内のタスクに関する情報はシステムコールを使う。

残ったタスクのうち、以下の順序でマイグレーションを行う優先度をつける。

・ready状態のもの
・priorityの値が低いもの
・生存期間(life)の短いもの

 int proc_stat(name)
 タスク状態()を得る。エラーの時(タスクがない場合)は−1が返る

 TASK_GETPARAM_PRIORITY_INIT : 50 
  一般的意味でのpriority

 TASK_GETPARAM_LIFE : 0 
  ユーザモードの実行時間(tick単位)
 TASK_GETPARAM_SYS_LIFE : 0 
  カーネルモードの実行時間(tick単位)
 TASK_GETPARAM_SUBLIFE : 318 
  tick(10msec)に満たないユーザモードの実行時間(usec単位)

&color(black,#cccccc){2.については、自ノードのうち「他ノードに移動させると負荷が平均化されるタスク」を選択する必要がある。負荷が極端に大きいタスクを他ノードへ移動させると、移動先ノードの負荷が大きくなりすぎて再びマイグレーションが発生し、これを繰り返すことでマイグレーションばかりが発生する可能性がある。逆に負荷が極端に小さいタスクを他ノードへ移動させると、負荷の変化があまり起こらないため何度もマイグレーションが発生する可能性がある。よって、「マイグレーションを行うと自ノード・相手先ノード共に負荷が平均化されるタスク」を選択する必要がある。};

&color(black,#cccccc){取得方法:[[Lab/SSS-PC/タスク情報取得]]};

&color(black,#cccccc){現在の課題:タスク一覧をどうやって得るか/これらをどう反映させるか};


***3.シグナル発行 [#e6b8da57]

ここではマイグレーション実行に必要なシグナルについて検討する。

参考:[[Lab/SSS-PC/シグナル]]

''スケジューラ''

マイグレーション対象のタスクが決定したら、シグナルを送る。

 send_task_signal(taskID,0x80000000);

 #define	TASK_SIGMiG 0x80000000  /* recommendation to escape from the current node */

''タスク''

シグナルハンドラの中にマイグレーションを実行するシステムコールを入れる

以下のシステムコールで関数を起動させる。

 set_signal_func(signal_dispatch);

signal_dispatchにはマイグレーションを実行させるシステムコールを記述する。

 sss_migration_request(int node,int type);

問題は、タスクへどうやってシグナルをキャッチ&マイグレーション実行機能を組み込ませるか。

+ソースレベルで組み込ませる
++誰が使うんだろう……。
+ライブラリを用意する
++↑どうやって?ヘッダを書いてインクルードさせる?
+ラッパーアプリケーション??
++先にマイグレ機構を搭載したプログラムを起動し、そこから該当プログラムを起動させる?

***外部仕様 [#e2890612]

-スケジューラは各ノードに常駐
--スケジューラそのものもタスクである
-タスクはライブラリ等でスケジューラからのシグナルを受け取れるようにする


[[Lab/SSS-PC]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS