DRbQS で処理を分散させる(3. サーバーの設定)
drbqs のディレクトリの example/mandelbrot を例に説明する。
ファイルの構成
- タスク本体を書いたファイル(example/mandelbrot/mandelbrot.rb)
- サーバーの処理を書いたファイル(example/mandelbrot/server.rb)
- サーバーと計算ノードを定義したファイル(example/mandelbrot/execute.rb)
計算ノードはタスクの処理を知らなければならないので、 example/mandelbrot/mandelbrot.rb をロードして実行する。 サーバーは example/mandelbrot/server.rb をロードして実行するのだが、 タスクについても知らなければならないので、 このファイルの中で example/mandelbrot/mandelbrot.rb を読み込むようにする。
計算ノードがたくさんある場合にいちいち起動させるのは大変なので、 サーバーや計算ノードの定義は example/mandelbrot/execute.rb に書く。 サーバーと同一ホストで計算ノードを動かすだけならば、このファイルは不要。
タスク本体を書いたファイル
Marshal.dump 可能なオブジェクトを定義するクラスと 処理を実行するメソッドが定義されていれば良い。 後は自由に書く。
DRbQS で処理を分散させる(2. 実装のメモ) に書いてある、ファイルの転送や一時ファイルの作成などを利用することができる。
サーバーの処理を書いたファイル
まず、「タスク本体を書いたファイル」を require する。 そして DRbQS.option_parser で drbqs-server のコマンドライン引数で与える項目、 DRbQS.define_server でサーバー本体を定義する。
DRbQS.define_server では主にタスクを作成する。 サンプル(example/mandelbrot/server.rb)のように DRbQS::Task オブジェクトを server.queue.add でセットするか、 別のサンプル(example/sum2/server_def.rb)のように server.task_generator で タスクの生成の仕方を指定する。
後は、フックなどの必要なサーバーの設定を記述する。
サーバーと計算ノードを定義したファイル
example/mandelbrot/execute.rb は次のようになっている。 このファイルは drbqs-execute で利用する。
DIR = File.dirname(__FILE__)
current_dir = File.expand_path(File.dirname(__FILE__))
usage :message => "Calculate Mandelbrot set", :server => File.join(current_dir, 'server.rb')
server :local_server, "localhost" do |srv|
srv.load File.join(DIR, 'server.rb')
end
node :local_node do |nd|
nd.load File.join(DIR, 'mandelbrot.rb')
nd.process 2 # For dual core CPU
end
usage でヘルプとともに表示されるメッセージを指定する。 また、上のコードにはないが default でデフォルトのサーバー、計算ノードを指定できる。
server でサーバーを定義する。 1つめの引数はサーバーの ID となるシンボル、2つめの引数にはサーバーの URL を指定する。 ブロックでサーバーのパラメータを設定する。 drbqs-server コマンドのオプションにだいたい対応しているメソッドが利用できる。 ここで、サーバーの定義を書いたファイルをロードする指定を書かないといけない。
node で計算ノードを定義する。 1つめの引数は計算ノードの ID となるシンボル、 ブロックでノードのパラメータを指定する。 タスクのクラスが記述されているファイルをロードする指定を書く。 上のように、マルチコア CPU でワーカープロセスを複数動かす場合は、 その指定も書く。
実行
サーバーと計算ノードを別々に実行する
まず、ディレクトリ example/mandelbrot に移動する。
drbqs-server server.rb -h
とすると drbqs-server のヘルプとともに server.rb に指定することができる コマンドライン引数も表示される。 たとえば、次のようにしてサーバーを実行する。
drbqs-server server.rb -- -s 0.1
のように「–」後に DRbQS.option_parser で定義したオプションを指定する。 ポートはデフォルトの 13500 が使用される。
次に、計算ノードを実行する。
drbqs-node druby://localhost:13500 -l mandelbrot.rb -P 2
のようにして mandelbrot.rb をロードして実行する。 カレントディレクトリに計算ノードのログが作られ、 しばらくすると処理が終わり、result_mandelbrot ディレクトリに 計算結果が入っている。
サーバーと一緒に同一ホストで計算ノードを実行する
サーバーの起動と同時に計算ノードを実行することもできる。 「–execute-node」オプションを使って
drbqs-server server.rb --execute-node 2 -- -s 0.1
のようにする。
別の SSH サーバーで計算ノードを実行したい場合は 次項の drbqs-execute を使用した方法を使う。
drbqs-execute でまとめてサーバーと計算ノードを実行する
最後に、execute.rb で定義したサーバーとノードを起動する方法を説明する。
drbqs-execute execute.rb -h
とするとヘルプが表示される。execute.rb の usage メソッドに サーバーが定義されたファイルを指定しておくと サーバーのオプションも表示される。 プロセスが動いていることを確認するために、 すぐに計算が終了しないようにオプション「-s 0.01」を指定して
drbqs-execute execute.rb -- -s 0.01
と実行する。execute.rb で指定したデフォルトのサーバーとノードで実行される。 ここで
ps aux | grep ruby
とするとプロセスが動いていることがわかる。 ディレクトリ drbqs_execute_log が作成され、サーバーと計算ノードのログが保存され、 しばらくすると計算を終える。