From 7a2856412166f1b3887525b12293a79e0dc2b8ac Mon Sep 17 00:00:00 2001 From: Renato Alves <alves.rjc@gmail.com> Date: Mon, 15 May 2017 14:42:17 +0200 Subject: [PATCH] ENH Add ability to limit the number of simultaneously active jobs --- bin/submitjob | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/bin/submitjob b/bin/submitjob index d1e4acb..36b9108 100755 --- a/bin/submitjob +++ b/bin/submitjob @@ -14,6 +14,7 @@ RESERVE="" NODES="1" MEM="4" # 4 GB by default MEMALL="$MEM" +ACTIVE="100" QUEUE="" TARGET="" FEATURES="" @@ -63,6 +64,7 @@ usage() { echo >&2 " * -N --nodes = how many nodes to spread across (LSF/SLURM). Defaults to ${NODES}" echo >&2 " -m --mem = how much RAM per job (in GB). Defaults to ${MEM}G/job" echo >&2 " for less than 1G/job use fractionals such as 0.1 (100M/job)" + echo >&2 " -a --active = limit number of simultaneously active jobs. Defaults to ${ACTIVE}" echo >&2 " -q --queue = which queue to use. Uses cluster's default if unspecified" echo >&2 " * -t --target = restricts to running on the given host(s) [comma separated] (SGE)" echo >&2 " * -F --features = request specific resources to constrain your jobs (SLURM)" @@ -97,7 +99,7 @@ usage() { echo >&2 "" echo >&2 " In addition to standard SGE/LSF/SLURM environment variables, the following" echo >&2 " can be used in the jobs file referencing the values used." - echo >&2 " \${Q_NAME} \${Q_CORES} \${Q_MEM} \${Q_MEMALL} \${Q_QUEUE} \${Q_LOGFILE} \${Q_WAITFOR}" + echo >&2 " \${Q_NAME} \${Q_CORES} \${Q_MEM} \${Q_MEMALL} \${Q_ACTIVE} \${Q_QUEUE} \${Q_LOGFILE} \${Q_WAITFOR}" echo >&2 "" echo >&2 "" } @@ -189,6 +191,7 @@ cat << EOF | ${LOCALCMD} #$ -j yes #$ -N ${NAME} #$ -S /bin/bash +#$ -tc ${ACTIVE} ${BANG_BEGIN} ${BANG_QUEUE} ${BANG_EMAIL} @@ -200,6 +203,7 @@ export Q_LOGFILE="${LOGFILE}" export Q_CORES="${CORES}" export Q_MEM="${MEM}" export Q_MEMALL="${MEMALL}" +export Q_ACTIVE="${ACTIVE}" export Q_QUEUE="${QUEUE}" export Q_WAITFOR="${WAITFOR}" @@ -225,7 +229,7 @@ slurm_submit() { cat << EOF | ${LOCALCMD} #!/usr/bin/env bash -#SBATCH --array=${JOB_COUNT} +#SBATCH --array=${JOB_COUNT}%${ACTIVE} #SBATCH --cpus-per-task=${CORES} #SBATCH -N ${NODES} #SBATCH --mem-per-cpu=${MEM}M @@ -243,6 +247,7 @@ export Q_LOGFILE="${LOGFILE}" export Q_CORES="${CORES}" export Q_MEM="${MEM}" export Q_MEMALL="${MEMALL}" +export Q_ACTIVE="${ACTIVE}" export Q_QUEUE="${QUEUE}" export Q_WAITFOR="${WAITFOR}" @@ -274,7 +279,7 @@ cat << EOF | ${LOCALCMD} #BSUB -n ${CORES} #BSUB -M ${MEM} #BSUB -o ${LOGFILE} -#BSUB -J ${NAME}[$JOB_COUNT] +#BSUB -J ${NAME}[${JOB_COUNT}]%${ACTIVE} #BSUB -R "select[(mem>=${MEM})] rusage[mem=${MEM}] span[hosts=${NODES}]" ${BANG_BEGIN} ${BANG_QUEUE} @@ -286,6 +291,7 @@ export Q_LOGFILE="${LOGFILE}" export Q_CORES="${CORES}" export Q_MEM="${MEM}" export Q_MEMALL="${MEMALL}" +export Q_ACTIVE="${ACTIVE}" export Q_QUEUE="${QUEUE}" export Q_WAITFOR="${WAITFOR}" @@ -306,7 +312,7 @@ EOF } -ARG_PARSE="getopt -o s:n:c:N:m:q:t:F:l:e:E:w:b:d:fh -l system:,name:,cores:,nodes:,mem:,queue:,target:,features:,logfile:,email:,emailwhen:,waitfor:,begin:,debug:,fatal,help -n $0 --" +ARG_PARSE="getopt -o s:n:c:N:m:q:t:F:l:e:E:w:b:d:fh -l system:,name:,cores:,nodes:,mem:,active:,queue:,target:,features:,logfile:,email:,emailwhen:,waitfor:,begin:,debug:,fatal,help -n $0 --" # We process arguments twice to handle any argument parsing error: ARG_ERROR=$($ARG_PARSE "$@" 2>&1 1>/dev/null) @@ -353,6 +359,11 @@ while true; do MEM="$1" shift ;; + -a|--active) + shift + ACTIVE="$1" + shift + ;; -q|--queue) shift QUEUE="$1" -- GitLab