Di server web saya (apache sedang berjalan, Linux CentOS), ada file log yang sangat besar ( 50 Gbyte ). Server web ini memiliki beberapa layanan web dalam produksi.
Ketika saya mencoba menghapus file log, server web tidak memiliki respons sekitar 10 detik. (Waktu layanan habis.)
rm -f monthly.log
Apakah ada cara untuk menghapus file besar ini tanpa pembekuan apache?
linux
apache-2.2
centos
Jinbom Heo
sumber
sumber
Untuk penghapusan file besar yang lebih cepat, Anda dapat menggunakan
truncate
perintah - Say untuk mengecilkannya ke ukuran nol dan kemudian menghapusnya:Seperti yang direkomendasikan oleh quanta, Anda harus logrotate terlebih dahulu.
sumber
truncate
bedanya>
?truncate
mudah digunakansudo
daripada>
. Ini juga lebih mudah denganfind -exec
.sumber
>logfile
tidak perlu untuk gemaSaya akan memotong / nol file dengan
: > /path/to/monthly.log
operasi. Kemudian mungkin restart proses Apache dan mengatur rotasi log untuk mencegah hal ini terjadi di masa depan ...Ini sering muncul, meskipun:
Lihat: Apakah ada cara untuk menghapus file 100GB di Linux tanpa meronta-ronta IO / load?
Di unix, apa cara terbaik untuk mengurangi ukuran file log besar yang sedang ditulis secara aktif?
Server Linux kehabisan ruang
sumber
:
. Anda bisa melakukannya> /path/to/monthly.log
noop
, tetapi lebih masuk akal dari perspektif pengajaran.true > /path/to/monthly.log
melakukan hal yang sama, dan itu kurang kuno:
?Jika Anda tidak membutuhkan data, potong menggunakan / dev / null:
Server web akan terus menulis data ke file setelah pemotongan, yang menghindari kebutuhan untuk me-restart server web (tidak seperti
rm monthly.log
, yang menghapus file).Setelah menyelesaikan krisis langsung, pertimbangkan logrotasi seperti yang disarankan Quanta. Anda tidak ingin ini terjadi lagi. Perhatikan bahwa file log Apache sudah diputar secara default pada CentOS
Juga pertimbangkan untuk mengirim log web melalui syslog (menggunakan
/usr/bin/logger
, misalnya). Log yang dibuat menggunakan syslog juga biasanya sudah disiapkan logrotation.sumber
>logfile
pun untuk kucingJika Anda menggunakan sistem file ext3, pertimbangkan untuk beralih ke ext4.
Ext3 bisa lambat menghapus file besar karena menyimpan lokasi setiap blok 4k individu: file 50GiB (50 * 1024 ^ 3 byte) menempati 13107200 blok, yang masing-masing dicatat dalam tabel inode sebagai nomor blok 32-bit , untuk total 50MiB data pembukuan hanya untuk melacak di mana konten file berada di disk. Daftar blokir besar itu dapat tersebar di banyak blok tidak langsung , yang semuanya harus diperbarui ketika file dihapus. Mencari disk untuk mengakses semua blok tidak langsung itu mungkin yang menyebabkan penundaan.
Ext4, di sisi lain, mengalokasikan file dalam "luasan" hingga 128MiB. File 50GiB itu dapat direkam dalam tabel inode menggunakan hanya 400 catatan tingkat, daripada 13107200 nomor blok individu, yang secara dramatis mengurangi jumlah disk I / O yang diperlukan ketika menghapus file.
Perhatikan bahwa jika Anda mengonversi sistem file ext3 yang ada di tempat menjadi ext4, file baru akan dialokasikan menggunakan extents, tetapi file yang ada masih akan menggunakan daftar blokir. Anda dapat menggunakan
chattr +e
perintah untuk merealokasi file yang sudah ada menggunakan extents; Dari segi kinerja, ini sebanding dengan membuat salinan file dan kemudian menghapus yang asli.sumber
Ini bermuara pada masalah kinerja sistem file. Ada jawaban yang menarik untuk ini pada pertanyaan SO ini tetapi ini lebih tergantung pada sistem file apa yang Anda gunakan. Saya menggunakan XFS ketika membuat sistem file untuk menyimpan ratusan file MPEG2 multi-gigabyte untuk MythTV karena pada saat itu kinerja hapus XFS jauh lebih unggul daripada ext3. Segalanya mungkin telah banyak berubah di tahun-tahun berikutnya.
Saya suka jawaban @ quanta. Memisahkan file menjadi bagian-bagian yang lebih kecil akan menyebabkan penghapusan lebih cepat.
sumber
Masalahnya berasal dari, saya kira, bahwa Anda menghapus file dari pengguna istimewa yang lebih memprioritaskan operasi disk daripada pengguna apser webserver. Tidak masalah bagaimana Anda memilih untuk menghapus file log (rm -f atau terpotong oleh>), Anda harus menurunkan operasi prioritas disk-nya ke minumum:
sumber