Investigar un trabajo fallido#
No siempre los trabajos se ejecutan correctamente. Hay una lista de motivos por los que los trabajos o las aplicaciones se detienen o fallan. Las causas más comunes son:
- Exceder los límites de recursos solicitados, como la memoria o el tiempo límite, por ejemplo.
- Errores específicos del software.
- Errores en el procesamiento de los datos.
Nota
Es importante recopilar mensajes de error/salida ya sea escribiendo dicha información en la ubicación predeterminada o especificando ubicaciones específicas mediante las opciones --error/--output
, por ejemplo, aunque esto dependerá de cada software.
Los mensajes de error y de salida son el punto de partida para investigar un error en el trabajo.
Exceder los límites de recursos#
Cada partición define límites máximos y predeterminados para el tiempo de ejecución y el uso de la memoria. Dentro de la especificación del trabajo, los límites actuales se pueden definir dentro de los rangos. Para una mejor programación, se deben estimar los requisitos del trabajo y adaptar los límites a las necesidades. Cuanto más bajos sean los límites mejor, así SLURM podrá encontrar un lugar. Además, cuanto menos gastos generales de recursos se especifican, menos recursos se desperdician, como por ejemplo, con la memoria.
Info
Si un trabajo excede el tiempo de ejecución o el límite de memoria, SLURM matará el trabajo.
Información de error#
En ambos casos, el archivo de errores proporciona información adecuada:
- Tiempo límite:
(...)
slurmstepd: error: *** JOB 41239 ON fnode01 CANCELLED AT 2016-11-30T11:22:57 DUE TO TIME LIMIT ***
(...)
- Límite de memoria:
(...)
slurmstepd: error: Job 41176 exceeded memory limit (3940736 > 2068480), being killed
slurmstepd: error: Exceeded job memory limit
slurmstepd: error: *** JOB 41176 ON fnode01 CANCELLED AT 2016-11-30T10:21:37 ***
(...)
Errores de Software#
Slurm captura el código de salida de un trabajo y lo guarda como parte del registro del trabajo. Para trabajos lanzados con sbatch, se captura el código de salida del script. Para trabajos lanzados con srun, el código de salida será el valor de retorno del comando ejecutado. Cualquier código de salida distinto de cero se considera un error de trabajo y da como resultado un estado de trabajo de FAILED.
Si una señal es responsable de la terminación de un trabajo/paso, el número de la señal también se capturará y se mostrará después del código de salida (separado por dos puntos).
Según el orden de ejecución de los comandos en el script sbatch, es posible que un comando específico falle, pero el script por lotes devolverá cero, lo que indica que se realizó correctamente. Por ejemplo:
#!/bin/bash
#SBATCH --job=my_r_test # Nombre del trabajo
#SBATCH --nodes=1 # Nº de nodos
#SBATCH --constrains=sandy # sandy, ilk (icelake)... arquitecture
#SBATCH --time=02:00 # Límite de tiempo
#SBATCH --output=file_%j.log # Log de salida estandar
#SBATCH --error=file_%j.err # Log de salida errores
#SBATCH --chdir=. # Directorio de trabajo
#SBATCH --mail-user=email # Donde será enviado el mail
#SBATCH --mail-type=END,FAIL # Eventos email
##########################################################
Rscript fail.R
echo "Script finished"
El código de salida y el estado indican incorrectamente que el trabajo finalizó correctamente:
sbatch job_sbatch.sh
Submitted batch job 41585
sacct -j 41585
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
41585 Simple E + all id 1 COMPLETED 0:0
41585.batch batch id 1 COMPLETED 0:0
Solo el archivo de salida específico de R muestra el error:
Puede evitar este problema "saliendo" con un código de salida adecuado tan pronto como falle el comando:
#!/bin/bash
#SBATCH --job=my_r_test # Nombre del trabajo
#SBATCH --nodes=1 # Nº de nodos
#SBATCH --constrains=sandy # sandy, ilk (icelake)... arquitecture
#SBATCH --time=02:00 # Límite de tiempo
#SBATCH --output=file_%j.log # Log de salida estandar
#SBATCH --error=file_%j.err # Log de salida errores
#SBATCH --chdir=. # Directorio de trabajo
#SBATCH --mail-user=email # Donde será enviado el mail
#SBATCH --mail-type=END,FAIL # Eventos email
##########################################################
Rscript fail.R || exit 91
echo "Script finished"
Ahora, el código de salida y el estado coinciden con el verdadero resultado:
sbatch job_sbatch.sh
Submitted batch job 41925
sacct -j 41925
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
41925 Simple E + all id 1 FAILED 91:0
41925.batch batch id 1 FAILED 91:0
Compruebe siempre los archivos de salida específicos de la aplicación en busca de mensajes de error.