次のページ 前のページ 目次へ

4. NFS クライアントの設定

まずカーネルに NFS ファイルシステムの機能を持たせる必要があります。 直に組み込むか、モジュールとして利用できるようにするかしておいて下さい。 これらはカーネルをコンパイルする前に指定します。まだ一度もカーネルのコ ンパイルをしたことのない人は kernel HOWTO などを読んでがんばって下さい。 また良くできた配布パッケージ (Red Hat など) を使っていて、これまでカー ネルやモジュールをいじっていない (つまり台無しにしていない :-) のなら、 おそらく NFS はすでに利用できるようになっているでしょう。

続いて root のプロンプトで適切な mount コマンドを実行すればファイル システムを利用できるようになります。前の章からの例を続けることにして、 eris/mn/eris/local をマウントする場合を考えます。こ の場合は以下のようなコマンドになります。


mount -o rsize=1024,wsize=1024 eris:/mn/eris/local /mnt

rsizewsize オプションについては後で説明します。この時点で /mnt 以下でファイルシステムが利用できるようになっているはずで す。 cdls したり、それぞれのファイルを見ることもできます。 このファイルシステムはローカルなものよりは遅いかもしれませんが、でも ftp よりはずっと便利でしょう?

もしマウントがうまく行かなくて、 mount: eris:/mn/eris/local failed, reason give by server: Permission denied というようなエラー メッセージが出る場合には、サーバの exports ファイルが間違っていないか、 修正後に exportfs の実行を行ったかを確認して下さい。また mount clntudp_create: RPC: Program not registered というエラーだった場 合は、サーバで mountd か nfsd が実行されていないのが原因です。 あるいは先に紹介した hosts.{allow.deny} の問題かもしれません。

ファイルシステムを切り離すには以下のようにします。


umount /mnt

システムの起動時に NFS ファイルシステムをマウントさせるためには、 /etc/fstab ファイルを通常のように編集します。我々の例に従えば、 以下のような行が必要になります。


# device      mountpoint     fs-type     options              dump fsckorder
...
eris:/mn/eris/local  /mnt    nfs        rsize=1024,wsize=1024 0    0
...

これでほとんど終わりですが、この先も読んで下さいね。

4.1 mount のオプション

他にも一緒につけておくと良さそうなオプションがあります。 NFS サーバがクラッシュしたときやネットワークが切断されたときに クライアントでどうするかを指定するものです。 この状態を美しく扱うことができるのが NFS の良いところの一つです。 サーバの障害にあたっては二つのモードがあります。

soft

NFS クライアントは NFS マウントされたファイルシステムにアクセスしてい るプロセスにエラーを通知します。このエラーを正しく扱えるプログラムは ほとんどありません。この設定はお勧めできません。これはファイルを 破壊したりデータをロストするための手段です。特にメールのディスクには 使うべきではありません -- メールに価値を認めているならば。

hard

NFS マウントされたファイルシステム上のファイルにアクセスしているプログ ラムはサーバがクラッシュすると宙ぶらりんになります。これらのプロセスは intr を一緒に指定していない場合は中断することも kill することもで きなくなります。 NFS サーバが復活すると、プログラムはそれぞれ何もなかっ たかのように再開します。おそらくこちらが望ましい場合が多いでしょう。私 は全ての NFS マウントに hard,intr を用いることをお勧めします。

以前の例をまた用いることにします。 fstab のエントリは以下のようにな ります。


# device      mountpoint     fs-type    options                  dump fsckorder
...
eris:/mn/eris/local  /mnt    nfs        rsize=1024,wsize=1024,hard,intr 0 0
...

4.2 NFS を最適化する

rsizewsize といったオプションがない場合、 通常 NFS は 4096 か 8192 バイトを単位に読み書きを行います。 しかし Linux のカーネルとネットワークカードの組み合わせによっては、 この設定では動かなかったり、あるいは遅くなってしまったりする場合があります。 ですからここでは実験を行って、最速になるような rsizewsize を決定するやり方を述べることにします。 転送速度は簡単なコマンドの組み合わせで調べることができます。 先ほど示した mount コマンドで書き込み可能にしたディスクに 以下のようなコマンドを用いると、 シーケンシャルな書き込みの性能をテストすることができます。


time dd if=/dev/zero of=/mnt/testfile bs=16k count=4096

このコマンドによって中身がすべて 0 のバイト列で埋め尽くされた 64Mb のファイルができます (おそらくこれだけのサイズがあれば、 パフォーマンスに対するキャッシュの影響を小さくできるでしょう。 もしたくさんメモリを積んでいる場合にはもっとファイルを大きくして下さい)。 何度か (5〜10 回くらい) 行って平均時間を求めて下さい。 この場合最も大事なのは `elapsed' あるいは `wall clock' で表示される時間です。 次にこのファイルを再読み込みすることで、 読み込み性能のテストを行います。


time dd if=/mnt/testfile of=/dev/null bs=16k

こちらも数回行って平均しましょう。その後 umount し、 rsizewsize に大きな値を入れて再び mount して下さい。 値は 1024 の倍数になるようにし、 16384 バイトは越えないようにしましょ う (これは NFS バージョン 2 の制限です)。 mount したらそのファイルシステムに cd で入り、ファイルシステ ムの中味が正しく見えるかをしばらく調べてみて下さい。 rsizewsize が大きく過ぎると、妙な兆候が現われ、ファイルの信頼性が 100% でなくなります。よくある例としては、 「エラーメッセージは出ないのに "ls" の結果が不完全にな る」「エラーメッセージは出ないのにファイルの読み込みが失敗する」などが あります。さて、与えた rsizewsize でシステムが正しく動作 していることがわかったら、もう一度速度のテストをしてみましょう。サーバ の OS が違うと最適なサイズも異なる場合が多いです。 SunOS や Solaris の 場合は 4096 が他に比べてずっと速かったりするそうです。

最近の Linux カーネル (1.3 のどれか以降) では rsize をマシンのペー ジサイズと同じかそれ以上にすると先読みが行われます。 Intel の CPU で はページのサイズは 4096 バイトです。先読みは NFS の読み込み速度をはっ きり体感できるほど高速化します。ですから Intel のマシンでは、可能ならば rsize を 4096 バイトにすると良いでしょう。もちろんあくまで可能な らば、です。

rsizewsize を反映させるためには /etc/fstab の編集が必要になることをお忘れなく。

NFS の書き込み速度を上げる技として、サーバの同期書き込みを禁止する 方法があります。 NFS の仕様によると、データが不揮発性のメディア (普通 はディスク) に書き込まれるまで、NFS の書き込み要求は終了されたとは見な されません。この仕様のため書き込み性能に制限が生じます。また非同期 書き込みによって NFS の書き込み速度が上昇するのはこのためです。 これまで Linux の nfsd で同期書き込みが実装されたことはありません。な ぜなら Linux のファイルシステムの実装においては同期書き込みが重要視さ れていないからです。しかし Linux 以外のサーバでは exports ファイ ルに以下のような記述をすることによって性能を上げることが可能です。


/dir    -async,access=linuxbox

書式は異なるかもしれませんので、そのマシンの exports の man ページを参照して下さい。 なお、これによってデータを失う危険性が高まることは知っておいて下さい。


次のページ 前のページ 目次へ