Saya menemukan diri saya harus mengkompres sejumlah file yang sangat besar (80-ish GB), dan saya terkejut dengan (kurangnya) kecepatan sistem saya menunjukkan. Saya mendapatkan sekitar 500 MB / menit kecepatan konversi; menggunakan top
, saya tampaknya menggunakan CPU tunggal sekitar 100%.
Saya cukup yakin itu bukan kecepatan akses disk (hanya), karena membuat tar
file (begitulah file 80G dibuat) hanya membutuhkan waktu beberapa menit (mungkin 5 atau 10), tetapi setelah lebih dari 2 jam perintah gzip sederhana saya masih belum selesai.
Singkatnya:
tar -cvf myStuff.tar myDir/*
Butuh waktu <5 menit untuk membuat file tar 87 G
gzip myStuff.tar
Butuh waktu dua jam 10 menit, membuat file zip 55G.
Pertanyaan saya: Apakah ini normal? Apakah ada opsi tertentu gzip
untuk mempercepat? Apakah akan lebih cepat untuk menggabungkan perintah dan menggunakan tar -cvfz
? Saya melihat referensi untuk pigz
- Implementasi Paralel GZip - tetapi sayangnya saya tidak dapat menginstal perangkat lunak pada mesin yang saya gunakan, jadi itu bukan pilihan bagi saya. Lihat misalnya pertanyaan sebelumnya ini .
Saya bermaksud mencoba beberapa opsi ini sendiri dan mengatur waktunya - tetapi sangat mungkin bahwa saya tidak akan menekan "kombinasi ajaib" dari opsi. Saya berharap seseorang di situs ini tahu trik yang tepat untuk mempercepat.
Ketika saya memiliki hasil uji coba lain yang tersedia saya akan memperbarui pertanyaan ini - tetapi jika ada yang punya trik yang sangat baik tersedia, saya akan sangat menghargainya. Mungkin gzip hanya membutuhkan waktu pemrosesan lebih dari yang saya sadari ...
MEMPERBARUI
Seperti yang dijanjikan, saya mencoba trik ini di bawah ini: mengubah jumlah kompresi, dan mengubah tujuan file. Saya mendapat hasil sebagai berikut untuk tar yang sekitar 4.1GB:
flag user system size sameDisk
-1 189.77s 13.64s 2.786G +7.2s
-2 197.20s 12.88s 2.776G +3.4s
-3 207.03s 10.49s 2.739G +1.2s
-4 223.28s 13.73s 2.735G +0.9s
-5 237.79s 9.28s 2.704G -0.4s
-6 271.69s 14.56s 2.700G +1.4s
-7 307.70s 10.97s 2.699G +0.9s
-8 528.66s 10.51s 2.698G -6.3s
-9 722.61s 12.24s 2.698G -4.0s
Jadi ya, mengubah bendera dari default -6
ke tercepat -1
memberi saya speedup 30%, dengan (untuk data saya) hampir tidak ada perubahan pada ukuran file zip. Apakah saya menggunakan disk yang sama atau yang lain pada dasarnya tidak membuat perbedaan (saya harus menjalankan ini beberapa kali untuk mendapatkan signifikansi statistik).
Jika ada yang tertarik, saya membuat tolok ukur waktu ini menggunakan dua skrip berikut:
#!/bin/bash
# compare compression speeds with different options
sameDisk='./'
otherDisk='/tmp/'
sourceDir='/dirToCompress'
logFile='./timerOutput'
rm $logFile
for i in {1..9}
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $sameDisk $logFile
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $otherDisk $logFile
done
Dan skrip kedua ( compressWith
):
#!/bin/bash
# use: compressWith sourceDir compressionFlag destinationDisk logFile
echo "compressing $1 to $3 with setting $2" >> $4
tar -c $1 | gzip -$2 > $3test-$2.tar.gz
Tiga hal yang perlu diperhatikan:
- Menggunakan
/usr/bin/time
daripadatime
, karena perintah bawaanbash
memiliki banyak pilihan lebih sedikit daripada perintah GNU - Saya tidak repot-repot menggunakan
--format
opsi meskipun itu akan membuat file log lebih mudah dibaca - Saya menggunakan skrip-dalam-skrip karena
time
sepertinya hanya beroperasi pada perintah pertama dalam urutan pipa (jadi saya membuatnya terlihat seperti satu perintah ...).
Dengan semua ini dipelajari, kesimpulan saya adalah
- Percepat dengan
-1
bendera (jawaban yang diterima) - Jauh lebih banyak waktu dihabiskan mengompresi data daripada membaca dari disk
- Investasikan dalam perangkat lunak kompresi yang lebih cepat (
pigz
sepertinya pilihan yang baik). - Jika Anda memiliki banyak file untuk dikompres, Anda dapat menempatkan setiap
gzip
perintah di utasnya sendiri dan menggunakan lebih banyak CPU yang tersedia (orang miskinpigz
)
Terima kasih semua orang yang membantu saya mempelajari semua ini!
$> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gz
akan menunjukkan seberapa cepat mesin Anda mengompresi barang. side-note2: simpan hasilnya ke disk yang berbeda.man
halaman, dan saya tidak membaca sejauh itu (karena diurutkan berdasarkan 'perintah huruf tunggal', yaitu-#
) . Itu akan mengajari saya ke RTFM! Ini akan menjadi hal berikutnya yang saya coba!pigz
dan menjalankannya dari mana pun Anda membangunnya, tanpa menginstalnya. Jika tidak ada kompiler, Anda bisa melakukan kompilasi silang pada komputer lain, meskipun itu mulai lebih banyak upaya daripada yang mungkin layak dilakukan. (Tergantung seberapa parah Anda memerlukan kompresi ini untuk berjalan lebih cepat, saya kira.)Jawaban:
Anda dapat mengubah kecepatan gzip menggunakan
--fast
--best
atau di-#
mana # adalah angka antara 1 dan 9 (1 adalah yang tercepat tetapi lebih sedikit kompresi, 9 paling lambat tetapi lebih banyak kompresi). Secara default gzip berjalan di level 6.sumber
Alasan tar membutuhkan waktu yang sangat sedikit dibandingkan dengan gzip adalah karena ada sedikit overhead komputasi dalam menyalin file Anda ke dalam satu file (yang memang demikian). gzip di sisi lain, sebenarnya menggunakan algoritma kompresi untuk mengecilkan file tar.
Masalahnya adalah bahwa gzip dibatasi (seperti yang Anda temukan) menjadi satu utas.
Masukkan pigz , yang dapat menggunakan banyak utas untuk melakukan kompresi. Contoh cara menggunakan ini adalah:
Ada ringkasan succint yang bagus dari opsi --use-kompres-program di situs saudara .
sumber
Itu menyiratkan tidak ada masalah kinerja I / O tetapi bahwa kompresi hanya menggunakan satu utas (yang akan menjadi kasus dengan gzip).
Jika Anda berhasil mencapai akses / perjanjian yang diperlukan untuk menginstal alat lain, maka 7zip juga mendukung banyak utas untuk memanfaatkan CPU multi-core, meskipun saya tidak yakin apakah itu meluas ke format gzip dan juga miliknya.
Jika Anda terjebak untuk menggunakan hanya gzip untuk saat ini dan memiliki beberapa file untuk dikompres, Anda dapat mencoba mengompresnya secara individual - dengan cara itu Anda akan menggunakan lebih banyak CPU multi-inti dengan menjalankan lebih dari satu proses secara paralel. Berhati-hatilah untuk tidak berlebihan karena segera setelah Anda mendekati kapasitas kinerja subsistem I / O Anda akan menurun secara drastis (menjadi lebih rendah daripada jika Anda menggunakan satu proses / utas) karena latensi pergerakan head menjadi signifikan kemacetan.
sumber
&
- kemudian biarkan sistem mengurusnya dari sana. Masing-masing akan berjalan pada prosesornya sendiri, dan karena saya menghabiskan lebih banyak waktu pada kompresi daripada pada I / O, itu akan mengambil waktu yang sama untuk melakukan satu untuk melakukan semua 10 dari mereka. Jadi saya mendapatkan "kinerja multi-core" dari executable yang di-threaded tunggal ...Satu dapat mengeksploitasi jumlah proses yang tersedia juga dalam pigz yang biasanya kinerja lebih cepat seperti yang ditunjukkan pada perintah berikut
Ini mungkin lebih cepat daripada metode yang disarankan dalam posting karena -p adalah jumlah proses yang dapat dijalankan. Dalam pengalaman pribadi saya, menetapkan nilai yang sangat besar tidak merusak kinerja jika direktori yang akan diarsipkan terdiri dari sejumlah besar file kecil. Jika nilai default yang dipertimbangkan adalah 8. Untuk file besar, rekomendasi saya adalah mengatur nilai ini sebagai jumlah total utas yang didukung pada sistem.
Contoh pengaturan nilai p = 32 jika 32 mesin CPU membantu.
0 dimaksudkan untuk kompresi pigz tercepat karena tidak memampatkan arsip dan lebih difokuskan pada kecepatan. Nilai default adalah 6 untuk kompresi.
sumber