Melakukan rm -rf pada pohon direktori besar membutuhkan waktu berjam-jam

20

Kami menggunakan rsnapshot untuk cadangan. Itu menyimpan banyak snapshot dari file yang dicadangkan, tetapi itu menghapus yang lama. Ini bagus. Namun butuh sekitar 7 jam untuk melakukan rm -rfpada pohon direktori besar. Sistem file adalah XFS. Saya tidak yakin berapa banyak file yang ada, tetapi mungkin jumlahnya jutaan.

Apakah ada cara untuk mempercepatnya? Apakah ada perintah yang sama rm -rfdan tidak memakan waktu berjam-jam?

Rory
sumber
1
Saya menggunakan find . -delete -name directorydan jauh lebih cepat daripada rm -rf.
Paolo

Jawaban:

38

Tidak.

rm -rfmelakukan traversal depth-first rekursif dari sistem file Anda, memanggil unlink()setiap file. Dua operasi yang menyebabkan proses berjalan lambat adalah opendir()/ readdir()dan unlink(). opendir()dan readdir()tergantung pada jumlah file dalam direktori. unlink()tergantung pada ukuran file yang dihapus. Satu-satunya cara untuk membuat ini berjalan lebih cepat adalah dengan mengurangi ukuran dan jumlah file (yang saya kira tidak mungkin) atau mengubah sistem file menjadi yang dengan karakteristik yang lebih baik untuk operasi tersebut. Saya percaya bahwa XFS baik untuk memutuskan tautan () pada file besar, tetapi tidak begitu baik untuk struktur direktori besar. Anda mungkin menemukan bahwa ext3 + dirindex atau reiserfs lebih cepat. Saya tidak yakin seberapa baik tarif JFS, tapi saya yakin ada banyak tolok ukur kinerja sistem file yang berbeda.

Sunting: Tampaknya XFS sangat buruk dalam menghapus pohon , jadi pasti ubah sistem file Anda.

David Pashley
sumber
1
Beberapa tahun yang lalu saya melihat kinerja yang mengerikan menggunakan reiserfs dalam use case yang serupa.
knweiss
1
Pos luar biasa!
wzzrd
2
Hampir saja mengatakan "tidak" :)
David Pashley
2
Saya setuju dengan semua yang ada di sini selain dari pernyataan Anda bahwa kecepatan tautan yang tergantung pada ukuran file. unlink hanya menghapus tautan ke file dan tidak melakukan apa pun terhadap konten yang sebenarnya. Seharusnya tidak ada perbedaan mencolok antara file dengan ukuran yang berbeda (Anda dapat mengujinya sendiri).
Kamil Kisiel
@ KamilKisiel Anda benar mengatakan unlinktidak melakukan apa-apa untuk konten yang sebenarnya tetapi untuk melakukan unlinkpanggilan sistem, kode sistem file masih lebih banyak yang harus dilakukan jika tautan yang dihapus adalah yang terakhir ke file dan jika saat ini tidak terbuka. Ini tentu saja tergantung pada sistem file tetapi kemudian akan ada perbedaan yang sangat terlihat ketika file yang dihapus sangat besar.
jlliagre
22

Sebagai alternatif, pindahkan direktori ke samping, buat ulang dengan nama, izin, dan kepemilikan yang sama dan mulai ulang aplikasi / layanan yang peduli dengan direktori itu.

Anda kemudian dapat "nice rm" direktori asli di latar belakang tanpa harus khawatir tentang pemadaman yang berkepanjangan.

Greg Work
sumber
Itu bisa berhasil, karena mv sangat cepat.
Rory
Yup - ini bekerja dengan baik. Saya telah menggunakan teknik ini berkali-kali untuk "memperbaiki" kotak surat berbasis maildir di mana klien email telah kehilangan otaknya dan meninggalkan kekacauan pada disk. Direktori (tunggal) terbesar yang saya perbaiki dengan cara ini memiliki sekitar 1,5 atau 2 juta file IIRC. Total waktu henti bagi pengguna akhir adalah ~ 3 menit, yang sebagian besar menunggu klien email dan proses imap mati.
Greg Work
7

Pastikan Anda memiliki opsi pemasangan yang tepat untuk XFS.

Menggunakan -ologbufs = 8, logbsize = 256k dengan XFS mungkin akan tiga kali lipat kinerja penghapusan Anda.

James
sumber
2
+1 untuk kiat ini ... Seseorang juga harus mengaktifkan penghitung malas untuk peningkatan kinerja lainnya.
hurikhan77
1
Beberapa penjelasan tentang pengaturan ini akan sangat membantu bagi pembaca di masa mendatang.
Aron Rotteveel
5

Jika Anda melakukan rm secara efektif di tingkat file maka itu akan memakan waktu lama. Inilah mengapa snapshot berbasis blok sangat bagus :).

Anda dapat mencoba membagi rm ke dalam area yang terpisah dan mencoba melakukannya secara paralel namun saya mungkin tidak mengharapkannya untuk melakukan perbaikan. XFS diketahui memiliki masalah menghapus file dan jika itu adalah sebagian besar dari apa yang Anda lakukan maka mungkin sistem file yang berbeda untuk itu akan menjadi ide.

James
sumber
Snapshots berbasis blok tidak secara khusus bagus dalam hal ini. Sejumlah sistem file --- WAFL dan ZFS segera datang ke pikiran --- juga memberikan kinerja yang baik untuk menghapus snapshot. Mereka memperlakukan snapshot sebagai objek sistem file kelas satu. Jadi daripada mengulangi (secara perlahan) lebih dari jutaan file untuk menentukan blok mana yang akan dibebaskan, mereka hanya perlu melihat daftar blokir yang terkait dengan snapshot.
Keith Smith
Hmm. Saya mungkin dianggap terlalu bertentangan di atas. Poster asli harus menggunakan Linux, dan benar-benar tidak ada sistem file Linux yang telah terbukti yang melakukan snapshot --- walaupun btrfs dan nilfs terlihat menarik untuk masa depan. Jadi sebagai hal praktis, saya setuju --- lebih baik menggunakan snapshot berbasis blok.
Keith Smith
+1 untuk tip untuk membagi dan memparalelkan beban kerja: xfs memainkan kekuatannya pada beban kerja paralel.
hurikhan77
5

Ada baiknya menggunakan ionice untuk operasi intensif IO seperti itu terlepas dari sistem file yang digunakan.
Saya menyarankan perintah ini:

ionice -n7 rm bagus -fr dir_name

Ini akan bermain dengan baik untuk operasi latar belakang di server dengan beban IO yang berat.

ash108
sumber
2

Saya tahu ini sudah tua, tetapi saya pikir saya harus memberikan saran. Anda menghapus file-file itu secara berurutan, menjalankan operasi paralel rm mungkin mempercepatnya.

http://savannah.nongnu.org/projects/parallel/ parallel biasanya dapat digunakan sebagai ganti xargs

jadi jika Anda menghapus semua file di deltedir

find -t f deletedir | parallel -j 10 rm

Itu akan meninggalkan Anda dengan hanya struktur direktori kosong untuk dihapus.

Catatan: Anda kemungkinan masih akan mencapai batasan sistem file seperti yang disebutkan di atas.

Nick Anderson
sumber
Apa keuntungan menggunakan parallel over xargs?
Rory
1

Apakah opsi alternatif di sini adalah memisahkan data sedemikian rupa sehingga Anda dapat membuang dan membangun kembali sistem file yang sebenarnya alih-alih melakukan rm?

Melenguh
sumber
3
Saya pikir rsnapshot menggunakan tautan keras sebagai bagian dari fitur menjaga-banyak-snapshot-efisien. Jadi jika si penanya menggunakan fitur yang menggunakan sistem berkas terpisah tidak akan bekerja (karena Anda tidak bisa keras-link di atas batas filesystem)
David Spillett
0

Bagaimana dengan mengurangi kebaikan perintah? Seperti:

nice -20 rm -rf /path/to/dir/
RainyRat
sumber
5
Kemacetan bukan penjadwal, itu adalah sistem file, saya akan mengatakan.
Manuel Faux
Jika penjadwal adalah bottleneck, Anda hanya akan berakhir menggempur subsistem I / O lebih keras, membuat server semakin tidak dapat digunakan selama rm.
David Mackintosh