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


11

ショートバージョン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が、まだ多すぎると思います。(理由の説明rsyncrmより速い:「ほとんどのファイルシステムはディレクトリ構造をbtree形式で保存します。ファイルを削除する順番[in]は重要です...リンク解除を実行するとき、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/sdXhdparm -t /dev/sdX
[2] find mydir -print|wc -lブート直後の実行にかかった時間。
[3] XFSディスクでは、これはでツリーを歩いた直後findです。BTRFSディスクでは、これは古い測定値です(そして、ツリーがキャッシュされていたとは思いません)。

に問題があるようbtrfsです。


1
1つのディレクトリに250万個のファイルがあるか。私はこれをうまく処理するファイルシステムを知りません。
マイケルハンプトン

@MichaelHampton:フラットではなく、ネストされたディレクトリが含まれています。短い説明に「再帰的に」という言葉を追加しました。これで明らかになることを願っています。
Antonis Christofides

1
コピーオンライトファイルシステムでコピーオンライトディレクトリトリックを使用するのはなぜですか?
symcbean 2015

@symcbean:あなたはハードリンクのトリックが冗長であることを意味しbtrfsますか?もちろんこれは可能ですが、関連があると思いますか?なぜ今やったのか思い出せませんbtrfs
Antonis Christofides

2
ああ、今覚えています。btrfs透過的な圧縮が必要だったので、切り替えることにしました。現在:rsnapshotハードリンクを使用しています。ハードリンクを使用しないオプションはありません。したがって、ハードリンクはbtrfsのコピーオンライト機能と重複しますが、それについてはあまり行えません。
Antonis Christofides

回答:


3

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

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

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

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

また、Chris Masonによれば、Btrfsは現在までに安定していると考えていますが、まだプロダクションの準備が整っていないことにも注意してください。


1
「よく知られている」をどのように定義しますか?私は広範囲にわたって無駄にWebを検索しましたが、このディスカッションに参加した人は誰もそれを知りませんでした。しかし、とにかく、今はから離れているだけですbtrfs。その開発が永遠にかかっているようである間、あまりにも宣伝されています。
Antonis Christofides

1
ええと、例えばCoreOSの人々がいます。彼らは、2015年の初めまでにデフォルトのファイルシステムとしておよそ1年間Btrfsを使用し、そこでExt4 + Overlayfsに切り替えました。ただし、これはカーネルバージョン3.19より前のバージョンであり、Btrfsに多くの改善をもたらしました。また、2015年10月のこのプレゼンテーションもご覧ください。データベースのワークロード条件、つまりPostgresのext4、xfs、zfs、btrfsをご覧ください。de.slideshare.net / fuzzycz / カーネルはそれほど良くありませんが、goo.gl/rR3kZ2
マルク・スターマー

私が言ったように、ボックスのカーネルバージョン(3.16)はパフォーマンスの問題に悩まされていることが知られています。ChrisMasonによると、深刻なBtrfsには少なくとも3.19を使用します。Btrfsを真剣に使用したい場合は、常に最新かつ最高のカーネルを使用してください。Debianではうまく機能しないカーネルであり、検索用語は「btrfsメタデータパフォーマンス」です。
MarcStürmer2016年

2

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

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

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


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.