Usando o job-nanny

O job-nanny é um script essencial do GridUnesp que gerencia a transferência eficiente de dados entre o sistema de arquivos /home/ e as áreas de trabalho dos nós de processamento (/tmp/ ou /store/).

Importante

O uso do job-nanny é obrigatório para todos os jobs que realizam operações de leitura/escrita em disco.

Por Que Usar o job-nanny?

  1. Protege o /home/ - Acesso intensivo ao /home/ durante a execução degrada o desempenho para todos

  2. Otimiza performance - Usa discos locais (/tmp/) muito mais rápidos

  3. Garante persistência - Copia resultados de volta ao final

  4. Checkpoints automáticos - Salva progresso periodicamente

  5. Limpeza automática - Remove arquivos temporários após o job

Como Funciona

Fluxo de Trabalho

1. Job submetido com sbatch
2. job-nanny copia INPUT do /home/ para área de trabalho (/tmp/ ou /store/)
3. Programa executado na área de trabalho
4. Checkpoints periódicos (opcional)
5. Ao final, OUTPUT copiado de volta para /home/
6. Área de trabalho é limpa

Variáveis Obrigatórias

O job-nanny exige a definição de duas variáveis de ambiente:

INPUT

Lista de arquivos e diretórios que serão copiados do /home/ para a área de trabalho.

export INPUT="arquivo1.dat arquivo2.dat diretorio_entrada/"

Exemplos:

# Um único arquivo
export INPUT="entrada.dat"

# Múltiplos arquivos
export INPUT="entrada.dat parametros.txt"

# Arquivos e diretórios
export INPUT="entrada.dat pasta_dados/ biblioteca.so"

# Usando wildcards (cuidado!)
export INPUT="*.dat dados/"

Dica

Havendo mais de um nome de arquivo/diretório de input, os nomes devem estar separados por espaço em branco.

OUTPUT

Lista de arquivos e diretórios que serão copiados da área de trabalho de volta para o /home/.

export OUTPUT="resultado.dat saida/"

Exemplos:

# Arquivo de saída específico
export OUTPUT="resultado.out"

# Múltiplos arquivos e diretórios
export OUTPUT="resultado.out logs/ graficos/"

# Todos os arquivos (cuidado com o tamanho!)
export OUTPUT="*"

# Arquivos com padrão específico
export OUTPUT="*.log *.dat resultados/"

Aviso

Atenção ao usar wildcards (*)

Usar * em INPUT/OUTPUT pode copiar muitos arquivos desnecessários e consumir muito tempo. Seja específico sempre que possível.

Variáveis Opcionais

Variáveis opcionais do job-nanny

Variável

Padrão

Descrição

CHECKPOINT

$OUTPUT

Local para salvar checkpoints (pode ser diferente de OUTPUT)

WAIT_CHECKPOINT

10800 (3h)

Intervalo entre checkpoints em segundos

SHARED_FS

“false”

Força uso do /store/ (para arquivos grandes ou jobs multi-nó)

LARGE_FILES

“false”

Indica arquivos grandes (>100 GB), força uso do /store/

VERBOSE

0

Ativa modo verboso (1) para debug

CHECKPOINT_FUNC

Função personalizada para checkpoint (uso avançado)

Escolha Entre /tmp/ e /store/

O job-nanny decide automaticamente onde executar:

Usa /tmp/ (rápido, local) quando:

  • Job usa apenas 1 nó (-N 1)

  • SHARED_FS não está definido ou é "false"

  • LARGE_FILES não está definido ou é "false"

Usa /store/ (compartilhado) quando:

  • Job usa múltiplos nós (-N > 1)

  • SHARED_FS="true"

  • LARGE_FILES="true"

Dica

Para jobs de 1 nó com arquivos muito grandes (>100 GB), use LARGE_FILES="true" para forçar o uso do /store/, que tem mais espaço disponível.

Exemplos de Uso

Exemplo 1: Job Serial Simples

job_simples.sh
#!/bin/bash
#SBATCH -J simples
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 01:00:00
#SBATCH --mem=4G

export INPUT="entrada.dat"
export OUTPUT="resultado.dat"

module load python/3.9
job-nanny python processa.py entrada.dat > resultado.dat

Exemplo 2: Job com Múltiplos Arquivos

job_multiplo.sh
#!/bin/bash
#SBATCH -J multiplo
#SBATCH -N 1
#SBATCH -c 4
#SBATCH -t 06:00:00

export INPUT="parametros.in dados/ bibliotecas/"
export OUTPUT="saida.dat logs/"

module load meu_app
job-nanny ./simular -i parametros.in -o saida.dat

Exemplo 3: Job com Arquivos Grandes

job_grande.sh
#!/bin/bash
#SBATCH -J grande
#SBATCH -N 1
#SBATCH -n 28
#SBATCH -t 48:00:00

export INPUT="dataset_500GB.bin"
export OUTPUT="resultados/"
export LARGE_FILES="true"      # Força uso do /store/

job-nanny srun ./processador dataset_500GB.bin

Exemplo 4: Job MPI (Múltiplos Nós)

job_mpi.sh
#!/bin/bash
#SBATCH -J mpi
#SBATCH -N 4
#SBATCH --ntasks-per-node=28
#SBATCH -t 24:00:00

export INPUT="dados_mpi/"
export OUTPUT="resultados_mpi/"

module load openmpi/4.1.5
job-nanny mpirun -np $SLURM_NTASKS ./programa_mpi

Nota

Jobs com -N > 1 usam /store/ automaticamente, mesmo sem SHARED_FS="true" ou LARGE_FILES="true".

Exemplo 5: Job com Checkpoints Frequentes

job_checkpoint.sh
#!/bin/bash
#SBATCH -J longo
#SBATCH -N 1
#SBATCH -n 28
#SBATCH -t 20-00:00:00          # 20 dias

export INPUT="entrada.dat"
export OUTPUT="resultado_final.dat"
export CHECKPOINT="checkpoints/"
export WAIT_CHECKPOINT=3600      # Checkpoint a cada 1 hora

module load meu_software
job-nanny simular --restart checkpoints/

Exemplo 6: Job com Debug

job_debug.sh
#!/bin/bash
#SBATCH -J debug
#SBATCH -N 1
#SBATCH -n 4
#SBATCH -t 01:00:00

export INPUT="entrada_teste.dat"
export OUTPUT="saida_teste.dat"
export VERBOSE=1                  # Modo verboso

module load meu_app
job-nanny ./programa entrada_teste.dat

Arquivo de Log do job-nanny

O job-nanny gera saídas detalhadas no arquivo de log do SLURM (slurm-JOBID.out):

Hostname node045
Basedir /tmp
Copying /home/joao/entrada.dat -> /tmp/joao/12345/
Executing ./programa entrada.dat
Return Code 0
Copying /tmp/joao/12345/resultado.dat -> /home/joao/
Removing files from /tmp/joao/12345/

Com VERBOSE=1, mais detalhes são exibidos:

Hostname node045
Basedir /tmp
Creating directory /tmp/joao/12345/
Copying arquivo1.dat
Copying arquivo2.dat
Copying diretorio/
Executing ./programa
Checkpoint thread started (interval: 10800s)
[Checkpoint] Saving at 18:30:00
[Checkpoint] Completed
Return Code 0
Stopping checkpoint thread
Copying resultado.dat
Copying logs/
Removing work directory

Erros Comuns e Soluções

Erro: “INPUT is missing”

Causa: Variável INPUT não foi definida.

Solução:

export INPUT="seus_arquivos.dat"

Erro: “OUTPUT is missing”

Causa: Variável OUTPUT não foi definida.

Solução:

export OUTPUT="seus_resultados.dat"

Erro: “No space left on device”

Causa: Disco cheio (geralmente /tmp/).

Soluções:

  1. Reduza tamanho dos arquivos INPUT

  2. Use LARGE_FILES="true" para usar /store/

  3. Limpe arquivos temporários durante execução

Arquivos OUTPUT Não Aparecem em /home/

Causas possíveis:

  1. Nomes errados em OUTPUT

    # Se seu programa gera "output.dat"
    export OUTPUT="output.dat"  # Correto
    export OUTPUT="resultado.dat"  # Errado!
    
  2. Job cancelado antes de copiar

    • Use checkpoints frequentes (WAIT_CHECKPOINT menor)

  3. Permissões de arquivo

    • Verifique se o programa tem permissão para criar os arquivos

Erro: “Permission denied” no /store/

Causa: Permissões incorretas no diretório.

Solução:

# Verificar permissões
ls -la /store/$USER

# Corrigir se necessário
chmod 755 /store/$USER

Perguntas Frequentes

P: É obrigatório usar job-nanny?

R: Sim, para qualquer job que faça I/O significativo. Jobs que acessam diretamente o /home/ durante execução podem ser cancelados pela equipe.

P: Posso executar sem job-nanny?

R: Tecnicamente sim, mas não é recomendado. O desempenho será pior e você pode sobrecarregar o sistema.

P: job-nanny funciona com MPI?

R: Sim! Use job-nanny mpirun -np $SLURM_NTASKS ./programa_mpi.

P: Como faço para usar bibliotecas instaladas em /home/?

R: Inclua-as em INPUT e configure LD_LIBRARY_PATH:

export INPUT="programa/libs/biblioteca.lib"
export LD_LIBRARY_PATH=/caminho/para/programa/libs:$LD_LIBRARY_PATH
job-nanny ./programa

P: Posso usar job-nanny com containers?

R: Sim:

export INPUT="container.sif script.py"
export OUTPUT="resultados/"
job-nanny apptainer exec container.sif python script.py

Ver também