Calculando o tempo de CPU do processo no RHEL 5.3

0

Para um gerenciamento de processo, eu precisaria remover um processo que exceda uma certa quantidade de tempo de CPU, por exemplo, 1 hora. No comando PS, ele tem o parâmetro TIME mostra o tempo total da CPU de um processo. maneira correta de levar o tempo de CPU de um processo? Também há outros comandos que podem ser usados no cálculo do tempo de processamento da CPU.

    
por Kratos 28.11.2013 / 10:29

2 respostas

4

Na maioria dos sistemas, você pode usar o comando ulimit quando você inicia o programa para limitar a quantidade de tempo de CPU que pode usar. Sob o capô, isso chama setrlimit com o argumento RLIMIT_CPU . Após o programa ter usado tanto tempo, o programa é morto.

(ulimit -t 3600; myprogram)

Você pode refinar ainda mais definindo um limite flexível após o qual o programa recebe o sinal SIGXCPU (que pode capturar) e um limite rígido após o qual o programa recebe o sinal SIGKILL (que é inevitavelmente fatal). / p>

(ulimit -t -S 3590; ulimit -t -H 3600; myprogram)

Eu não sei de nenhum utilitário de shell para alterar o limite de um programa em execução. Você pode fazer com que o processo execute a chamada do sistema setrlimit via ptrace , por exemplo, usando um depurador. Observe que algumas estruturas de segurança desabilitam esse uso de ptrace (por exemplo, ele é desativado por padrão nas versões atuais do Ubuntu), não sei se o RHEL 5 permite isso.

gdb -n -pid 1234 -batch -x /dev/stdin <<EOF
call setrlimit(RLIMIT_CPU, {(rlim_t) 3590, (rlim_t) 3600})
detach
quit
EOF

( 1234 é o ID do processo e os dois números dentro das chaves são o limite flexível e rígido.)

    
por 29.11.2013 / 01:15
2

Dependendo da precisão de que você precisa, invocar ps e alguns amigos podem ser suficientes.

No entanto, tenha em mente que o ps obtém seus dados de algum lugar; não há nada de mágico nessa aplicação em particular.

Dê uma olhada em /proc/$$/sched e especificamente no valor de se.sum_exec_runtime . Esse valor é o número total de nanossegundos processo passou na CPU . Não vou gastar muito tempo para rastrear sua história, mas parece o valor foi mantido pelo menos desde 2.6.32 .

Para obter um valor mais útil (milissegundos), pegue o valor relatado e divida-o por 1.000.000.

Provavelmente, existem outras maneiras de obter os mesmos dados, mas podem ser não-triviais sem recorrer a syscalls no kernel, o que não é uma tarefa fácil de se fazer a partir de um script de shell.

    
por 28.11.2013 / 10:59