Puedo conectarme a una máquina remota que tiene 64 núcleos. Digamos que necesito ejecutar 640 scripts de shell en paralelo en esta máquina. ¿Cómo hago esto?
Puedo ver dividir los 640 scripts en 64 grupos, cada uno de 10 scripts. ¿Cómo podría ejecutar cada uno de estos grupos en paralelo , es decir, un grupo en cada uno de los núcleos disponibles?
Sería un guión de la forma
./script_A &
./script_B &
./script_C &
...
¿dónde script_A
corresponde al primer grupo, script_B
al segundo grupo, etc., es suficiente?
Las secuencias de comandos dentro de un grupo que se ejecutan en un núcleo pueden ejecutarse secuencialmente, pero quiero que los grupos se ejecuten en paralelo en todos los núcleos.
parallelism
Tom
fuente
fuente
Respuestas:
Esto parece un trabajo para GNU paralelo:
La ventaja es que no tiene que agrupar sus scripts por núcleos,
parallel
lo hará por usted.Por supuesto, si no desea cuidar a la sesión SSH mientras se ejecutan los scripts, debe usar
nohup
oscreen
fuente
parallel
paquete. Gracias`bash -c
puede ser que no sean necesarios:parallel ::: ./script*
. Con 640 script es probable que sean muy similares (por ejemplo, solo un argumento es diferente). Para eso, considere usar GNU Parallel directamente para establecer estos argumentos y usar un solo script.Eso funcionará siempre y cuando no necesite monitorear la salida y esté bien dejando abierta su sesión ssh mientras los scripts tarden en ejecutarse. Si alguno de estos no es cierto, recomendaría usarlo
screen
con varias pestañas. Podrías hacer algo comofuente
nohup
probablemente funcionaría, simplemente estoy más familiarizadoscreen
y tiene mucha más funcionalidad que puede o no serle útil.Para iniciar y administrar una gran cantidad de trabajos de secuencias de comandos, necesitará algún tipo de software de administración para controlar el uso de recursos (CPU, memoria, prioridad), ver el estado del trabajo (esperar, suspender, ejecutar, finalizar).
El motor Grid está diseñado para eso, por ejemplo, Sun Grid Engine ( http://wiki.gridengine.info/wiki/index.php/Main_Page ) o Open Grid Scheduler ( http://gridscheduler.sourceforge.net/ ). Es necesario que el administrador instale el software adecuado para usted antes de poder comenzar. El administrador podría estar feliz de hacer eso, en lugar de ver cientos de procesos ejecutándose en la máquina, y no tener control sobre ellos.
En general, el administrador define en cuántas ranuras se puede dividir una máquina, y usted envía un trabajo a una cola y especifica cuántas ranuras quiere consumir el trabajo, el motor de cuadrícula controlará el uso general del sistema y ejecutará el trabajo de acuerdo con La política de colas definida por el administrador. por ejemplo, no se pueden ejecutar más de x trabajos al mismo tiempo, etc. el resto de los trabajos estarán en cola en estado de espera y se liberarán una vez que finalicen los trabajos anteriores.
fuente
Puede probar el shell distribuido. Descargar desde: http://sourceforge.net/projects/dsh/
fuente
Lo he hecho en varias ocasiones y, por lo general, solo paso mi propio script para hacer el trabajo con control de trabajo. Genéricamente, si tiene los nombres de todos los scripts que desea ejecutar en un archivo, la solución se verá así:
Es fuerza bruta, pero efectiva. Además, no necesita agregar ningún software adicional como paralelo a sus sistemas.
Un gran problema es que el comando de espera esperará a que finalice el script más lento, lo que puede perder tiempo. He creado guiones para solucionar esta situación, pero se vuelven más complejos como puedes imaginar. Si todos sus scripts se ejecutan en aproximadamente la misma cantidad de tiempo, esto funciona bien.
Otro problema es que puede que tenga que ajustar MAX_PROCS para determinar el mejor rendimiento.
Por supuesto, la cantidad de conexiones ssh puede ser difícil de manejar. En cuyo caso, simplemente mueva este script al host remoto y cambie la línea "ssh ..." para ejecutar los scripts directamente.
fuente