#nomenubar

研究方針

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

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

検討課題

アルゴリズム

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

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

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

スケジューラは、一定時間毎に各ノードの負荷状況から「マイグレーションが必要かどうか」を判断する。各ノードの負荷状況は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回連続で同じノードが「最も負荷の小さいノード」に選べれた場合、そのノードがマイグレーション先のノードとなる。

その他、情報開示機構で得られるノードの情報は以下の通り。

取得方法・取得できる情報:Lab/SSS-PC/情報開示機構

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

2.移転対象のタスクを決定する

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

以下のタスクは対象外。

これらはタスク名(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単位)

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

取得方法:Lab/SSS-PC/タスク情報取得

現在の課題:タスク一覧をどうやって得るか/これらをどう反映させるか

3.シグナル発行

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

参考: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);

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

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

外部仕様

Lab/SSS-PC


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS