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

5. 遅いラインを通しての NFS

「遅いライン」としてはモデムや ISDN、 あるいは遠く離れたコネクションなどを想定しています (ありがちなのは最後でしょう)。

この節はプロトコルの知識に基づいて書いたたもので、 実際の実験は行っていません。うまくいったら教えてくださいね :-)

まず覚えておいて欲しいことは、 NFS は遅いプロトコルである、 ということです。 NFS はオーバーヘッドが大きいのです。 NFS を用いるのはファイル転送に kermit を用いるようなもので、 遅いのです。ほとんどのプロトコルは NFS より速く、 FTP, HTTP, rcp, ssh 全部そうです。

でも試してみたい、ですか?わかりました。

NFS のデフォルトのパラメータは、 極めて高速かつ遅延の少ないラインに向いたものになっています。 デフォルトのパラメータを遅延の大きいラインに用いると、 「NFS からエラーがレポートされる」、「オペレーションが中断する」、 「ファイルが実際より小さくなる」などなど、様々な不思議な現象に見舞 われることになります。

まず最初に行うべきは、マウントオプション soft の使用を中止することです。 これを用いるとタイムアウトがおこり、ソフトウェアにエラーが返されます。 たいていのソフトではこのエラーを正しく扱えるようになっていません。 これが不可思議なエラーの主な理由です。代わりにマウントオプションとして hard を用いて下さい。 hard を有効にすると、 無限にリトライを繰り返すようになり、 ソフトウェアの都合を考えずに勝手に中断したりすることがなくなります。 こちらの方が良いんです。本当です。

次にすべきことは、マウントオプションの timeoretrans をチューンすることです。 これらは nfs(5) のマニュアルページに記述されていますが、 ここにもコピーを書きます。

timeo=n

RPC タイムアウトの後、最初の再送を行うまでの時間を 1/10 秒単位で指定する。デフォルトは 7 (つまり 0.7 秒)。最初のタイムアウト の後は、タイムアウトの時間は倍々される。これはタイムアウトが最大値の 60 秒になるか、あるいは再送の回数が指定した値よりも大きくなってメジャー タイムアウトとなるまで続く。メジャータイムアウトになると、ファイ ルシステムがハードマウントされている場合には、新たなタイムアウト列が初 期値を 2 倍にして再び試みられる (列の内部ではタイムアウトは倍々)。タ イムアウトの最大値は常に 60 秒である。ネットワークが混雑している、サー バが遅い、経路に複数のルータまたはゲートウェイがある、などの場合にはこ のタイムアウトを増やすことによって全体の性能を向上させることができる。

retrans=n

マイナータイムアウトと再送の合計数がこの値を超えるとメ ジャータイムアウトとなる。デフォルトは 3 回。メジャータイムアウトが起 こると、ファイル操作は中断されるか、あるいは "server not responding" のメッセージがコンソールに表示される。

もうちょっとわかりやすく言いましょう。もし返事がタイムアウトである 0.7 秒 (700ms) のうちに返ってこないと、 NFS クライアントはリクエストを 再送してタイムアウトを倍の 1.4 秒にします。さらに返事が 1.4 秒以内に返っ てこない場合には、再度リクエストを送り、タイムアウトも倍の 2.8 秒にす るわけです。

ラインの速度は ping で測定することができます。パケットのサイズは rsize/wsize オプションで与えた値と同じにします。


$ ping -s 8192 lugulbanda
PING lugulbanda.uio.no (129.240.222.99): 8192 data bytes
8200 bytes from 129.240.222.99: icmp_seq=0 ttl=64 time=15.2 ms
8200 bytes from 129.240.222.99: icmp_seq=1 ttl=64 time=15.9 ms
8200 bytes from 129.240.222.99: icmp_seq=2 ttl=64 time=14.9 ms
8200 bytes from 129.240.222.99: icmp_seq=3 ttl=64 time=14.9 ms
8200 bytes from 129.240.222.99: icmp_seq=4 ttl=64 time=15.0 ms

--- lugulbanda.uio.no ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 14.9/15.1/15.9 ms

ここでの時間は ping のパケットが lugulbanda まで往復する時間を測ってい ます。 15ms はきわめて高速と言えます。 28000 bps のラインでは、 4000-5000ms 程度の値となるでしょう。もしラインに他の負荷がかかっている 場合にはこの時間はさらに長くなり、倍になることも珍しくありません。この 時間が長いことを「遅延が大きい」と言っているのです。一般的に、パケッ トが大きくなるほど、またラインの負荷が高くなるほど遅延は大きくなります。 timeo をあなたのラインと負荷にあわせて大きくして下さい。 ラインを他の用途に使っている場合は、 その分遅延が大きくなることも考慮して下さい。 例えば FTP と NFS を同時に使いたいような場合には、 FTP でファイル転送を行っている間に ping の時間を計測し、 ラインの遅延にあった timeo を設定すべきでしょう。


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