web-dev-qa-db-ja.com

大規模なディレクトリツリーでrm -rfを実行すると数時間かかる

バックアップにはrsnapshotを使用しています。それはバックアップされたファイルの多くのスナップショットを保持しますが、古いものを削除します。これはいい。ただし、大規模なディレクトリツリーでrm -rfを実行するには、約7時間かかります。ファイルシステムはXFSです。ファイルの数はわかりませんが、おそらく数百万にのぼります。

とにかくスピードを上げる方法はありますか? rm -rfと同じで何時間もかからないコマンドはありますか?

21
Rory

番号。

_rm -rf_は、ファイルシステムの再帰的な深さ優先トラバーサルを実行し、すべてのファイルでunlink()を呼び出します。プロセスの速度を低下させる2つの操作は、opendir()/readdir()unlink()です。 opendir()およびreaddir()は、ディレクトリ内のファイル数に依存します。 unlink()は、削除するファイルのサイズによって異なります。これを迅速に行う唯一の方法は、ファイルのサイズと数を減らす(おそらくそうは思わない)か、ファイルシステムをこれらの操作に適した特性を持つファイルシステムに変更することです。 XFSは大きなファイルのunlink()には適していると思いますが、大きなディレクトリ構造にはあまり適していません。 ext3 + dirindexまたはreiserfsの方が速い場合があります。 JFSがどれほどうまく機能しているかはわかりませんが、さまざまなファイルシステムパフォーマンスのベンチマークがたくさんあると思います。

編集: XFSはツリーの削除にひどい ので、ファイルシステムを確実に変更してください。

39
David Pashley

別の方法として、ディレクトリを脇に移動し、同じ名前、権限、所有権でディレクトリを再作成し、そのディレクトリに関係するすべてのアプリ/サービスを再起動します。

その後、長時間の停止を心配することなく、元のディレクトリをバックグラウンドで "Nice rm"できます。

25
Greg Work

XFSに適切なマウントオプションが設定されていることを確認してください。

XFSで-ologbufs = 8、logbsize = 256kを使用すると、おそらく削除パフォーマンスが3倍になります。

8
James

ファイルレベルで効果的にrmを実行している場合は、時間がかかります。これが、ブロックベースのスナップショットがとても良い理由です:)。

Rmを別々の領域に分割して並行して試行することもできますが、改善は期待できません。 XFSにはファイルの削除に関する問題があることが知られており、それがあなたが行うことの大部分である場合、おそらくそれとは異なるファイルシステムが考えられます。

5
James

使用するファイルシステムに関係なく、そのようなIO集中型の操作にはioniceを使用することをお勧めします。
このコマンドをお勧めします:

ionice -n7素敵なrm -fr dir_name

負荷の高いIO負荷のあるサーバーでのバックグラウンド操作に適しています。

5
ash108

これは古いことは知っていますが、提案でid tossと考えました。これらのファイルを順番に削除します。rm操作を並列実行すると、処理が高速化する場合があります。

http://savannah.nongnu.org/projects/parallel/ parallelは一般的にxargsの代わりに使用できます

だからあなたがdeltedirのすべてのファイルを削除する場合

find -t f deletedir | parallel -j 10 rm

これにより、削除するディレクトリ構造が空になります。

注:上記のように、ファイルシステムの制限に達する可能性があります。

2
Nick Anderson

ここでの代替オプションは、rmを実行する代わりに実際のファイルシステムをジャンクして再構築できるような方法でデータを分離することでしょうか?

1
Moo

コマンドの素晴らしさを減らすのはどうですか?お気に入り:

Nice -20 rm -rf /path/to/dir/
0
RainyRat