「遅いライン」としてはモデムや ISDN、あるいは遠く離れたコネクション などを想定しています(ありがちなのは最後でしょう)。
この節はプロトコルの知識に基づいたもので、実際の実験は行っていませ ん。私の家のコンピュータは HDD のクラッシュのせいでこの6ヶ月間ダウンし たままなので、この内容をテストするためのモデム回線がないのです。もしこ この内容を試したら、是非私までお知らせ下さい :-)
まず覚えておいて欲しいことは、 NFS は遅いプロトコルである、というこ とです。 NFS はオーバーヘッドが大きいのです。 NFS を用いるのはファイル 転送に kermit を用いるようなもので、遅いのです。ほとんどのプロト コルは NFS より速く、 FTP 、HTTP、 rcp、 ssh 全部そうです。
でも試してみたい、ですか?わかりました。
NFS のデフォルトのパラメータは、転送も応答もきわめて速いラインに向いた ものになっています。デフォルトのパラメータを応答の遅いラインに用い ると、「NFS からエラーがレポートされる」、「オペレーションが中断する」、 「ファイルが実際より小さくなる」などなど、様々な不思議な現象に見舞 われることになります。
まず最初に行うべきは、マウントオプション soft
の使用を中止する
ことです。これを用いるとタイムアウトがおこり、ソフトウェアにエラーが返
されます。たいていのソフトではこのエラーを正しく扱えるようになっていま
せん。これが不可思議なエラーの主な理由です。代わりにマウントオプション
として hard
を用いて下さい。 hard
を有効にすると、無限にリト
ライを繰り返すようになり、ソフトウェアの都合を考えずに勝手に中断したり
することがなくなります。こちらの方が良いんです。本当です。
次にすべきことは、マウントオプションの timeo と retrans をチューン することです。これらは nfs(5) のマニュアルページに記述されていますが、 ここにもコピーを書きます。
RPC タイムアウトの後、最初の再送を行うまでの時間を 1/10 秒単位で指定する。デフォルトは 7 (つまり 0.7 秒)。最初のタイムアウト の後は、タイムアウトの時間は倍々される。これはタイムアウトが最大値の 60 秒になるか、あるいは再送の回数が指定した値よりも大きくなってメジャー タイムアウトとなるまで続く。メジャータイムアウトになると、ファイ ルシステムがハードマウントされている場合には、新たなタイムアウト列が初 期値を 2 倍にして再び試みられる(列の内部ではタイムアウトは倍々)。タ イムアウトの最大値は常に 60 秒である。ネットワークが混雑している、サー バが遅い、経路に複数のルータまたはゲートウェイがある、などの場合にはこ のタイムアウトを増やすことによって全体の性能を向上させることができる。
マイナータイムアウトと再送の合計数がこの値を超えるとメ ジャータイムアウトとなる。デフォルトは 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 の時間を計測しておくべきでしょう。