
Tengo que lanzar un número total, NUMTOT de un programa (puede ser cualquiera, C, Mathematica, ns-2... entornos matemáticos). El problema es que el ordenador donde se ejecutan estos procesos sólo admite un número máximo de ejecuciones, por ejemplo MAX, (MAX < NUMTOT).
Ejecuto estos programas con la siguiente línea en una terminal
./run.sh -d directory num
repetidamente, donde run.sh es un script desde el cual invoco el programa matemático; directorio es el directorio donde está mi programa, y num indica el número de nuevas ejecuciones (entero*num = NUM). El script 'run.sh' crea 'num' directorios con una copia de 'directorio' (el programa) y ejecuta 'num' número de instancias del programa. En mi caso son instancias de Matlab.
Me gustaría un script que realice un seguimiento automático del número de procesos en ejecución y cuando el número máximo se reduzca a (MAX-num), porque 'num' ya ha finalizado, luego inicie las siguientes simulaciones 'num' de Matlab hasta el total. Se completa NUM de simulaciones.
Sería incluso mejor si el script pudiera mantener los MAX procesos posibles simplemente invocando el siguiente programa cuando solo uno acaba de terminar.
En realidad, para saber la cantidad de procesos en ejecución ejecuto el siguiente script
ps axu |grep plopez|grep simulacion|grep MATLAB|awk '{ $2} END{print NR}'
lo que da el total de Matlabs ejecutándose en este momento.
¿Cómo podría hacer todo el conjunto de simulaciones a partir de un único guión?
Respuesta1
La forma habitual de imponer un número máximo de procesos por usuario es mediante pam_limits(8)
. Consulte la limits.conf(5)
página de manual para obtener más detalles y ejemplos para realizar cambios /etc/security/limits.conf
en consecuencia.
Específicamente desea configurar el nproc
parámetro:
nproc
maximum number of processes
Un ejemplo de la página de manual con este parámetro en uso:
@faculty soft nproc 20
@faculty hard nproc 50
Respuesta2
En lugar de verificar periódicamente el número de instancias en ejecución, sugeriría escribir un script que ejecute el programa una y otra vez hasta NUM
alcanzarlo e iniciarlo MAX
en paralelo.
También puede atrapar la SIGCHLD
señal que se emite cuando sale un proceso hijo. Esto debe habilitarse primero con set -o monitor
. Un ejemplo más detallado y alternativas se pueden encontrar enun hilo en Stackoverflow.
Respuesta3
Si sus trabajos de MATLAB no son interactivos (es decir, ejecutan un script por lotes), es posible que desee buscar un software de programación por lotes comoEsfuerzo de torsiónoSlurm- este tipo de gestión de recursos es exactamente para lo que están diseñados.
Normalmente se utilizan en clústeres de HPC, pero en su caso tendría un clúster con un solo nodo de cálculo.
Slurm tiene la ventaja de ser un sistema moderno y bien diseñado que aprovecha años de experiencia previa con otros programadores. Torque/PBS tiene la ventaja de ser familiar: mucha gente ya lo ha utilizado en otros clusters. Slurm tiene un conjunto de envoltorios de compatibilidad para que las personas acostumbradas a PBS o Torque puedan comenzar a usarlos inmediatamente con comandos familiares.
Cualquiera de los dos le brindaría muchas opciones para controlar la programación de trabajos: por núcleos de CPU, memoria, licencias disponibles y más. También proporcionan contabilidad si necesita realizar un seguimiento o limitar el uso acumulado por usuario. Slurm, por ejemplo, tiene una opción de ponderación de uso justo que se puede utilizar para priorizar trabajos de personas que no han realizado muchos trabajos recientemente sobre personas que han usado mucho el sistema, lo que a menudo es mejor que una cuota fija y estricta del total. tiempo de CPU.
Otra opción para evitar licencias limitadas es escribir scripts de MATLAB para que sean compatibles conOctava GNUasí como MATLAB. Luego puede ejecutar tantas pruebas/desarrollo como necesite y realizar la ejecución final en MATLAB si eso es lo que se requiere para publicar sus resultados o colaborar con otros investigadores. Octave es mayormente compatible con MATLAB, pero existen algunas diferencias: aquí hay unaresumen.
Respuesta4
Unrespuesta en otro hilo que trata sobre la limitación del número de subprocesos en bashmuestra el siguiente fragmento, que esperará hasta que se complete uno de los 4 trabajos, comprobando cada diez segundos.
while [ $(jobs | wc -l) -ge 4 ] ; do sleep 10 ; done
Tenga en cuenta que una estrategia de sueño tan activa es bastante ineficaz, tosca e imprecisa.