2010-12-03 28 views
34

Tengo un conjunto de servidores llenos cada uno con un montón de archivos que se pueden gzip. Todos los servidores tienen diferentes números de núcleos. ¿Cómo puedo escribir un script bash para iniciar un gzip para cada núcleo y asegurarme de que los gzips no estén comprimiendo el mismo archivo?Gzip con todos los núcleos

+0

¿Estás seguro de que la velocidad de la unidad de disco duro no los limitará? – ruslik

+1

@rulik, exactamente, la velocidad de la unidad de disco duro será el cuello de botella o gzip habría agregado la compatibilidad con múltiples procesadores hace mucho tiempo. –

+9

No estoy de acuerdo. Ejecutando gzip en una serie de archivos, según mi experiencia, fija la CPU al 100%, la E/S del disco permanece baja. Sí, en un caso muy extremo, es posible que la E/S del disco se convierta en el próximo cuello de botella, pero esta es una excelente razón para usar esos núcleos adicionales en lugar de ejecutar un solo hilo. – Demosthenex

Respuesta

51

Si está en Linux, puede usar los xargs de GNU para ejecutar tantos procesos como núcleos tenga.

CORES=$(grep -c '^processor' /proc/cpuinfo) 
find /source -type f -print0 | xargs -0 -n 1 -P $CORES gzip -9 
  • encontrar -print0/xargs -0 le protege de los espacios en blanco en los nombres de archivo
  • xargs -n 1 significa un proceso por archivo gzip
  • xargs -P especifica el número de puestos de trabajo
  • gzip -9 significa compresión máxima
+8

No es necesario exportar la variable. Deberías usar '$()' en lugar de backticks. No es necesario usar 'cat' -' grep' acepta un archivo como argumento. GNU 'grep' (si no otros también) puede contar, por lo que no necesita' wc'. Resultado final: 'CORES = $ (grep -c^processor/proc/cpuinfo)' –

+1

Tiene toda la razón. Yo estaba perezosamente buscando en Proc buscando, y lo dejó improvisado. Eso es mucho más limpio. – Demosthenex

+0

Si desea reservar, digamos 2 procesadores para otros programas, podría usar lo siguiente (probablemente haya una manera más limpia o más bash-ish para hacer esto): CORES = $ (grep -c '^ processor'/proc/cpuinfo | perl -ane 'print $ F [0] - 2') – Morlock

6

Es posible que desee considerar la comprobación GNU parallel. También encontré esto video on youtube que parece hacer lo que estás buscando.

+0

Paralelamente menciona que usa banderas similares a xargs, irónicamente descubrí recientemente que xargs ahora incluye la capacidad de iniciar múltiples procesos, ver mi respuesta. – Demosthenex

54

Hay una implementación de gzip que es multiproceso, pigz. Como está comprimiendo un archivo en varios hilos, debería poder leer desde el disco de manera más eficiente, en comparación con la compresión de múltiples archivos a la vez.

+1

¡Creo que es una solución superior! Si cada bloque que se va a comprimir se ejecuta en hilos separados, es mejor que utilizar algo como xargs para iniciar un proceso por archivo. Por otro lado, si no puede instalar software personalizado en servidores $ X, puede recurrir al comportamiento de xargs. Gran descubrimiento! – Demosthenex

+2

Esto es bueno saberlo. Desafortunadamente, Pigz no está en nuestros servidores. :( – User1

+0

Nota: pigz solo puede hacer compresión paralela, no descompresión (más una limitación de compresión gz que pigz si lo entiendo bien). Cuando descompresión pigz todavía usa 4 hilos, para separar la lectura, escritura y comprobación. – qwertzguy

Cuestiones relacionadas