50 GBのファイルがある外部ストレージドライブ(USB接続、fuseblkタイプ)でrmが遅いのはなぜですか?


21

バックアップの作成にrsnapshotを使用しようとしましたが、使用できません。ディレクトリ(50gb)を比較して数分で複製(すべてのファイルをハードリンク)でき、約30分でディレクトリ全体をcpできますが、削除するには1時間以上かかります。を直接使用してもrm -rfv、1つのファイルをrmするのに最大0.5秒かかることがcpありlinkますが、and コマンドは即座に完了します。

rmがなぜそんなに遅いのですか?ハードリンクを再帰的に削除するより速い方法はありますか?ファイルを削除するよりもファイルをコピーするほうが時間がかからないというのは理にかなっていない。

私が取り組んでいるファイルシステムは、USB経由で接続されたfuseblk(これはntfsだと思います)と接続された外部ストレージドライブです。私のコンピューターはubuntu linuxを実行しています。

上からの出力:

Cpu(s):  3.0%us,  1.5%sy,  0.0%ni, 54.8%id, 40.6%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8063700k total,  3602416k used,  4461284k free,   557604k buffers

1
マウントされfuseblkているということは、ドライブがNTFSであるという意味ではなく、FUSEブロックデバイスとしてマウントされていることを意味します。それはほとんど何でも可能です。
クリスダウン

1
@ChrisDown本当ですが、NTFSまたはext3のいずれかであることは知っています。ext3の場合、引数なしでmountによってマウントされます。
ベヌバード

1
これは、ディレクトリ内のファイルの数に依存します(何個とは言いませんでした)。特に、NTFSは、ディレクトリ内のファイルが3Kを超えるだけで速度が低下します。他のほとんどすべてのファイルシステムは、はるかに高性能です。ファイルシステムのパフォーマンスに対するファイル数の影響について、SO / SEに関する他の多くの投稿をすべて参照してください。
smci

回答:


28

最終的に、何をするにしrmunlinkも、削除したいすべてのファイルで実行する必要があります(rm -r親ディレクトリを呼び出した場合でも)。削除するファイルが多数ある場合、これには時間がかかることがあります。

実行すると、特に時間がかかる2つのプロセスがありますrm -r

  1. readdir、 に続く、
  2. の呼び出し回数unlink

すべてのファイルを見つけてから、すべてのファイルを削除して削除するには、非常に長い時間がかかります。

ディレクトリがしばらく使用できなくなるためにこの「使用できない」と思われる場合は、削除する前に親ディレクトリを移動することを検討してください。これにより、時間が不便にならずに、その名前がプログラムで使用できるようになります。

ファイルシステムが実際 NTFSであると仮定すると(質問からは明らかでありません)、NTFSは通常、大量のファイルを削除するのに非常に時間がかかります。目的により適したファイルシステムを使用することを検討してください(他の特定のニーズがない場合、最近のextファイルシステムは削除パフォーマンスがかなり良好です)。一般に、FUSE自体もそれほど高速ではありません。FUSEを使用しない何らかの方法でこれを実行できるかどうかを検討することをお勧めします。


2
+1本当に多くは正確なファイルシステムに依存します-多くはいくつかの操作で非常にうまく動作する傾向がありますが、他の操作では遅くなります(多くの場合、これはファイル作成対削除対データアクセスのためです)。
ペテルフ

15

rmがなぜそんなに遅いのですか?何も思いつきません。しかし、私はより速い方法を知っています:

mkdir blank
rsync -a --delete blank/ test/

更新:Serverfaultに関するこの回答にはいくつかの説明があります。rsyncは特定の順序でファイルを削除するため、ファイルシステムツリーのバランスが保たれ、再バランスが不要になります。rmはファイルを削除するだけで、それらが削除されると多くのリバランスが発生します。ここにリバランスに関するいくつかの情報があります


1
これをベンチマークして比較しましたrm -rfか?rsync内のunlink()すべてのファイルをまだ持ってtest/いる必要があり、それがおそらく時間がかかるものです。
MattBianco 14

正式にベンチマークを行ったわけではありませんが、他の誰かのベンチマークを読んだ後で試しましたが、その差はかなりのものでした。私はそれ以上の投稿を見つけることができませんが、serverfaultに関するこの回答には、より高速な削除プログラムの説明とソースがあります。
rjmunro 14

しかし、最速の方法がなければなりませんunlink(2)(と行うことを思い出して、ディレクトリにfsck...後で)
マット・ビアンコ

事実は事実です。タイミングを合わせるだけで、ほぼ2倍の速度になります。GNU coreutils rmコードを読んだ後でも、私は不思議に思わない…
ドミニクジョージ

1

まあ、私はかつてあなたと同様の問題を抱えていました。あなたの「わ」が高いことがわかりました

iostat -x 1

ディスク使用率が高いかどうかを確認する場合は、ディスクが非常にビジーであることを意味します。他のプロセスがディスクに継続的に書き込みを行っているかどうかを確認してください。

簡単にするために、

vmstat 1

bが高いかr < bかを確認します。それは何か間違っていることを示しています。あなたの状況では、disk ioが元の理由だと思います。

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