Saya memiliki sekitar 200 GB data log yang dihasilkan setiap hari, didistribusikan di antara sekitar 150 file log yang berbeda.
Saya memiliki skrip yang memindahkan file ke lokasi sementara dan melakukan tar-bz2 pada direktori sementara.
Saya mendapatkan hasil yang baik karena 200 GB log dikompresi menjadi sekitar 12-15 GB.
Masalahnya adalah perlu waktu lama untuk mengompres file. The cron pekerjaan berjalan di 2:30 setiap hari dan terus berjalan sampai 5: 00-6: 00.
Apakah ada cara untuk meningkatkan kecepatan kompresi dan menyelesaikan pekerjaan lebih cepat? Ada ide?
Jangan khawatir tentang proses lain dan semua, lokasi di mana kompresi terjadi adalah pada NAS , dan saya dapat menjalankan mount NAS pada VM khusus dan menjalankan skrip kompresi dari sana.
Berikut ini adalah output dari atas untuk referensi:
top - 15:53:50 up 1093 days, 6:36, 1 user, load average: 1.00, 1.05, 1.07
Tasks: 101 total, 3 running, 98 sleeping, 0 stopped, 0 zombie
Cpu(s): 25.1%us, 0.7%sy, 0.0%ni, 74.1%id, 0.0%wa, 0.0%hi, 0.1%si, 0.1%st
Mem: 8388608k total, 8334844k used, 53764k free, 9800k buffers
Swap: 12550136k total, 488k used, 12549648k free, 4936168k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7086 appmon 18 0 13256 7880 440 R 96.7 0.1 791:16.83 bzip2
7085 appmon 18 0 19452 1148 856 S 0.0 0.0 1:45.41 tar cjvf /nwk_storelogs/compressed_logs/compressed_logs_2016_30_04.tar.bz2 /nwk_storelogs/temp/ASPEN-GC-32459:nkp-aspn-1014.log /nwk_stor
30756 appmon 15 0 85952 1944 1000 S 0.0 0.0 0:00.00 sshd: appmon@pts/0
30757 appmon 15 0 64884 1816 1032 S 0.0 0.0 0:00.01 -tcsh
tar.bz2
file yang sama ?top
Output Anda menunjukkan bahwabzip2
proses single-threaded Anda memaksimalkan satu inti, tetapi Anda menjalankannya pada sistem quad-core (Satu proses menggunakan 100% CPU ->25.1%
waktu ruang-pengguna CPU, 74% menganggur). Jadi dengan perubahan kecil, Anda bisa menjadi 4x lebih cepat, kecuali ada hal lain yang menjadi hambatan. Baca jawaban Gilles dengan hati-hati. Pertimbangkan untuk menggunakan CPU dalam kotak yang sama dengan disk yang menyimpan data untuk melakukan kompresi. (Anda bahkan dapat memampatkan beberapa file Anda di satu kotak, yang lain di yang lain, dan mengarsipkan setelahnya, sehingga kedua CPU digunakan.)Jawaban:
Langkah pertama adalah mencari tahu apa hambatannya: apakah itu disk I / O, jaringan I / O, atau CPU?
Jika hambatannya adalah disk I / O, tidak banyak yang bisa Anda lakukan. Pastikan disk tidak melayani banyak permintaan paralel karena hanya dapat menurunkan kinerja.
Jika bottleneck adalah jaringan I / O, jalankan proses kompresi pada mesin tempat file disimpan: menjalankannya pada mesin dengan CPU yang lebih gemuk hanya membantu jika CPU adalah bottleneck.
Jika bottleneck adalah CPU, maka hal pertama yang perlu dipertimbangkan adalah menggunakan algoritma kompresi yang lebih cepat. Bzip2 tidak selalu merupakan pilihan yang buruk - kelemahan utamanya adalah kecepatan dekompresi - tetapi Anda dapat menggunakan gzip dan mengorbankan beberapa ukuran untuk kecepatan kompresi, atau mencoba format lain seperti lzop atau lzma. Anda mungkin juga menyetel level kompresi: default bzip2 ke
-9
(ukuran blok maksimum, kompresi maksimum, tetapi juga waktu kompresi terlama); atur variabel lingkunganBZIP2
ke nilai seperti-3
mencoba level kompresi 3. Utas ini dan utas ini membahas algoritma kompresi umum; khususnya posting blog ini yang dikutip oleh derobert memberikan beberapa tolok ukur yang menunjukkan bahwagzip -9
ataubzip2
dengan level rendah mungkin merupakan kompromi yang baik dibandingkan denganbzip2 -9
. Benchmark lain ini yang juga menyertakan lzma (algoritma 7zip, jadi Anda dapat menggunakannya7z
sebagai gantitar --lzma
) menyarankan bahwalzma
pada level rendah dapat mencapai rasio kompresi bzip2 lebih cepat. Hampir semua pilihan selain bzip2 akan meningkatkan waktu dekompresi. Perlu diingat bahwa rasio kompresi tergantung pada data, dan kecepatan kompresi tergantung pada versi program kompresi, pada bagaimana itu dikompilasi, dan pada CPU itu dijalankan.Pilihan lain jika bottleneck adalah CPU dan Anda memiliki banyak core adalah memparalelkan kompresi. Ada dua cara untuk melakukannya. Salah satu yang bekerja dengan algoritma kompresi apa pun adalah untuk memampatkan file secara terpisah (baik secara individu atau dalam beberapa kelompok) dan digunakan
parallel
untuk menjalankan perintah pengarsipan / kompresi secara paralel. Ini dapat mengurangi rasio kompresi tetapi meningkatkan kecepatan pengambilan file individu dan bekerja dengan alat apa pun. Pendekatan lain adalah dengan menggunakan implementasi paralel dari alat kompresi; utas ini mencantumkan beberapa.sumber
7z
untuk tidak membuat arsip "solid", atau membatasi ukuran blok "solid", itu akan menjalankan utas LZMA mutliple secara paralel, IIRC. data file log adalah kasus khusus untuk kompresi, karena cenderung sangat redundan (banyak kesamaan antar baris). Ini jelas layak untuk diujigzip
,,bzip2
danxz
pada file log khusus OP, daripada hanya melihat tolok ukur kompresi umum untuk mengesampingkan opsi apa pun. Bahkan kompresor cepat yang layak dipertimbangkan (lzop
,lz4
,snappy
).xz
. Gunakantar -J
atau--xz
, bukan --lzma..lzma
dianggap sebagai format file "lawas" . Iterasi berganda dari format file untuk kompresi LZMA sedikit memalukan, dan sesuatu yang semestinya mereka lakukan sejak awal. Tapi AFAIK pada dasarnya bagus sekarang, dan .xz tidak akan digantikan oleh format file lain untuk aliran kompresi yang sama.Anda dapat menginstal
pigz
, paralel gzip, dan menggunakan tar dengan kompresi multi-ulir. Suka:Di mana
-I
opsinya adalah:Tentu saja, jika NAS Anda tidak memiliki banyak core / CPU yang kuat, Anda tetap dibatasi oleh kekuatan CPU.
Kecepatan hard-disk / array tempat VM dan kompresi dijalankan dapat menjadi hambatan juga.
sumber
pbzip2
ataulbzip2
.Sejauh ini, cara tercepat dan paling efektif untuk mengompresi data adalah dengan menghasilkan lebih sedikit.
Jenis log apa yang Anda hasilkan? 200GB setiap hari terdengar cukup banyak (kecuali Anda google atau ISP ...), pertimbangkan bahwa 1MB teks adalah sekitar 500 halaman, jadi Anda menghasilkan setara dengan 100 juta halaman teks per hari, Anda akan isi perpustakaan kongres dalam seminggu.
Lihat lebih dari data log Anda jika Anda bisa menguranginya dan masih mendapatkan apa yang Anda butuhkan dari log. Misalnya dengan mengecilkan level log atau menggunakan format log terser. Atau jika Anda menggunakan log untuk statistik, proses statistik sambil jalan dan buang file dengan ringkasan dan kemudian filter log sebelum kompresi untuk penyimpanan.
sumber
Anda dapat mengurangi jumlah kompresi (dalam hal ruang yang dihemat) untuk membuatnya lebih cepat. Untuk mulai dengan, bzip2 JAUH lebih lambat daripada gzip, meskipun kompres lebih kecil. Anda juga dapat mengubah tingkat kompresi bzip2, gzip, atau sebagian besar program kompresi untuk memperdagangkan ukuran untuk kecepatan.
Jika Anda tidak ingin memperdagangkan ukuran kecepatan, Anda mungkin masih bisa mendapatkan ukuran yang sama atau lebih kecil sambil tetap mendapatkan peningkatan kecepatan menggunakan kompresor yang menggunakan LZMA (xz misalnya).
Anda akan menemukan tolok ukur jika Anda mencari, tetapi taruhan terbaik Anda adalah melakukan beberapa tes dengan file Anda sendiri pada perangkat keras target Anda.
sumber
Jika satu-satunya persyaratan adalah kompresi cepat , saya akan merekomendasikan lz4 sangat tinggi.
Ini digunakan di banyak tempat di mana kecepatan kompresi lebih penting daripada rasio kompresi (misalnya sistem file dengan kompresi transparan seperti ZFS)
sumber