web-dev-qa-db-ja.com

ファイルの削除に時間がかかりすぎる

Short versionrm -rf mydirmydir(再帰的に)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を大幅に改善しましたが、それでも多すぎると思います。 ( rsyncrmよりも速い理由の説明 : "[ほとんどの]ファイルシステムは、ディレクトリ構造を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に問題があるようです。

11

さて、これはまだBtrfsの問題であり、多くの小さなファイルを削除すると、他のファイルシステムに比べてかなり長い時間がかかることはよく知られています。

気に入らない場合は、アップストリームが修正するまで待つか、それを改善する別のファイルシステムに移ることができます。

ただし、主なエラーは、btrfsで古いカーネル(3.16、投稿したときにすでに古い)を使用していることです。 Btrfsはファイルシステムであり、現在も開発が進んでいるため、常に最新かつ最も優れたカーネルバージョンを使用して、改善に連絡する必要があります。ディストリビューションがバックポートを行わない場合は、自分で行うか、ねじ込みます。

Btrfsはカーネルバージョン3.19で多くのパフォーマンス向上を実現しました-これは、本番環境で使用する必要のある最小バージョンです。カーネルバージョン3.16は、バックポートなしで明白に機能しません。

また、Chris Masonによれば、Btrfsは現時点では安定していると考えていますが、まだプロダクションの準備は整っていません。

3
Marc Stürmer

私はこのパーティーに少し遅れていますが、非常に大きなbtrfsツリーを非常にすばやく削除するためのコツがあります。

  1. 同じbtrfsファイルシステムにダミーのサブボリュームを作成します。
  2. 削除するトップレベルのディレクトリを上記のサブボリュームに移動します。同じbtrfsファイルシステムで実行している場合、サブボリューム間でも、この操作は非常に高速です。
  3. サブボリュームを破棄します。

カーネルはバックグラウンドでスペースを再利用し始めるので、すぐに使用可能なスペースがなくなりますが、プロセスはユーザーランドの削除を行うよりもはるかに高速です。

2
Nicolas Noble

ディレクトリの名前を変更してから、バックグラウンドプロセスで名前を変更したディレクトリを削除できます。これは削除操作を高速化するつもりはありません。ただし、これにより、側で削除操作が行われている間、プログラムは空のディレクトリで先に進むことができます。

これがあなたのユースケースでうまくいくかどうかはわかりません。ディスクがアイドル状態になるまでプログラムを続行できないかどうか(つまり、重いディスク操作を実行するかどうか)によって異なります。プログラムがディスクを大量のデータで満たすかどうかによって異なります。

0
Nathan