Ubuntu でグリッドコンピューティング

[Think IT]で小林さんが言っていました。

デスクトップOSに求められるものと、サーバOSに求められるものは大きく異なりますが、共通する部分もあります。まず、OSの基盤部分を中心として、多くのソフトウェアが共通で利用できます。そして、確実なセキュリティフィックスの提供、継続的な開発の継続、定期的な新バージョンのリリースが求められるという点も、両者に共通しています。よって、デスクトップOSとして成功しているUbuntuが、それをベースにサーバOSとしての普及を目指すのは当然だと言えるでしょう。

そう、これから Ubuntuエンタープライズなサーバ分野での普及も目指すのです。そんなわけで*1 Hardy を使って Sun Grid Engine を動かしてみました。
Sun Grid Engine 6.1 - 概要
まず事前準備として、Ubuntu マシンを二台用意します。一台でも動かせますが、グリッドの意味が全くないのでここは複数用意しましょう。今回は Server 版をインストールしたデスクトップ(スケジューラ兼計算エンジン)と、Desktop 版をインストールしたノート(計算エンジン)の二台を使いました。KVMXen を使っているような人は、計算エンジンを 10 台くらい並べてみると楽しいかもしれません。
SGE を構成する各ノードは、ホームディレクトリと SGE のインストールディレクトリを共有しておく必要があります。そこでスケジューラ(sgemaster)になるサーバに nfs-kernel-server をインストールして /home と SGE をインストールするディレクトリをエクスポートしておきます。今回はインストールディレクトリに /opt/gridengine を使うことにしました。各計算ノードは autofs と nfs-common をインストールして、各ディレクトリを nfs マウントできるようにしておきましょう。


$ cat /etc/exports
/home *.mydomain.org(rw,no_root_squash)
/opt *.mydomain.org(rw,no_root_squash)

$ cat /etc/auto.master
/home /etc/auto.home
/opt /etc/auto.opt

$cat /etc/auto.home
* sgemaster.mydomain.org:/home/&

$cat /etc/auto.opt
* sgemaster.mydomain.org:/opt/&

SGE はインストール時に各ノードの名前解決を行うようなので、各ノードに固定 IP アドレスを割り振って、名前解決ができるようにしておきましょう。私は DHCP サーバになっている GLANTANK に bind9 をインストールして、ローカルな DNS サーバを構築しました。/etc/hosts でもいけるかもしれませんが、試していません。
SGE を動作させるためのアカウントを作成しておきます。今回は sgeadmin としました。

$ sudo /usr/sbin/useradd -d /home/sgeadmin -m sgeadmin
$ sudo passwd sgeadmin
準備ができたら、以下のサイトから共通ファイルと Linux 用バイナリを取得します。今回は SGE 6.0 update 12 を使いました。
http://gridengine.sunsource.net/downloads/60/download.html
ge-6.0u12-common.tar.gz と ge-6.0u12-bin-lx24-x86.tar.gz を /opt/gridengine 以下に展開します。

$ sudo mkdir -p /opt/gridengine
$ cd /opt/gridengine
$ sudo tar zxfv ge-6.0u12-common.tar.gz
$ sudo tar zxfv ge-6.0u12-bin-lx24-x86.tar.gz
そして SGE_ROOT 環境変数を定義して、インストーラを起動します。

$ export SGE_ROOT=/opt/gridengine
$ cd /opt/gridengine
$ sudo ./install_qmaster
インストールは以下のドキュメントに従ってください。Sun Grid Engine のドキュメントというものは存在しないのですが、商用版の N1 Grid Engine のドキュメントがほぼそのまま流用できるようです。
N1 Grid Engine インストールガイド
スケジューラのインストールが完了したら、計算エンジンをインストールします。計算ノード上の /opt/gridengine でインストーラを起動してください。

$ cd /opt/gridengine
$ sudo ./install_execd
二台のノードで計算エンジンのインストールが完了したら、/opt/gridengine/<セル名>/common/settings.sh と settings.csh を /etc/profile.d にコピーしておきましょう。

$ sudo cp /opt/gridengine/default/common/settings.* /etc/profile.d/
qstat でジョブの状態を表示できます。

$ qstat -f
queuename qtype used/tot. load_avg arch states

                                                                                                                                                      • -

all.q@sgemaster.mydomain.org BIP 0/1 0.00 lx24-x86

                                                                                                                                                      • -

all.q@sgeengine.mydomain.org BIP 0/1 0.18 lx24-x86

以下のようなスクリプトを作って、実行されたホスト名を表示させてみましょう。名前は hostname.sh とします。

#! /bin/sh
/bin/hostname
qsub でジョブを投入します。

$ for n in {1..10}
> do
> qsub hostname.sh
> done
Your job 21 ("hostname.sh") has been submitted
Your job 22 ("hostname.sh") has been submitted
Your job 23 ("hostname.sh") has been submitted
Your job 24 ("hostname.sh") has been submitted
Your job 25 ("hostname.sh") has been submitted
Your job 26 ("hostname.sh") has been submitted
Your job 27 ("hostname.sh") has been submitted
Your job 28 ("hostname.sh") has been submitted
Your job 29 ("hostname.sh") has been submitted
Your job 30 ("hostname.sh") has been submitted

$ qstat -f
queuename qtype used/tot. load_avg arch states

                                                                                                                                                      • -

all.q@sgemaster.mydomain.org BIP 0/1 0.00 lx24-x86

                                                                                                                                                      • -

all.q@sgeengine.mydomain.org BIP 0/1 0.19 lx24-x86

############################################################################
- PENDING JOBS - PENDING JOBS - PENDING JOBS - PENDING JOBS - PENDING JOBS
############################################################################
21 0.00000 hostname.s mizuno qw 08/09/2008 21:32:37 1
22 0.00000 hostname.s mizuno qw 08/09/2008 21:32:37 1
23 0.00000 hostname.s mizuno qw 08/09/2008 21:32:37 1
24 0.00000 hostname.s mizuno qw 08/09/2008 21:32:37 1
25 0.00000 hostname.s mizuno qw 08/09/2008 21:32:37 1
26 0.00000 hostname.s mizuno qw 08/09/2008 21:32:37 1
27 0.00000 hostname.s mizuno qw 08/09/2008 21:32:37 1
28 0.00000 hostname.s mizuno qw 08/09/2008 21:32:37 1
29 0.00000 hostname.s mizuno qw 08/09/2008 21:32:37 1
30 0.00000 hostname.s mizuno qw 08/09/2008 21:32:37 1

出力は <スクリプト名>.o<ジョブ番号> というファイルに書き出されます。e<ジョブ番号> というファイルはエラー出力になります。

$ cat hostname.sh.o*
sgemaster
sgeengine
sgemaster
sgeengine
sgemaster
sgeengine
sgemaster
sgeengine
sgemaster
sgeengine
と、それぞれ違うノードでジョブが実行されているのが解りますね。
と、こんな感じで Ubuntu でもお手軽にグリッドが構築できたりします。問題はこのグリッドの使い道が個人では見つからないことですが orz

*1:どんなわけ?