作業を実行する前に、ディレクトリがあるシステムにログインすることとNFSを介してディレクトリにログインすることrm -rf
には時間に大きな違いがありますか?rm -rf
答え1
もちろん、SSHが良いです。
Nfsは、さまざまなリモートプロシージャコールとデータ同期待ち時間を含む複雑なネットワークプロトコルを使用します。 SSH の場合、これは適用されません。
他にもロックがたくさんあります。 nfsのファイル削除は次のように機能します。
- あなたの
rm
コマンドはunlink()
システムコールを提供します - nfsドライバはそれをsunrpc要求に変換してnfsサーバーに送信します。
- nfs サーバーは、この sunrpc 要求を
unlink()
呼び出しに戻します。 unlink()
リモート側でこの呼び出しを実行します。- 成功後、「Okay, done」に対応するRPC応答メッセージをクライアントに返します。
- クライアントのカーネルドライバは、それを
unlink()
元の呼び出しの終了コード0に戻します。rm
rm
次のファイルに繰り返して1に移動
今重要なことは次のとおりです。午後2時~7時の間rm
待つ必要があります。次のunlink()
呼び出しは非同期的に送信できますが、シングルスレッドであり、イベント指向のツールではありません。可能であっても依然としてトリッキーなnfsマウントフラグが必要です。結果が出ないまで待ちます。
NFSとすべてのネットワークファイルシステムは常にはるかに遅いです。
ほとんどの場合、次のトリックを使用すると、再帰的な削除をほぼ無限にすばやく実行できます。
- まず、ディレクトリを別の名前(
mv -vf oldfilms oldfilms-
)に移動します。 - バックグラウンドで削除(
rm -rf oldfilms- &
)
すべてではありませんが、多くの点でこのディレクトリの削除はほぼ0回に発生したようです。
拡大する:@el.pascadoが彼の素晴らしいコメントで述べたように、実際に2-7を実行する必要があります。3倍すべてのファイルの場合:
- ファイルかディレクトリかを確認する(
lstat()
システムコールを使用) - それから適切な仕事をしてください。通常のファイル
unlink()
とディレクトリの場合は、opendir()
その中のすべてのファイル/ディレクトリを繰り返し削除し、最後closedir()
にを削除しますrmdir()
。 readdir()
最後に呼び出して、次のディレクトリエントリで繰り返します。
ファイルには3つのnfs RPCコマンドが必要で、ディレクトリには3つの追加コマンドが必要です。
答え2
はい。おそらく。時々違うよね少数のファイルやディレクトリでは大きな違いはありません。
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