回答:
もちろん、sshの方が優れています。
NFSは、さまざまなリモートプロシージャコールとデータ同期待機時間を持つ複雑なネットワークプロトコルを使用します。sshの場合、これらは適用されません。
さらに、多くのロックがあります。nfsでのファイル削除は次のように機能します。
rm
コマンドはunlink()
syscall を与えますunlink()
呼び出しに変換しますunlink()
呼び出しをリモート側で実行しますunlink()
元の呼び出しの終了コード0に変換します。rm
rm
次のファイルまで反復し、goto 1さて、重要なことは:2-7の間、rm
待つ必要があります。次のunlink()
呼び出しを非同期に送信できますが、イベント指向のツールではなく、シングルスレッドです。それができたとしても、トリッキーなnfsマウントフラグが必要です。結果が得られなくなるまで待ちます。
NFS-と任意のネットワークファイルシステム-は常にずっと遅いです。
多くの場合、トリックを使用して再帰的に削除を準無限の速度で行うことができます。
mv -vf oldfilms oldfilms-
)rm -rf oldfilms- &
)多くの(すべてではない)側面から、このディレクトリの削除は、実際にはゼロ時間で行われたかのように見えます。
拡張子: @ el.pascadoが彼の優れたコメントで言及しているように、実際には2-7はすべてのファイルに対して3xを実行する必要があります。
lstat()
syscallを使用)かどうかを判断するには、unlink()
の場合、ディレクトリの場合は、その中のopendir()
すべてのファイル/ディレクトリを再帰的に削除してからclosedir()
、最後にrmdir()
。readdir()
呼び出しで次のディレクトリエントリまで反復します。これには、ファイル用に3つのnfs RPCコマンドが必要であり、ディレクトリ用にさらに3つ必要です。
はい。まあ、多分。場合によります。ファイルとディレクトリの数が少ない場合は、それほど大きな違いはありません。
NFSマウントされたディレクトリでファイル操作を一括で実行すると、時間がかかります。NFSサーバー自体にログインし、実際のディレクトリでそれらを実行する機会がある場合、これはより速くなります。
CVSからチェックアウトしてNFS経由でマウントしたOpenBSDポートコレクションを削除してテストしてみましょう。
NFSサーバー:
$ cd /export/shared/ports
$ du -hs .
2.6G .
$ find . | wc -l
179688
$ time rm -rf /export/shared/ports/*
0m20.87s real 0m00.12s user 0m04.62s system
クライアント上(バックアップから元のファイルを復元した後):
$ time rm -rf /usr/ports/*
6m49.73s real 0m01.55s user 1m08.96s system
-r
フラグに言及しrm
ているように、最初にファイルが(lstat
nfsを介して)ディレクトリであるかどうかを確認し、(nfsを介して)開きopendir
、その内容を(readdir
nfsを介して)読み取ってから、内部で見つかったすべてのファイルに対して回答で説明されているように実際の削除を実行する必要があります。サブディレクトリに再帰し、(closedir
nfsを介して)ディレクトリを閉じてから、見つかったすべてのディレクトリに対して繰り返します。