Menghapus file terlalu lama

11

Versi pendek : rm -rf mydir, dengan mydir(rekursif) mengandung 2,5 juta file, membutuhkan waktu sekitar 12 jam pada mesin sebagian besar menganggur.

Informasi lebih lanjut : Sebagian besar file yang dihapus adalah tautan keras ke file di direktori lain (direktori yang dihapus sebenarnya adalah cadangan tertua yang dibuat oleh rsnapshot; rmperintah sebenarnya diberikan oleh rsnapshot). Jadi sebagian besar entri direktori dihapus - konten file itu sendiri tidak banyak; itu dalam urutan puluhan GB.

Saya jauh dari yakin bahwa itu btrfsadalah pelakunya. Saya ingat cadangan juga sangat lambat sebelum saya mulai menggunakan btrfs, tetapi saya tidak yakin bahwa kelambatan dalam penghapusan.

Mesin tersebut adalah Intel Core i5 2.67 GHz dengan 4 GB RAM. Ini memiliki dua disk SATA: satu memiliki OS dan beberapa hal lainnya, dan disk cadangan adalah 1 TB WDC WD1002FAEX-00Z3A0. Motherboard adalah Asus P7P55D.

Sunting : Mesin ini adalah debian wheezy dengan Linux 3.16.3-2~bpo70+1. Beginilah cara sistem file di-mount:

root@thames:~# mount|grep rsnapshot
/dev/sdb1 on /var/backups/rsnapshot type btrfs (rw,relatime,compress=zlib,space_cache)

Sunting : Menggunakan rsync -a --delete /some/empty/dir mydirmembutuhkan waktu sekitar 6 jam. Peningkatan yang signifikan berakhir rm -rf, tapi saya pikir masih terlalu banyak. ( Penjelasan mengapa rsynclebih cepat darirm : "[M] sistem file pertama menyimpan struktur direktori mereka dalam format btree, urutan [di] yang Anda hapus file ... penting. Kita harus menghindari menyeimbangkan kembali btree ketika Anda melakukan unlink .... rsync -a --delete... melakukan penghapusan secara berurutan ")

Sunting : Saya memasang disk lain yang memiliki 2,2 juta file (secara rekursif) dalam direktori, tetapi pada XFS. Berikut adalah beberapa hasil perbandingan:

                  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] Dengan hdparm -T /dev/sdXdan hdparm -t /dev/sdX.
[2] Waktu yang diperlukan untuk berjalan find mydir -print|wc -lsegera setelah boot.
[3] Pada disk XFS, ini segera setelah berjalan dengan pohon find. Pada disk BTRFS itu adalah pengukuran lama (dan saya tidak berpikir itu dengan cache pohon).

Tampaknya menjadi masalah dengan btrfs.

Antonis Christofides
sumber
1
2,5 juta file dalam satu direktori? Saya tidak mengetahui sistem file yang menangani ini dengan baik.
Michael Hampton
@MichaelHampton: Ini tidak rata, ini berisi direktori bersarang. Saya menambahkan kata "secara rekursif" dalam deskripsi singkat; Saya harap ini menjelaskannya.
Antonis Christofides
1
Mengapa Anda menggunakan trik direktori copy-on-write pada sistem file copy-on-write?
symcbean
@symcbean: Maksud Anda trik tautan keras itu berlebihan btrfs? Ini mungkin, tentu saja, tetapi apakah Anda pikir itu relevan? Saat ini saya tidak dapat mengingat mengapa saya memutuskan untuk mencoba btrfs.
Antonis Christofides
2
Ah, saya ingat sekarang. Saya memutuskan untuk beralih btrfskarena saya ingin kompresi transparan. Sekarang: rsnapshotmenggunakan tautan keras. Tidak ada opsi untuk tidak menggunakan tautan keras. Jadi tautan keras tumpang tindih dengan btrfsfungsionalitas copy-on-write, tapi saya tidak bisa berbuat banyak tentang itu.
Antonis Christofides

Jawaban:

3

Yah ini masih merupakan masalah Btrfs, yang terkenal bahwa menghapus banyak file kecil memang memakan waktu yang cukup lama dibandingkan dengan sistem file lainnya.

Jika Anda tidak menyukainya, Anda dapat menunggu hingga upstream telah memperbaikinya atau beralih ke sistem file lain yang lebih baik.

Namun kesalahan utama Anda adalah menggunakan kernel kuno (3,16, ya itu sudah kuno ketika Anda memposting) dengan btrfs. Btrfs adalah sistem file yang masih dalam pengembangan, jadi Anda harus selalu tetap dengan versi kernel terbaru dan terhebat untuk menghubungi perbaikannya. Jika distribusi Anda tidak melakukan backports, Anda bisa melakukannya sendiri atau Anda kacau.

Btrfs mendapat banyak peningkatan kinerja dalam versi kernel 3.19 - ini adalah versi minimum yang harus Anda gunakan dalam produksi, versi kernel Anda 3.16 jelas-jelas menyebalkan tanpa backports.

Juga perlu diingat bahwa menurut Chris Mason dia menganggap Btrf stabil sekarang, tetapi belum siap produksi.

Marc Stürmer
sumber
1
Bagaimana Anda mendefinisikan "terkenal"? Saya telah mencari web secara luas dan sia-sia, dan tidak seorang pun dari mereka yang berpartisipasi dalam diskusi ini tahu tentang itu. Tapi, bagaimanapun, saya sekarang tinggal jauh dari btrfs. Terlalu hyped sementara perkembangannya sepertinya akan berlangsung selamanya.
Antonis Christofides
1
Yah, misalnya ada orang-orang dari CoreOS. Mereka menggunakan kira-kira Btrfs satu tahun sebagai sistem file default sampai awal 2015 di mana mereka beralih kembali ke Ext4 + Overlayfs. Perlu diingat bahwa ini sebelum kernel versi 3.19, yang membawa banyak perbaikan untuk Btrfs. Lihat juga presentasi Oktober 2015 ini, yang melihat ext4, xfs, zfs dan btrfs pada kondisi beban kerja basis data, yaitu Postgres: de.slideshare.net/fuzzycz/… Tolok ukur lain, meskipun kernel tidak begitu baik: goo.gl/rR3kZ2
Marc Stürmer
Dan seperti yang saya katakan, versi kernel dari kotak Anda (3.16) diketahui terganggu oleh masalah kinerja, setidaknya menggunakan 3,19 untuk hal-hal Btrf yang serius menurut Chris Mason. Jika Anda ingin menggunakan Btrf secara serius, selalu gunakan kernel terbaru dan terhebat - sesuatu yang tidak bekerja dengan baik dengan Debian ... dan cari istilah "kinerja metadata btrf."
Marc Stürmer
2

Saya agak terlambat ke pesta ini, tapi di sini ada trik untuk menghapus dengan cepat pohon btrf yang sangat besar:

  1. Buat subvolume dummy pada sistem file btrfs yang sama.
  2. Pindahkan direktori tingkat atas yang ingin Anda hapus ke dalam subvolume tersebut - operasi ini harus sangat cepat jika Anda melakukannya pada sistem file btrfs yang sama, bahkan di seluruh subvolume.
  3. Hancurkan subvolume.

Kernel akan memulai reklamasi ruang di latar belakang, sehingga Anda tidak akan memiliki ruang yang tersedia dengan segera, tetapi prosesnya seharusnya jauh lebih cepat daripada melakukan penghapusan pengguna-lahan apa pun.

Nicolas Noble
sumber
0

Anda bisa mengganti nama direktori dan kemudian menghapus direktori yang diubah namanya dalam proses latar belakang. Ini tidak akan mempercepat operasi penghapusan. Namun, ini akan memungkinkan program untuk terus maju dengan direktori kosong saat operasi penghapusan sedang berlangsung di samping.

Saya tidak yakin apakah ini akan berfungsi dalam kasus penggunaan Anda. Itu tergantung jika program tidak dapat melanjutkan sampai disk idle (yaitu akan melakukan beberapa operasi disk yang berat). Itu tergantung apakah program akan mengisi disk dengan banyak data.

Nathan
sumber