web-dev-qa-db-ja.com

nfsではなくローカルで実行されているrm -rfを使用する方が良いですか?

ディレクトリでrm -rfを実行する前に、ディレクトリがあるマシンにログインする場合、またはNFS経由でディレクトリrm -rfを実行する場合、時間に大きな違いがありますか?

10
steviekm3

もちろん、sshの方が優れています。

NFSは、さまざまなリモートプロシージャコールとデータ同期待機時間を持つ複雑なネットワークプロトコルを使用します。 sshの場合、これらは適用されません。

さらに、多くのロックがあります。 NFSでのファイルの削除は次のように機能します。

  1. rmコマンドはunlink() syscallを提供します
  2. nfsドライバーはそれをsunrpc要求に変換し、nfsサーバーに送信します
  3. nfsサーバーは、このsunrpc要求をunlink()呼び出しに変換します
  4. リモート側でこのunlink()呼び出しを実行します
  5. 成功した後、クライアントに「大丈夫です、完了しました」に相当するrpc応答メッセージを返します
  6. クライアント側のカーネルドライバーは、これを元のrmunlink()呼び出しの終了コード0に変換します。
  7. rm次のファイルまで反復し、goto 1

ここで重要なのは2-7の間、rmは待機する必要があります。次のunlink()呼び出しを非同期で送信できますが、シングルスレッドではありません。イベント指向のツール。可能であっても、トリッキーなnfsマウントフラグが必要です。結果が得られなくなるまで待機します。

NFS-と任意のネットワークファイルシステム-は常にずっと遅いです。


多くの場合、次のトリックで再帰的な削除をほぼ無限の速度で実行できます。

  1. まず、ディレクトリを別の名前に移動します(_mv -vf oldfilms oldfilms-_)
  2. バックグラウンドで削除(_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
5
Kusalananda