これまでの連載でhpcクラスターを構成するために必要なソフトウェアのインストールと設定は全て終わりました。

現在のところhpcクラスターを構成するノードはhpc01とhpc02の2台だけですが、hpc02をクローンして幾つかのファイルを修正すれば、ノードを増やすことができます。

ここではhpc03とhpc04を作ってクラスターに加えることにします。

hpc02をクローンして、hpc03とhpc04を作ります。この具体的な方法はこちらの解説をご覧ください。クローンするだけでなく、hostnameの修正とIPアドレスの修正も行い、リブートします。

hpc01からrootでパスワードなしのsshが可能か確かめます。

hpc03とhpc04にはローカルのホームディレクトリ/hpc02がありますが、/hpc03と/hpc04に変更します。

ssh hpc03 mv /home2 /home3

ssh hpc04 mv /home2 /home4

各ノードのローカルホームディレクトリを他のノードで読み書きできるよう、それぞれのノードの/etc/exportsと/etc/auto.directを次のように修正します。

各ノードの/etc/exportsの最後の1行は以下のようにします。

root@hpc01:~# for node in `seq -f "hpc%02g" 1 4`;do ssh $node echo "$node:/etc/exports";ssh $node tail -n 1 /etc/exports;done
hpc01:/etc/exports
/home hpc*(rw,no_root_squash)
hpc02:/etc/exports
/home2 hpc*(rw,no_root_squash)
hpc03:/etc/exports
/home3 hpc*(rw,no_root_squash)
hpc04:/etc/exports
/home4 hpc*(rw,no_root_squash)
root@hpc01:~#

各ノードの/etc/auto.directは以下のようにします。

oot@hpc01:~# for node in `seq -f "hpc%02g" 1 4`;do ssh $node echo "$node:/etc/auto.direct";ssh $node cat /etc/auto.direct;done
hpc01:/etc/auto.direct
/home2 -fstype=nfs,rw hpc02:/home2
/home3 -fstype=nfs,rw hpc03:/home3
/home4 -fstype=nfs,rw hpc04:/home4
hpc02:/etc/auto.direct
/home -fstype=nfs,rw hpc01:/home
/home3 -fstype=nfs,rw hpc03:/home3
/home4 -fstype=nfs,rw hpc04:/home4
hpc03:/etc/auto.direct
/home -fstype=nfs,rw hpc01:/home
/home2 -fstype=nfs,rw hpc02:/home2
/home4 -fstype=nfs,rw hpc04:/home4
hpc04:/etc/auto.direct
/home -fstype=nfs,rw hpc01:/home
/home2 -fstype=nfs,rw hpc02:/home2
/home3 -fstype=nfs,rw hpc02:/home3
root@hpc01:~#

その後各ノードでautofsをリスタートします。

root@hpc01:~# for node in `seq -f "hpc%02g" 1 4`;do ssh $node systemctl restart autofs;done
root@hpc01:~#

ローカルホームがマウントされるかどうか確認します。

root@hpc01:~# for node in `seq -f "hpc%02g" 1 4`;do ssh $node ls /home* >/dev/null;echo $node;ssh $node df -h /home*;done
hpc01
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 49G 11G 36G 23% /
hpc02:/home2 49G 9.9G 37G 22% /home2
hpc03:/home3 49G 9.9G 37G 22% /home3
hpc04:/home4 49G 9.9G 37G 22% /home4
hpc02
Filesystem Size Used Avail Use% Mounted on
hpc01:/home 49G 11G 36G 23% /home
/dev/sda2 49G 9.9G 37G 22% /
hpc03:/home3 49G 9.9G 37G 22% /home3
hpc04:/home4 49G 9.9G 37G 22% /home4
hpc03
Filesystem Size Used Avail Use% Mounted on
hpc01:/home 49G 11G 36G 23% /home
hpc02:/home2 49G 9.9G 37G 22% /home2
/dev/sda2 49G 9.9G 37G 22% /
hpc04:/home4 49G 9.9G 37G 22% /home4
hpc04
Filesystem Size Used Avail Use% Mounted on
hpc01:/home 49G 11G 36G 23% /home
hpc02:/home2 49G 9.9G 37G 22% /home2
hpc03:/home3 49G 9.9G 37G 22% /home3
/dev/sda2 49G 9.9G 37G 22% /
root@hpc01:~#

新しいユーザーをhpc01で追加して、hpc02~hpc04にログインできるか確認します。

ユーザー名が重複しないよう、既に登録されているユーザー名を確認します。

root@hpc01:~# ypcat passwd
testuser:x:1001:1001:,,,:/home/testuser:/bin/bash
hpc:x:1000:1000:hpc,,,:/home/hpc:/bin/bash
root@hpc01:~#

testuserとhpcが登録されていますので、重複しないユーザー名testuser2を作成します。

root@hpc01:~# adduser testuser2
Adding user `testuser2' ...
make: Entering directory '/var/yp'
make[1]: Entering directory '/var/yp/hpc-cluster'
Updating passwd.byname...
Updating passwd.byuid...
Updating group.byname...
Updating group.bygid...
Updating services.byname...
Updating services.byservicename...
Updating netid.byname...
Updating shadow.byname...
make[1]: Leaving directory '/var/yp/hpc-cluster'
make: Leaving directory '/var/yp'
Adding new group `testuser2' (1002) ...
make: Entering directory '/var/yp'
make[1]: Entering directory '/var/yp/hpc-cluster'
Updating group.byname...
Updating group.bygid...
Updating netid.byname...
make[1]: Leaving directory '/var/yp/hpc-cluster'
make: Leaving directory '/var/yp'
Adding new user `testuser2' (1002) with group `testuser2' ...
make: Entering directory '/var/yp'
make[1]: Entering directory '/var/yp/hpc-cluster'
Updating passwd.byname...
Updating passwd.byuid...
Updating netid.byname...
Updating shadow.byname...
make[1]: Leaving directory '/var/yp/hpc-cluster'
make: Leaving directory '/var/yp'
Creating home directory `/home/testuser2' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for testuser2
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
root@hpc01:~#

途中で新しいユーザーのパスワードを2回聞かれますので入力し、そのほかの質問には適当に入力します。

root@hpc01:~# adduser testuser2
Adding user `testuser2' ...
make: Entering directory '/var/yp'
make[1]: Entering directory '/var/yp/hpc-cluster'
Updating passwd.byname...
Updating passwd.byuid...
Updating group.byname...
Updating group.bygid...
Updating services.byname...
Updating services.byservicename...
Updating netid.byname...
Updating shadow.byname...
make[1]: Leaving directory '/var/yp/hpc-cluster'
make: Leaving directory '/var/yp'
Adding new group `testuser2' (1002) ...
make: Entering directory '/var/yp'
make[1]: Entering directory '/var/yp/hpc-cluster'
Updating group.byname...
Updating group.bygid...
Updating netid.byname...
make[1]: Leaving directory '/var/yp/hpc-cluster'
make: Leaving directory '/var/yp'
Adding new user `testuser2' (1002) with group `testuser2' ...
make: Entering directory '/var/yp'
make[1]: Entering directory '/var/yp/hpc-cluster'
Updating passwd.byname...
Updating passwd.byuid...
Updating netid.byname...
Updating shadow.byname...
make[1]: Leaving directory '/var/yp/hpc-cluster'
make: Leaving directory '/var/yp'
Creating home directory `/home/testuser2' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for testuser2
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
root@hpc01:~#

作成し終わったらsudo su - testuser2でtestuser2になり、ssh-keygenを行い、パスワードなしでのsshログインを可能にします。

root@hpc01:~# sudo su - testuser2
testuser2@hpc01:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/testuser2/.ssh/id_rsa):
Created directory '/home/testuser2/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/testuser2/.ssh/id_rsa
Your public key has been saved in /home/testuser2/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:YM9L1RDZ4gS3ZT7po96xeBS4yR3KgHSEcuQGsEyZ/5Y testuser2@hpc01
The key's randomart image is:
+---[RSA 3072]----+
| o+...oo.++o |
| oo..o+ ..+B.. |
| o. +=o ooo= |
| .o.+..o.o. |
| . .S+ =oo |
| E. .*.o. |
| . . ... |
| . o.o |
| o.o |
+----[SHA256]-----+
testuser2@hpc01:~$ cd .ssh
testuser2@hpc01:~/.ssh$ ls
id_rsa id_rsa.pub
testuser2@hpc01:~/.ssh$ cp id_rsa.pub authorized_keys
testuser2@hpc01:~/.ssh$ cd
testuser2@hpc01:~$

全ノードにssh hostnameを実行してみます。

うまく行きました。これでNISでのユーザー共有も有効なことがわかりました。実際はcd /var/yp;makeをやっていないので、入力したパスワードは共有されていませんが、パスワードなしで使用するので、問題ありません。

最後にLavaを全ノードで有効にします。exitしてrootに戻り、vim /etc/lava/conf/lsf.cluster.lavaでLavaの実行ノードのリストに、hpc03とhpc04を加えます(下の画面の11行目と12行目)。

このファイルをhpc02~hpc04にコピーします。その後、hpc02~hpc04でlavaをrestartします。

全ノードでlavaが有効になっているか確認のためにbhostsを実行しますが、lsf.confがオープンできないというエラーになります。suでrootになっているのですが、login shell出ないため、lava用の環境変数が設定されないためです。login shellを使うため、sudo su -でrootになります。そしてbhostを実行するとうまく行きます。

一般ユーザーhpcに戻ってもbhostで確認できます。lavaをテストするためのディレクトリlavatestを作成し、その中にlogというディレクトリを作ります。簡単なジョブをlavaに投入します。bsubコマンドの後に投入したいコマンドまたはスクリプトを入力するだけなので、とても簡単です。ジョブの出力先は-oオプションで指定します。ここでは-o logでディレクトリを指定します。その場合は、ディレクトリの中に、ジョブ番号.outというファイルができてそこに出力が書き込まれます。

bsub -o log "date;hostname;sleep 10;date"

でジョブを投入してみましょう。ジョブの実行状態はbjobsコマンドで確認できます。

ジョブが投入直後は数秒間Pendingになりその後Runになり、どのノードで実行されているかが表示されます。実行が終わって、他に投入されたジョブがないとNo unfinished job foundと表示されます。

実行結果を見てみましょう。

予想通りの結果ですが、今度は上記のジョブを全コア数の16より多い20個連続投入してみます。

bjobsでジョブの実行状態を見ていくと、次第に実行されて16個のコア全部がRunになり、余ったジョブはPending状態のままで、実行中のジョブが終了するとPendingのジョブがRunになるのを繰り返して、Pendingがなくなり、Runも次第に全部終了しNo unfinished job foundになります。

以上の例では投入したジョブは実用的には無意味なものでしたが、有用なジョブが多数あれば、簡単にジョブ投入ができて、最短時間で実行可能なことは、容易に想像できると思います。

それでは、次回ではMPIのジョブを投入する方法を解説します。