Torque
Introdução
O Torque que é semelhante ao PBS (Portable Batch System) permite o melhor gerenciamento dos recursos disponíveis nos servidores do NACAD-COPPE/UFRJ. Por este motivo, nos servidores principais, a utilização dos recursos só será possível através do sistema de fila Torque.
Embora a execução de um programa através de um sistema de fila possa ser feita diretamente da linha de comandos, recomenda-se o uso de scripts PBS.
Alguns comentários sobre o PBS e seus scripts PBS:
- o nome das filas tem normalmente o seguinte formato "b_<recurso 1>_<recurso 2>_...", nos exemplos abaixo as filas estão divididas em dois recursos número de CPUs e tempo de processamento;
- filas que consomem menos recursos (CPU e tempo de processamento) terão prioridade sobre as demais filas;
- linhas iniciadas com #PBS são diretivas de configuração do PBS;
- linhas iniciadas com # + espaço são considerados comentários;
- caso não seja especificado os limites dos recursos (CPU e tempo de processamento) o PBS colocará o job em execução na menor fila;
- nos casos em que o tempo alocado para o programa for insuficiente para sua execução, o mesmo será abortado após o término do tempo estipulado pela fila;
- observar nos programas paralelos que os parâmetro do PBS (#PBS -l ncpus=y ou #PBS -l nodes=x ou #PBS -l nodes=x:ppn=y) deve ser o mesmo solicitado pelo programa.
A seguir serão mostrados os comandos básicos do PBS e exemplos de scripts PBS para os servidores do NACAD.
Onde obter os jobs padrões de cada sistema?
Estes jobs estão disponíveis no diretório /usr/local/scripts/PBS nos respectivos servidores.
Comandos Básicos do PBS
- qsub: submete job na fila
sintaxe: qsub <pbs_script>
$ qsub openmp.pbs
61.servidor
- qstat: verifica o status das filas do PBS
qstat -q: retorna uma tabela com informações básias das filas disponíveis
qstat -Q: semelhante ao comando anterior porém com o status de execução de cada fila
qstat -a: lista todos os jobs que estão sendo executados
qstat -f 60: retorna o status completo do jobID identificado por 60
$ qstat -q
server: venus
Queue Memory CPU Time Walltime Node Run Que Lm State
---------------- ------ -------- -------- ---- --- --- -- -----
b_1core_12hs -- -- 12:00:00 -- 0 0 6 E R
b_1core_1h -- -- 01:00:00 -- 0 0 10 E R
b_1core_6hs -- -- 06:00:00 -- 0 0 10 E R
b_1core_unlim -- -- -- -- 2 0 3 E R
b_2cores_12hs -- -- 12:00:00 -- 0 0 6 E R
b_2cores_1h -- -- 01:00:00 -- 0 0 6 E R
b_2cores_6hs -- -- 06:00:00 -- 0 0 6 E R
b_2cores_unlim -- -- -- -- 0 0 2 E R
b_4cores_12hs -- -- 12:00:00 -- 0 0 3 E R
b_4cores_1h -- -- 01:00:00 -- 0 0 3 E R
b_4cores_6hs -- -- 06:00:00 -- 0 0 3 E R
b_4cores_unlim -- -- -- -- 0 0 2 E R
b_8cores_12hs -- -- 12:00:00 -- 0 0 3 E R
b_8cores_1h -- -- 01:00:00 -- 0 0 3 E R
b_8cores_6hs -- -- 06:00:00 -- 0 0 3 E R
b_8cores_unlim -- -- -- -- 0 0 3 E R
b_16cores_12hs -- -- 12:00:00 -- 0 0 2 E R
b_16cores_1h -- -- 01:00:00 -- 0 0 3 E R
b_16cores_6hs -- -- 06:00:00 -- 0 0 2 E R
b_16cores_unlim -- -- -- -- 1 0 2 E R
b_32cores_12hs -- -- 12:00:00 -- 0 0 1 E R
b_32cores_1h -- -- 01:00:00 -- 0 0 1 E R
b_32cores_6hs -- -- 06:00:00 -- 0 0 1 E R
b_32cores_unlim -- -- -- -- 1 3 1 E R
default -- -- -- -- 0 0 64 E R
nacad -- -- -- -- 0 0 -- E R
----- -----
4 3
$ qstat -Q
Queue Max Tot Ena Str Que Run Hld Wat Trn Ext T
---------------- --- --- --- --- --- --- --- --- --- --- -
b_1core_12hs 6 0 yes yes 0 0 0 0 0 0 E
b_1core_1h 10 0 yes yes 0 0 0 0 0 0 E
b_1core_6hs 10 0 yes yes 0 0 0 0 0 0 E
b_1core_unlim 3 2 yes yes 0 2 0 0 0 0 E
b_2cores_12hs 6 0 yes yes 0 0 0 0 0 0 E
b_2cores_1h 6 0 yes yes 0 0 0 0 0 0 E
b_2cores_6hs 6 0 yes yes 0 0 0 0 0 0 E
b_2cores_unlim 2 0 yes yes 0 0 0 0 0 0 E
b_4cores_12hs 3 0 yes yes 0 0 0 0 0 0 E
b_4cores_1h 3 0 yes yes 0 0 0 0 0 0 E
b_4cores_6hs 3 0 yes yes 0 0 0 0 0 0 E
b_4cores_unlim 2 0 yes yes 0 0 0 0 0 0 E
b_8cores_12hs 3 0 yes yes 0 0 0 0 0 0 E
b_8cores_1h 3 0 yes yes 0 0 0 0 0 0 E
b_8cores_6hs 3 0 yes yes 0 0 0 0 0 0 E
b_8cores_unlim 3 0 yes yes 0 0 0 0 0 0 E
b_16cores_12hs 2 0 yes yes 0 0 0 0 0 0 E
b_16cores_1h 3 0 yes yes 0 0 0 0 0 0 E
b_16cores_6hs 2 0 yes yes 0 0 0 0 0 0 E
b_16cores_unlim 2 1 yes yes 0 1 0 0 0 0 E
b_32cores_12hs 1 0 yes yes 0 0 0 0 0 0 E
b_32cores_1h 1 0 yes yes 0 0 0 0 0 0 E
b_32cores_6hs 1 0 yes yes 0 0 0 0 0 0 E
b_32cores_unlim 1 4 yes yes 2 1 1 0 0 0 E
nacad 0 0 yes yes 0 0 0 0 0 0 E
default 64 0 yes yes 0 0 0 0 0 0 R
$ qstat -a
servidor: Altix 450
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
------------ -------- -------- ---------- ------ --- --- ------ ----- - -----
60.servidor lvalente b_8cores script.pbs 8118 -- 8 159334 01:00 R 00:51
61.servidor rnelias b_8cores openmp.pbs -- -- -- -- -- Q --
62.servidor bino b_32core mpi 14498 -- 32 -- 12:00 R 08:32
$ qstat -f 60
Job Id: 60.servidor
Job_Name = script.pbs
resources_used.cpupercent = 718
resources_used.cput = 05:50:00
resources_used.mem = 146592kb
resources_used.vmem = 287248176kb
resources_used.walltime = 00:51:20
job_state = R
queue = b_8cores_1h
...
qdel: remove o job da fila
$ qdel 61
pbsnodes: mostra o status de alocação do sistema
$ pbsnodes -a
servidor
state = free
np = 70
ntype = cluster
jobs = 0/2209.servidor, 0/2211.servidor, 0/1997.servidor, 0/2205.servidor
status = opsys=linux,uname=Linux servidor 2.6.27.19-5-default #1 SMP 2009-02-28
04:40:21 +0100 ia64,sessions=1651 14488 14966 15838 15921,nsessions=5,nusers=4,
idletime=169579,totmem=141119552kb,availmem=82200768kb,physmem=141119552kb,ncpus=
72,loadave=199.54,netload=421812568,state=free,jobs=2205.servidor 1997.servidor
2211.servidor 2209.servidor,varattr=,rectime=1265981510
Scripts para SGI Altix-450
No Altix o parâmetro #PBS -l ncpus=x é equivalente ao #PBS -l nodes=1:ppn=x.
Job serial
Arquivo serial.pbs:
#PBS -S /bin/csh # Shell usado no job
#PBS -m ae # Enviar email quando o job for abortado ou acabar
#PBS -M
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
# E-mail do usuário
#PBS -l ncpus=1 # Limite de recursos: número de CPUs
#PBS -l walltime=06:00:00 # Limite de recursos: tempo máximo de execução do job ([[h:]m:]s)
#PBS -j oe # Coloca a saída e erro no mesmo arquivo
#PBS -N serial # Nome do job (na ausência será adotado o nome do arquivo de script)
limit coredumpsize 0 # Define o tamanho máximo do arquivo core
cd $PBS_O_WORKDIR # PBS_O_WORKDIR: diretório de execução do comando qsub
./prog # Executa o programa prog
Job paralelo usando OpenMP ou múltiplos threads
Arquivo openmp.pbs:
#PBS -S /bin/csh # Shell usado no job
#PBS -m ae # Enviar email quando o job for abortado ou acabar
#PBS -M
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
# E-mail do usuário
#PBS -l ncpus=4 # Limite de recursos: número de CPUs
#PBS -l walltime=06:00:00 # Limite de recursos: tempo máximo de execução do job ([[h:]m:]s)
#PBS -j oe # Coloca a saída e erro no mesmo arquivo
#PBS -N openmp # Nome do job (na ausência ser adotado o nome do arquivo de script)
limit coredumpsize 0 # Define o tamanho miáximo do arquivo core
setenv OMP_NUM_THREADS 4 # Define o número de threads para o OpenMP
cd $PBS_O_WORKDIR # PBS_O_WORKDIR: diretório de execuço do comando qsub
./prog # Executa o programa prog em paralelo
Job parelelo usando MPI
Arquivo mpi.pbs:
#PBS -S /bin/csh # Shell usado no job
#PBS -m ae # Enviar email quando o job for abortado ou acabar
#PBS -M
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
# E-mail do usuário
#PBS -l ncpus=4 # Limite de recursos: número de CPUs
#PBS -l walltime=06:00:00 # Limite de recursos: tempo máximo de execução do job ([[h:]m:]s)
#PBS -j oe # Coloca a saída e erro no mesmo arquivo
#PBS -N mpi # Nome do job (na ausência ser adotado o nome do arquivo de script)
limit coredumpsize 0 # Define o tamanho máximo do arquivo core
cd $PBS_O_WORKDIR # PBS_O_WORKDIR: diretório de execução do comando qsub
mpirun -np 4 ./prog # Executa o programa prog usando o MPI
Scripts para o Altix ICE
Antes de submeter o job o ambiente de programação deve estar carregado, vide item de Module do Guia do Usuário.
Job serial
#PBS -l nodes=1:ppn=1
#PBS -l walltime=12:00:00
#PBS -N serial
#PBS -j oe
#PBS -V
# PBS -m ae
# PBS -M
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
# change directory
cd ${PBS_O_WORKDIR}
./prog
Job paralelo usando MPI (MVAPICH2)
Exemplo com 16 cores: 2 nodes com 8 cores cada um
#PBS -l nodes=2:ppn=8
#PBS -l walltime=12:00:00
#PBS -N mvapich
#PBS -j oe
#PBS -V
# PBS -m ae
# PBS -M
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
# change directory
cd ${PBS_O_WORKDIR}
# create list with names from data network
sort ${PBS_NODEFILE} | uniq > /tmp/${PBS_JOBID}
# get the number of processors and nodes
NUM_PROC=`cat ${PBS_NODEFILE} | wc -l`
NUM_NODES=`cat /tmp/${PBS_JOBID} | wc -l`
# start MPD on allocated nodes
mpdboot -n ${NUM_NODES} -f /tmp/${PBS_JOBID} -r rsh
# run on all nodes
mpiexec -n ${NUM_PROC} prog
# stop MPD on allocated nodes
mpdallexit
rm -f /tmp/${PBS_JOBID}
Job paralelo usando MPI (OpenMPI)
Exemplo com 16 cores: 2 nodes com 8 cores cada um
#PBS -l nodes=2:ppn=8
#PBS -l walltime=12:00:00
#PBS -N openmpi
#PBS -j oe
#PBS -V
# PBS -m ae
# PBS -M
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
# change directory
cd ${PBS_O_WORKDIR}
# get the number of processors and nodes
NUM_PROC=`cat ${PBS_NODEFILE} | wc -l`
# run on all nodes
mpirun -n ${NUM_PROC} prog