Saya menjalankan perintah ini:
pg_dumpall | bzip2 > cluster-$(date --iso).sql.bz2
Itu terlalu lama. Saya melihat proses dengan top
. Proses bzip2 memakan waktu sekitar 95% dan postgres 5% dari satu inti. The wa
entri rendah. Ini berarti disk bukanlah hambatan.
Apa yang dapat saya lakukan untuk meningkatkan kinerja?
Mungkin biarkan bzip2 menggunakan lebih banyak core. Server memiliki 16 core.
Atau gunakan alternatif untuk bzip2?
Apa yang dapat saya lakukan untuk meningkatkan kinerja?
performance
postgresql
gzip
guettli
sumber
sumber
Jawaban:
Ada banyak algoritma kompresi di sekitar, dan
bzip2
merupakan salah satu yang lebih lambat. Plaingzip
cenderung lebih cepat secara signifikan, biasanya kompresi tidak jauh lebih buruk. Ketika kecepatan adalah yang paling penting,lzop
adalah favorit saya. Kompresi yang buruk, tapi oh begitu cepat.Saya memutuskan untuk bersenang-senang dan membandingkan beberapa algoritma, termasuk implementasi paralel mereka. File input adalah output dari
pg_dumpall
perintah di workstation saya, file SQL 1913 MB. Perangkat kerasnya adalah quad-core i5 yang lebih lama. Waktu adalah waktu dinding-jam hanya kompresi. Implementasi paralel diatur untuk menggunakan semua 4 core. Tabel diurutkan berdasarkan kecepatan kompresi.Jika 16 core server Anda cukup siaga sehingga semua dapat digunakan untuk kompresi,
pbzip2
mungkin akan memberi Anda kecepatan yang sangat signifikan. Tetapi Anda masih membutuhkan kecepatan lebih dan Anda dapat mentolerir ~ 20% file yang lebih besar,gzip
mungkin merupakan taruhan terbaik Anda.Pembaruan: Saya menambahkan
brotli
(lihat jawaban TOOGAM) ke tabel.brotli
s pengaturan kualitas kompresi memiliki dampak yang sangat besar pada rasio kompresi dan kecepatan, jadi saya menambahkan tiga pengaturan (q0
,q1
, danq11
). Standarnya adalahq11
, tetapi sangat lambat, dan masih lebih buruk daripadaxz
.q1
terlihat sangat bagus; rasio kompresi yang sama sepertigzip
, tetapi 4-5 kali lebih cepat!Perbarui: Ditambahkan
lbzip2
(lihat komentar gmathts) danzstd
(komentar Johnny) ke tabel, dan urutkan berdasarkan kecepatan kompresi.lbzip2
mengembalikanbzip2
keluarga dalam menjalankan dengan mengompres tiga kali lebih cepatpbzip2
dengan rasio kompresi yang hebat!zstd
juga terlihat masuk akal tetapi dikalahkan olehbrotli (q1)
rasio dan kecepatan.Kesimpulan asli saya bahwa polos
gzip
adalah taruhan terbaik mulai terlihat hampir konyol. Meskipun untuk mana-mana, itu masih tidak dapat dikalahkan;)sumber
pg_dumpall
output), jadi mungkin sedikit lebih representatif :)lz4
lzop
omong-omong sedikit lebih cepat dan lebih efisien daripada , omong-omong. Ini menggunakan lebih banyak RAM, yang relevan dalam sistem embedded.zstd -T4
juga. Untuk pengaturan yang sangat cepat, Anda dapat mencobazstd -T4 -1
, sebagaizstd
default-3
, yang mungkin merupakan pengaturan yang Anda uji.Gunakan pbzip2.
The pengguna mengatakan:
Ini secara otomatis mendeteksi jumlah prosesor yang Anda miliki dan membuat utas yang sesuai.
sumber
pixz
danpigz
pada pipa juga.lbzip2
tampaknya memberikan kecepatan yang lebih baik, penggunaan memori dan kompresi yang sedikit lebih baik daripadapbzip2
. Ada tolok ukur di sini: vbtechsupport.com/1614lbzip2
terlihat bagus! Saya menambahkannya ke jawaban saya :)Beberapa data:
Perbandingan Algoritma Kompresi Brotli, Deflate, Zopfli, LZMA, LZHAM dan Bzip2
CanIUse.com: fitur: brotli menunjukkan dukungan oleh Microsoft Edge, Mozilla Firefox, Google Chrome, Apple Safari, Opera (tetapi bukan Opera Mini atau Microsoft Internet Explorer).
Perbandingan: Brotli vs deflate vs zopfli vs lzma vs lzham vs bzip2
-
Jika Anda mencari kecepatan kompresi, maka yang Anda cari adalah garis mana yang lebih jauh pada grafik ini. (Entri ke atas bagan ini menunjukkan rasio kompresi yang ketat. Lebih tinggi = lebih ketat. Namun, jika kecepatan kompresi adalah prioritas Anda, maka Anda harus lebih memperhatikan garis apa yang mencapai lebih jauh tepat pada grafik.)
Perbandingan: Rasio Kompresi vs Kecepatan Kompresi untuk Metode ZStandard 7-ZipAnda tidak menyebutkan sistem operasi. Jika Windows, 7-Zip dengan ZStandard (Rilis) adalah versi 7-Zip yang telah dimodifikasi untuk memberikan dukungan untuk menggunakan semua algoritma ini.
sumber
brotli
sebelumnya, tetapi saya lupa tentang itu. Saya menambahkannya ke tabel tolok ukur dalam jawaban saya! Saya sebenarnya sedikit kecewa dengan kinerjanya, kecuali pada pengaturan kualitas 1, di mana ia memberikan rasio kompresi yang sama sepertigzip
pada kecepatan yang jauh lebih tinggi.Gunakan zstd . Jika itu cukup baik untuk Facebook, itu mungkin cukup baik untuk Anda juga.
Pada catatan yang lebih serius, sebenarnya cukup bagus . Saya menggunakannya untuk semuanya sekarang karena itu hanya berfungsi, dan memungkinkan Anda bertukar kecepatan untuk rasio dalam skala besar (paling sering, kecepatan lebih penting daripada ukuran karena penyimpanan murah, tetapi kecepatan adalah hambatan).
Pada level kompresi yang mencapai kompresi keseluruhan yang sebanding dengan bzip2, ini secara signifikan lebih cepat, dan jika Anda bersedia membayar ekstra dalam waktu CPU, Anda hampir dapat mencapai hasil yang mirip dengan LZMA (walaupun kemudian akan lebih lambat daripada bzip2). Pada rasio kompresi yang sedikit lebih buruk, ini jauh, jauh lebih cepat daripada bzip2 atau alternatif utama lainnya.
Sekarang, Anda mengompresi dump SQL, yang sepele memalukan untuk kompres seperti itu. Bahkan kompresor termiskin mendapat skor bagus pada data semacam itu.
Jadi Anda bisa menjalankan
zstd
dengan tingkat kompresi yang lebih rendah, yang akan berjalan puluhan kali lebih cepat dan masih mencapai 95-99% kompresi yang sama pada data itu.Sebagai bonus, jika Anda akan sering melakukan ini dan ingin menginvestasikan waktu ekstra, Anda dapat "melatih"
zstd
kompresor sebelumnya, yang meningkatkan rasio kompresi dan kecepatan. Perhatikan bahwa agar pelatihan berjalan dengan baik, Anda harus memberinya catatan individual, bukan semuanya. Cara alat ini bekerja, ia mengharapkan banyak sampel kecil dan agak mirip untuk pelatihan, bukan satu gumpalan besar.sumber
Sepertinya menyesuaikan (menurunkan) ukuran blok dapat berdampak signifikan pada waktu kompresi.
Berikut adalah beberapa hasil percobaan yang saya lakukan pada mesin saya. Saya menggunakan
time
perintah untuk mengukur waktu eksekusi.input.txt
adalah file teks ~ 250MB yang berisi catatan json sewenang-wenang.Menggunakan ukuran blok default (terbesar) (
--best
hanya memilih perilaku default):Menggunakan ukuran blok terkecil (
--fast
argumen):Ini adalah penemuan yang agak mengejutkan, mengingat dokumen itu mengatakan:
sumber