Linux で計算機クラスタを作る (2. 分散ファイルシステム NFS 導入)

  • 15
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Linux で計算機クラスタを作る (1. ネットワーク構築) の続き。

今回つくったクラスタの構成図(再掲)。
futon.png

計算機クラスタにおいては、計算の実行は各ノードで行いますが、データは一箇所に集約されている必要があります。そこで今回はヘッドノード 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サーバーとして公開するディレクトリを明記します。

/etc/exports
# この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 に書き込みます。

/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 に置かず、各ノードでコンパイルしたものを使ったほうがいいと思います。


  1. /usr/local は表示されないけど cd で移動するとちゃんとマウントされている。同じ場所をマウントした場合片方しか書かれないとかかな。 

  2. Haswell から導入された拡張命令セット。