Help us understand the problem. What is going on with this article?

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

More than 3 years have 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 から導入された拡張命令セット。 

yubais
研究者っぽいものです。Python でデータ解析してます。Twitter Web クライアントを作ったことがあります。
http://yubais.net
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away