Estoy ejecutando este comando:
pg_dumpall | bzip2 > cluster-$(date --iso).sql.bz2
Toma mucho tiempo Miro los procesos con top
. El proceso bzip2 toma alrededor del 95% y postgres 5% de un núcleo. La wa
entrada es baja. Esto significa que el disco no es el cuello de botella.
¿Qué puedo hacer para aumentar el rendimiento?
Quizás deje que bzip2 use más núcleos. Los servidores tienen 16 núcleos.
¿O usar una alternativa a bzip2?
¿Qué puedo hacer para aumentar el rendimiento?
performance
postgresql
gzip
guettli
fuente
fuente
Respuestas:
Hay muchos algoritmos de compresión, y
bzip2
es uno de los más lentos. La llanuragzip
tiende a ser significativamente más rápida, generalmente con una compresión no mucho peor. Cuando la velocidad es lo más importante,lzop
es mi favorito. Mala compresión, pero tan rápido.Decidí divertirme un poco y comparar algunos algoritmos, incluidas sus implementaciones paralelas. El archivo de entrada es la salida del
pg_dumpall
comando en mi estación de trabajo, un archivo SQL de 1913 MB. El hardware es un i5 de cuatro núcleos más antiguo. Los tiempos son tiempos de reloj de pared de solo la compresión. Las implementaciones paralelas están configuradas para usar los 4 núcleos. Tabla ordenada por velocidad de compresión.Si los 16 núcleos de su servidor están lo suficientemente inactivos como para que todos puedan usarse para la compresión,
pbzip2
probablemente le dará una aceleración muy significativa. Pero aún necesita más velocidad y puede tolerar archivos ~ 20% más grandes,gzip
es probablemente su mejor opción.Actualización: agregué
brotli
(ver respuesta de TOOGAM) resultados a la tabla.brotli
s ajuste de calidad de compresión tiene un impacto muy grande en relación de compresión y la velocidad, por lo que añade tres ajustes (q0
,q1
yq11
). El valor predeterminado esq11
, pero es extremadamente lento y aún peorxz
.q1
aunque se ve muy bien; ¡la misma relación de compresión quegzip
, pero 4-5 veces más rápido!Actualización: Se agregó
lbzip2
(ver comentario de gmathts) yzstd
(comentario de Johnny) a la tabla, y se ordenó por velocidad de compresión.lbzip2
¡pone a labzip2
familia nuevamente en funcionamiento al comprimir tres veces más rápido quepbzip2
con una excelente relación de compresión!zstd
También parece razonable, pero es superadobrotli (q1)
tanto en relación como en velocidad.Mi conclusión original de que
gzip
es la mejor apuesta es comenzar a parecer casi tonto. Aunque por ubicuidad, aún no se puede superar;)fuente
pg_dumpall
de salida), por lo que es probablemente un poco más representativa :)lz4
es un poco más rápido y más eficiente quelzop
, por cierto. Sin embargo, utiliza más RAM, lo cual es relevante en los sistemas integrados.zstd -T4
. Para configuraciones muy rápidas, puede probarzstd -T4 -1
, porzstd
defecto-3
, cuál es probablemente la configuración que probó.Usa pbzip2.
El manual dice:
Detecta automáticamente la cantidad de procesadores que tiene y crea subprocesos en consecuencia.
fuente
pixz
ypigz
en una tubería también.lbzip2
parece dar una mejor velocidad, uso de memoria y una compresión marginalmente mejor quepbzip2
. Aquí hay puntos de referencia: vbtechsupport.com/1614lbzip2
ve bien! Lo agregué a mi respuesta :)Algunos datos:
Comparación de algoritmos de compresión Brotli, Deflate, Zopfli, LZMA, LZHAM y Bzip2
CanIUse.com: característica: brotli muestra soporte de Microsoft Edge, Mozilla Firefox, Google Chrome, Apple Safari, Opera (pero no Opera Mini o Microsoft Internet Explorer).
Comparación: Brotli vs deflate vs zopfli vs lzma vs lzham vs bzip2
-
Si está buscando velocidad de compresión, lo que está buscando es qué líneas están más a la derecha en este gráfico. (Las entradas en la parte superior de este gráfico muestran una relación de compresión ajustada. Mayor = más estricto. Sin embargo, si la velocidad de compresión es su prioridad, entonces deberá prestar más atención a las líneas que se extienden más a la derecha en el gráfico).
Comparación: relación de compresión versus velocidad de compresión para métodos estándar Z-7-ZipNo mencionaste un sistema operativo. Si Windows, 7-Zip con ZStandard (versiones) es una versión de 7-Zip que se ha modificado para proporcionar soporte para el uso de todos estos algoritmos.
fuente
brotli
antes, pero lo olvidé. ¡Lo agregué a la tabla de puntos de referencia en mi respuesta! De hecho, estaba un poco decepcionado con su rendimiento, excepto en el ajuste de calidad 1, donde proporcionaba la misma relación de compresión quegzip
a una velocidad mucho mayor.Usa zstd . Si es lo suficientemente bueno para Facebook, probablemente también sea lo suficientemente bueno para ti.
En una nota más seria, en realidad es bastante bueno . Lo uso para todo ahora porque simplemente funciona, y le permite cambiar la velocidad por la relación a gran escala (la mayoría de las veces, la velocidad importa más que el tamaño, ya que el almacenamiento es barato, pero la velocidad es un cuello de botella).
A niveles de compresión que alcanzan una compresión general comparable a bzip2, es significativamente más rápido, y si está dispuesto a pagar un poco más en tiempo de CPU, casi puede lograr resultados similares a LZMA (aunque entonces será más lento que bzip2). Con tasas de compresión ligeramente peores, es mucho, mucho más rápido que bzip2 o cualquier otra alternativa convencional.
Ahora, está comprimiendo un volcado de SQL, que es tan vergonzosamente trivial para comprimir como puede ser. Incluso los compresores más pobres obtienen buenos puntajes en ese tipo de datos.
Por lo tanto, puede ejecutar
zstd
con un nivel de compresión más bajo, que se ejecutará docenas de veces más rápido y aún alcanzará el 95-99% de la misma compresión en esos datos.Como beneficio adicional, si va a hacer esto con frecuencia y desea invertir algo de tiempo extra, puede "entrenar" el
zstd
compresor con anticipación, lo que aumenta tanto la relación de compresión como la velocidad. Tenga en cuenta que para que el entrenamiento funcione bien, necesitará alimentar registros individuales, no todo. La forma en que funciona la herramienta, espera muchas muestras pequeñas y algo similares para el entrenamiento, no una gran gota.fuente
Parece que ajustar (bajar) el tamaño del bloque puede tener un impacto significativo en el tiempo de compresión.
Aquí hay algunos resultados del experimento que hice en mi máquina. Usé el
time
comando para medir el tiempo de ejecución.input.txt
es un archivo de texto de ~ 250 mb que contiene registros json arbitrarios.Usando el tamaño de bloque predeterminado (más grande) (
--best
simplemente selecciona el comportamiento predeterminado):Usando el tamaño de bloque más pequeño (
--fast
argumento):Este fue un descubrimiento un poco sorprendente, teniendo en cuenta que la documentación dice:
fuente