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 waentrada 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
bzip2es uno de los más lentos. La llanuragziptiende a ser significativamente más rápida, generalmente con una compresión no mucho peor. Cuando la velocidad es lo más importante,lzopes 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_dumpallcomando 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,
pbzip2probablemente le dará una aceleración muy significativa. Pero aún necesita más velocidad y puede tolerar archivos ~ 20% más grandes,gzipes probablemente su mejor opción.Actualización: agregué
brotli(ver respuesta de TOOGAM) resultados a la tabla.brotlis 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,q1yq11). El valor predeterminado esq11, pero es extremadamente lento y aún peorxz.q1aunque 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 labzip2familia nuevamente en funcionamiento al comprimir tres veces más rápido quepbzip2con una excelente relación de compresión!zstdTambién parece razonable, pero es superadobrotli (q1)tanto en relación como en velocidad.Mi conclusión original de que
gzipes la mejor apuesta es comenzar a parecer casi tonto. Aunque por ubicuidad, aún no se puede superar;)fuente
pg_dumpallde salida), por lo que es probablemente un poco más representativa :)lz4es 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, porzstddefecto-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
pixzypigzen una tubería también.lbzip2parece dar una mejor velocidad, uso de memoria y una compresión marginalmente mejor quepbzip2. Aquí hay puntos de referencia: vbtechsupport.com/1614lbzip2ve 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
brotliantes, 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 quegzipa 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
zstdcon 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
zstdcompresor 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
timecomando para medir el tiempo de ejecución.input.txtes un archivo de texto de ~ 250 mb que contiene registros json arbitrarios.Usando el tamaño de bloque predeterminado (más grande) (
--bestsimplemente selecciona el comportamiento predeterminado):Usando el tamaño de bloque más pequeño (
--fastargumento):Este fue un descubrimiento un poco sorprendente, teniendo en cuenta que la documentación dice:
fuente