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


20

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

とにかくスピードアップする方法はありますか?何rm -rf時間もかかり、同じ時間を要しないコマンドはありますか?


1
私が使用しfind . -delete -name directory、それははるかに高速ですrm -rf
パオロ

回答:


38

いや

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

編集:XFSはtreesの削除がひどいようですので、間違いなくファイルシステムを変更してください。


1
数年前、同様のユースケースでreiserfsを使用すると、ひどいパフォーマンスに気付きました。
knweiss 09

1
素晴らしい投稿!
wzzrd 09

2
それはほとんど「いいえ」と言った:)
デビッドパシュリー

2
リンク解除の速度はファイルのサイズに依存するという声明は別として、ここのすべてに同意します。unlinkはファイルへのリンクを削除するだけで、実際のコンテンツには何もしません。異なるサイズのファイル間で識別可能な違いはないはずです(これは自分でテストできます)。
カミルKisiel

@KamilKisiel unlink実際のコンテンツには何もしませんが、unlinkシステムコールを実行するには、削除されたリンクがファイルの最後のリンクであり、現在開いていない場合、ファイルシステムコードはそれ以上の作業が必要です。これはもちろんファイルシステムに依存しますが、削除されたファイルが巨大な場合は非常に識別可能な違いがあります。
jlliagre

22

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

その後、長時間の停止を心配することなく、バックグラウンドで元のディレクトリを「素敵な状態」にすることができます。


mvは非常に高速であるため、これは機能します。
ロリー

うん-それはうまく機能します。私はこのテクニックを何度も使って、メールクライアントが頭脳を失い、ディスクに混乱を残したmaildirベースのメールボックスを「修正」しました。この方法で修正した最大(単一)のディレクトリには、約150〜200万個のファイルIIRCがありました。エンドユーザーへの合計ダウンタイムは約3分で、そのほとんどはメールクライアントとimapプロセスが停止するのを待っていました。
グレッグワーク

7

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

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


2
このヒントの+1 ...別のパフォーマンス向上のために、遅延カウンターを有効にする必要があります。
hurikhan77

1
これらの設定に関するいくつかの説明は、将来の読者に役立つでしょう。
アロンロテベエル

5

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

rmを別々の領域に分割して並行して実行することもできますが、改善されるとは思わないかもしれません。XFSにはファイルの削除に問題があることが知られており、それがあなたのすることの大部分を占める場合は、そのための別のファイルシステムが考えられるでしょう。


この場合、ブロックベースのスナップショットは一意に適切ではありません。多数のファイルシステム--- WAFLとZFSがすぐに思い浮かびます---スナップショット削除のパフォーマンスも良好です。スナップショットをファーストクラスのファイルシステムオブジェクトとして扱います。したがって、何百万ものファイルを(ゆっくりと)繰り返して解放するブロックを決定するのではなく、スナップショットに関連付けられたブロックリストを調べるだけで済みます。
キーススミス

うーん 私はおそらく上記に反しすぎていると思いました。元のポスターはLinuxを使用している必要があり、スナップショットを実行する実績のあるLinuxファイルシステムは実際にはありません。したがって、実際問題として、ブロックベースのスナップショットを使用した方がよいことに同意します。
キーススミス

ワークロードを分割して並列化するためのヒントとして+1:xfsは並列ワークロードでその強みを発揮します。
hurikhan77

5

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

ionice -n7 nice rm -fr dir_name

IO負荷が大きいサーバーでのバックグラウンド操作に最適です。


2

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

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

したがって、deltedirのすべてのファイルを削除する場合

find -t f deletedir | parallel -j 10 rm

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

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


xargsよりも並列を使用する利点は何ですか?
ロリー

1

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


3
rsnapshotは、maintaining-multiple-snapshots-efficiently機能の一部としてハードリンクを使用すると思います。そのため、質問者が個別のファイルシステムを使用してその機能を使用している場合は機能しません(ファイルシステムの境界を越えてハードリンクできないため)
David Spillett 09

0

コマンドの良さを減らすのはどうですか?のような:

nice -20 rm -rf /path/to/dir/

5
ボトルネックはスケジューラではなく、ファイルシステムです。
マヌエルフェイク

万一スケジューラーがボトルネックになった場合、I / Oサブシステムを強く叩くだけで、rmの間はサーバーの使用がさらに難しくなります。
デビッドマッキントッシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.