Linux で計算機クラスタを作る (1. ネットワーク構築) の続き。
計算機クラスタにおいては、計算の実行は各ノードで行いますが、データは一箇所に集約されている必要があります。そこで今回はヘッドノード FutonHead に全てのデータを置き、他のノードは FutonHead の必要なディレクトリをマウントするという形にします。
(将来的には NAS とか付ける可能性がありますが、とりあえずはこの形で。)
分散ファイルシステムには NFS を使います。UNIX 系では NFS が一般的なようです。Windows だと CIFS とか。
共有すべきディレクトリ
-
/home
各ユーザーのデータ -
/usr/local
ユーザー全員が使えるプログラム等
このへんは用途や流儀によって色々あるらしいですが、とりあえずこれで行きます。
ヘッドノード設定
まず NFS サーバーとなるヘッドノードには nfs-kernel-server をインストール。
FutonHead $ sudo apg-get install nfs-kernel-server
次に /etc/exports
を開いて、NFSサーバーとして公開するディレクトリを明記します。
# この2行追加を追加
/home 192.168.2.0/255.255.255.0(rw,async,no_root_squash)
/usr/local 192.168.2.0/255.255.255.0(rw,async,no_root_squash)
フォルダ名、公開するネットワークの範囲、およびオプションとなります。なお 255.255.255.0 と (rw,...) の間にスペースを入れてはいけません。 僕はこれで1日を潰しました。
オプションの意味は以下のとおり
-
rw
読み書き可能。(読込専用ならばro
) -
async
非同期書き込み。パフォーマンスが向上するが、途中でクラッシュした時に検出不可能なエラーが発生するなど信頼性を損ねる。今回はパフォーマンス重視なので非同期に設定。同期にしたい場合はsync
。 -
no_root_squash
クライアントが root 権限での書き込みを可能にする。
計算ノード設定
NFS クライアントである計算ノードには nfs-common をインストールします。
Futon01 $ sudo apt-get install nfs-common
設定は /etc/fstab
に書き込みます。
# この2行を追加
FutonHead:/home /home nfs defaults 0 0
FutonHead:/usr/local /usr/local nfs defaults 0 0
設定した後は以下のコマンドでマウントが実行されます。
Futon01 $ mount -a
マウントされたかどうかは以下のコマンドで確認可能。
Futon01 $ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 443G 4.0G 417G 1% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 32G 4.0K 32G 1% /dev
tmpfs 6.3G 1.5M 6.3G 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 32G 0 32G 0% /run/shm
none 100M 0 100M 0% /run/user
FutonHead:/home 2.7T 1.4T 1.2T 54% /home
一番下の行を見ると、ヘッドノードの /home が計算ノードの /home にマウントされていることが確認できます1 。/etc/fstab に書き込んだ内容は再起動時にも反映されます。
互換性の問題
今回は /home と /usr/local を共有したので、これらのディレクトリに実行ファイルを置いておけば、どの計算ノードでも実行することが出来ます。しかし、そのために互換性の問題が発生することがあります。
たとえば今回僕が作ったクラスタの CPU には各世代の CPU が入り交じっているため Nehalem 世代でコンパイルしたバイナリを Haswell 上で実行すると「このハードは AVX2 対応2なのでそれ用のバイナリ使ったほうがいいっすよ」という警告が出たりしました。
なので、アーキテクチャに直接触りそうなプログラム(CUDA とか)は /usr/local に置かず、各ノードでコンパイルしたものを使ったほうがいいと思います。