Saya ingin menghapus direktori cache nginx, yang saya hapus dengan cepat:
mv cache cache.bak
mkdir cache
service nginx restart
Sekarang saya punya cache.bak
folder yang memiliki 2 juta file. Saya ingin menghapusnya, tanpa mengganggu server.
Sederhana rm -rf cache.bak
membuang server, bahkan respons HTTP paling sederhana membutuhkan 16 detik saat rm berjalan, jadi saya tidak bisa melakukan itu.
Saya mencoba ionice -c3 rm -rf cache.bak
, tetapi itu tidak membantu. Server memiliki HDD, bukan SSD, mungkin pada SSD ini mungkin tidak menjadi masalah.
Saya percaya solusi terbaik akan menjadi semacam pelambatan, seperti bagaimana built-in cache manager nginx.
Bagaimana Anda menyelesaikan ini? Apakah ada alat yang bisa melakukan ini?
ext4 di Ubuntu 16.04
linux
ubuntu
filesystems
ext4
hyperknot
sumber
sumber
rm
menggunakan nice ?Jawaban:
Buat skrip bash seperti ini:
Simpan dengan nama
deleter.sh
misalnya. Jalankanchmod u+x deleter.sh
untuk membuatnya dapat dieksekusi.Script ini menghapus semua file yang dikirimkan sebagai argumen, dan kemudian tidur 0,5 detik.
Lalu, Anda bisa berlari
Perintah ini mengambil daftar semua file di cache.bak dan meneruskan lima nama file sekaligus ke skrip hapus.
Jadi, Anda dapat menyesuaikan berapa banyak file yang dihapus sekaligus, dan berapa lama penundaan antara setiap operasi penghapusan.
sumber
xargs
memahami ukuran maksimum baris perintah dan mencoba untuk tidak melampauinya secara default. Yang satu ini memiliki batas tambahan tidak lebih dari 5 jalur sekaligus.Anda harus mempertimbangkan untuk menyimpan cache Anda pada sistem file terpisah yang dapat Anda pasang / lepaskan dari akun seseorang yang dinyatakan dalam komentar. Sampai Anda melakukannya, Anda dapat menggunakan liner yang satu ini
/usr/bin/find /path/to/files/ -type f -print0 -exec sleep 0.2 \; -exec echo \; -delete
dengan asumsi biner find Anda berada di bawah / usr / bin dan Anda ingin melihat progresnya di layar. Sesuaikan tidur sesuai, sehingga Anda tidak terlalu menekankan HDD Anda.sumber
-print0
sini, karena Anda tidak menyalurkan output difind
mana pun.Anda mungkin ingin mencoba ionice pada skrip yang menggunakan output dari perintah find. Sesuatu seperti yang berikut ini:
Bergantung pada sistem file, setiap penghapusan file dapat mengakibatkan penulisan ulang seluruh direktori itu. Untuk direktori besar yang bisa sangat sukses. Ada pembaruan tambahan yang diperlukan untuk tabel inode, dan mungkin daftar ruang kosong.
Jika sistem file memiliki jurnal, perubahan ditulis ke jurnal; terapan; dan dihapus dari jurnal. Ini meningkatkan persyaratan I / O untuk kegiatan intensif menulis.
Anda mungkin ingin menggunakan sistem file tanpa jurnal untuk cache.
Alih-alih ionice, Anda dapat menggunakan perintah tidur untuk menilai membatasi tindakan. Ini akan berfungsi bahkan jika ionice tidak, tetapi akan memakan waktu lama untuk menghapus semua file Anda.
sumber
Saya mendapat banyak jawaban / komentar yang berguna di sini, yang ingin saya simpulkan sekaligus tunjukkan solusi saya juga.
Ya, cara terbaik untuk mencegah hal seperti itu terjadi adalah dengan tetap menyimpan cache cache pada sistem file yang terpisah. Nuking / memformat cepat sistem file selalu membutuhkan waktu beberapa detik (mungkin beberapa menit) paling banyak, tidak terkait dengan berapa banyak file / dir yang ada di dalamnya.
The
ionice
/nice
solusi tidak melakukan apa-apa, karena proses menghapus sebenarnya disebabkan hampir tidak ada I / O. Apa yang menyebabkan I / O adalah saya yakin antrian / buffer level kernel / filesystem terisi ketika file dihapus terlalu cepat oleh proses hapus.Cara saya menyelesaikannya mirip dengan solusi Tero Kilkanen, tetapi tidak perlu memanggil skrip shell. Saya menggunakan rsync's built in
--bwlimit
switch untuk membatasi kecepatan penghapusan.Perintah penuh adalah:
Sekarang bwlimit menentukan bandwidth dalam kilobyes, yang dalam hal ini diterapkan pada nama file atau path file. Dengan mengatur ke 1 KBps, itu menghapus sekitar 100.000 file per jam, atau 27 file per detik. File memiliki jalur relatif seperti
cache.bak/e/c1/db98339573acc5c76bdac4a601f9ec1e
, yang panjangnya 47 karakter, sehingga akan memberikan 1000/47 ~ = 21 file per detik, jadi agak mirip dengan tebakan saya 100.000 file per jam.Sekarang kenapa
--bwlimit=1
? Saya mencoba berbagai nilai:Saya suka kesederhanaan metode built in rsync, tetapi solusi ini tergantung pada panjang jalur relatif. Bukan masalah besar karena kebanyakan orang akan menemukan nilai yang tepat melalui coba-coba.
sumber