ディレクトリでrm -rf
を実行する前に、ディレクトリがあるマシンにログインする場合、またはNFS経由でディレクトリrm -rf
を実行する場合、時間に大きな違いがありますか?
もちろん、sshの方が優れています。
NFSは、さまざまなリモートプロシージャコールとデータ同期待機時間を持つ複雑なネットワークプロトコルを使用します。 sshの場合、これらは適用されません。
さらに、多くのロックがあります。 NFSでのファイルの削除は次のように機能します。
rm
コマンドはunlink()
syscallを提供しますunlink()
呼び出しに変換しますunlink()
呼び出しを実行しますrm
のunlink()
呼び出しの終了コード0に変換します。rm
次のファイルまで反復し、goto 1ここで重要なのは2-7の間、rm
は待機する必要があります。次のunlink()
呼び出しを非同期で送信できますが、シングルスレッドではありません。イベント指向のツール。可能であっても、トリッキーなnfsマウントフラグが必要です。結果が得られなくなるまで待機します。
NFS-と任意のネットワークファイルシステム-は常にずっと遅いです。
多くの場合、次のトリックで再帰的な削除をほぼ無限の速度で実行できます。
mv -vf oldfilms oldfilms-
_)rm -rf oldfilms- &
_)多くの(すべてではない)側面から、このディレクトリの削除は、実質的にゼロ時間で行われたかのように見えます。
Extension: @ el.pascadoが彼の優れたコメントで言及しているように、実際には2〜7ですべてのファイルに対してxを実行する必要があります。
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