Short version:rm -rf mydir
、mydir
(再帰的に)250万のファイルを含み、ほとんどアイドル状態の場合、約12時間かかります機械。
詳細情報:削除されるファイルのほとんどは、他のディレクトリ内のファイルへのハードリンクです(削除されるディレクトリは、実際にはrsnapshot
; rm
コマンドは実際にはrsnapshot
によって提供されます。したがって、ほとんどの場合、削除されるのはディレクトリエントリです。ファイルの内容自体はそれほど多くありません。およそ数十GBです。
btrfs
が犯人であるかどうかは、私にはほど遠いです。 btrfs
を使い始める前のバックアップも非常に遅いことを思い出しましたが、削除の速度が遅いことが確かではありません。
マシンはIntel Core i5 2.67 GHz、4 GB RAMです。 2つのSATAディスクがあり、1つはOSと他のいくつかのもので、バックアップディスクは1 TB WDC WD1002FAEX-00Z3A0
です。マザーボードはAsus P7P55Dです。
編集:マシンはLinuxを備えたDebian wheezy 3.16.3-2~bpo70+1
です。これはファイルシステムがマウントされる方法です:
root@thames:~# mount|grep rsnapshot
/dev/sdb1 on /var/backups/rsnapshot type btrfs (rw,relatime,compress=zlib,space_cache)
編集:rsync -a --delete /some/empty/dir mydir
の使用には約6時間かかります。 rm -rf
を大幅に改善しましたが、それでも多すぎると思います。 ( rsync
がrm
よりも速い理由の説明 : "[ほとんどの]ファイルシステムは、ディレクトリ構造をbtree形式で保存します。ファイルは...重要です。リンク解除を実行するときに、btreeの再調整を回避する必要があります。..rsync -a --delete
...削除を順番に実行します ")
編集:ディレクトリに(再帰的に)220万のファイルがある別のディスクを接続しましたが、XFS上にありました。ここにいくつかの比較結果があります:
On the XFS disk On the BTRFS disk
Cached reads[1] 10 GB/s 10 GB/s
Buffered reads[1] 80 MB/s 115 MB/s
Walk tree[2] 11 minutes 43 minutes
rm -rf mydir[3] 7 minutes 12 hours
[1] hdparm -T /dev/sdX
およびhdparm -t /dev/sdX
を使用。
[2]ブート直後のfind mydir -print|wc -l
の実行にかかった時間。
[3] XFSディスクでは、これはfind
でツリーを歩いた直後です。 BTRFSディスクでは、これは古い測定値です(そして、ツリーがキャッシュされていたとは思いません)。
btrfs
に問題があるようです。
さて、これはまだBtrfsの問題であり、多くの小さなファイルを削除すると、他のファイルシステムに比べてかなり長い時間がかかることはよく知られています。
気に入らない場合は、アップストリームが修正するまで待つか、それを改善する別のファイルシステムに移ることができます。
ただし、主なエラーは、btrfsで古いカーネル(3.16、投稿したときにすでに古い)を使用していることです。 Btrfsはファイルシステムであり、現在も開発が進んでいるため、常に最新かつ最も優れたカーネルバージョンを使用して、改善に連絡する必要があります。ディストリビューションがバックポートを行わない場合は、自分で行うか、ねじ込みます。
Btrfsはカーネルバージョン3.19で多くのパフォーマンス向上を実現しました-これは、本番環境で使用する必要のある最小バージョンです。カーネルバージョン3.16は、バックポートなしで明白に機能しません。
また、Chris Masonによれば、Btrfsは現時点では安定していると考えていますが、まだプロダクションの準備は整っていません。
私はこのパーティーに少し遅れていますが、非常に大きなbtrfsツリーを非常にすばやく削除するためのコツがあります。
カーネルはバックグラウンドでスペースを再利用し始めるので、すぐに使用可能なスペースがなくなりますが、プロセスはユーザーランドの削除を行うよりもはるかに高速です。
ディレクトリの名前を変更してから、バックグラウンドプロセスで名前を変更したディレクトリを削除できます。これは削除操作を高速化するつもりはありません。ただし、これにより、側で削除操作が行われている間、プログラムは空のディレクトリで先に進むことができます。
これがあなたのユースケースでうまくいくかどうかはわかりません。ディスクがアイドル状態になるまでプログラムを続行できないかどうか(つまり、重いディスク操作を実行するかどうか)によって異なります。プログラムがディスクを大量のデータで満たすかどうかによって異なります。