TOP vs PS + Monitorar processos filhos [RESOLVIDO]

13. TOP vs PS

Jhonatan Francisco de Paula
jhonatan1090

(usa CentOS)

Enviado em 26/07/2015 - 20:20h

Vixe, espero que dê para entender... comecei com shell esses dias.


#!/bin/bash

# Verifica se foi passado os 2 parametros
if [ $# != 2 ]; then
echo "****************************************************************************************"
echo "* Você tem que passar dois parametros. (arquivo com os comando e tempo para cada um)"
echo "* Exemplo... benchmark.sh <arquivo com os comandos> '250000 500000 750000'"
echo "****************************************************************************************"
exit 0
fi

# Verifica se o dataset existe
if [ ! -e $1 ]; then
echo "*********************************************************"
echo " Arquivo $1 não encontrado."
echo "*********************************************************"
exit 0
fi

# Gera um vetor dos parametros passados para o sleep
vetor=(`echo $2`)

# pega o tamanho desse vetor (pode ser um sleep para todos os programas ou um para cada)
tamanho=${#vetor[@]}

cont=0

# Trata cada comando do arquivo passado como parametro separadamente
while read line
do
olddir=`pwd` # Grava o diretorio de onde foi chamado o benchmark
vetor2=(`echo $line`) # Grava em um vetor a linha do arquivo com o comando (programa vai ser o primeiro indice)
basedir=`dirname ${vetor2[0]}` # Pega o diretorio onde estah o programa
eval cd "$basedir" # vai para o diretorio
programa=`basename ${vetor2[0]} "."${vetor2[0]##*.}` # Pega apenas o nome do programa sem extensão
logBench=`echo ${olddir}/log_${programa}_benchmark_$$` # monta nome do arquivo de log do programa
p=`bash -c "$line" &> $logBench & echo $!` # Executa programa e pega seu PID
first=`ps -p $p -oeuser,pid,%cpu,%mem,comm | grep $p` # Faz a primeira leitura
logCompressor=`echo ${olddir}/log_${programa}_benchmark_$$_${p}` # Monta nome do arquivo de log benchmark
echo "Comando utilizado - $line " &> $logCompressor # grava na log
echo "Início em `date +"%d-%m-%Y %H:%M:%S:%N"`" &>> $logCompressor # grava na log
echo "`date +"%d-%m-%Y %H:%M:%S:%N"` -- $first " &>> $logCompressor # grava na log

# Enquanto o processo estiver executando
while kill -0 $p 2> /dev/null; do
snap=`top -n 1 -b -p $p | grep $programa` # faz leitura
d=`date +"%d-%m-%Y %H:%M:%S:%N"` # Pega horário
echo "$d -- $snap " &>> $logCompressor # grava na log
usleep ${vetor[$cont]} # Dorme por x nanosegundos
done

# Informa horario de termino
echo "Termino em `date +"%d-%m-%Y %H:%M:%S:%N"`" &>> $logCompressor

# Se foi passado mais de um sleep, é mudado para o sleep do proximo programa
if [ $tamanho -gt 1 ]; then
(( cont++ ))
fi

# Volta ao diretorio de onde foi chamado o benchmark
eval cd "$olddir"

done <$1

# concatena arquivos gerados
cat log_*_benchmark_$$* > log_benchmark_$$_merged




  


14. Re: TOP vs PS + Monitorar processos filhos [RESOLVIDO]

Sergei Martao
sergeimartao

(usa Linux Mint)

Enviado em 27/07/2015 - 13:56h

Voce esta tentando monitorar esse script?
porque pelo que conheço, o correto é monitorar o comando que o script esta chamando.



15. TOP vs PS

Jhonatan Francisco de Paula
jhonatan1090

(usa CentOS)

Enviado em 27/07/2015 - 16:41h

Não, esse é o benchmark... nessa linha eu executou o programa, usei bash -c "$line" porque o nome de cada programa a ser analisado está em uma arquivo passado por parâmetro.

p=`bash -c "$line" &> $logBench & echo $!`


Logo após o inicio da execução eu já dou um PS, para garantir que vou pegar pelo menos um snapshot daqueles programas que executam muito rápido.



16. Re: TOP vs PS + Monitorar processos filhos [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/07/2015 - 18:02h

Dependendo do que você quer medir, pode ser que o comando time ajude.

Contudo, se você quer fazer algum tipo de análise de eficiência do programa, deveria considerar o gprof.


17. TOP vs PS

Jhonatan Francisco de Paula
jhonatan1090

(usa CentOS)

Enviado em 27/07/2015 - 18:39h

paulo1205, obrigado pela dica. Fui ler sobre os comando e vi que eles só trazem o time, preciso do consumo de memória e cpu, mas uma coisa bem legal que vi no gprof é o tratamento dos processos filho. Muito bacana!!!


18. Re: TOP vs PS + Monitorar processos filhos [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/07/2015 - 18:51h

jhonatan1090 escreveu:

paulo1205, obrigado pela dica. Fui ler sobre os comando e vi que eles só trazem o time, preciso do consumo de memória e cpu,


Você deixou de ver, então. Leia a manpage e veja sobre os formatos e dados possíveis com a opção -f.


19. Re: TOP vs PS + Monitorar processos filhos [RESOLVIDO]

Sergei Martao
sergeimartao

(usa Linux Mint)

Enviado em 27/07/2015 - 21:33h

jhonatan1090

Já tentou usar o script e procurar pelo processo $line?
ou esse line chama outros comandos?



20. TOP vs PS

Jhonatan Francisco de Paula
jhonatan1090

(usa CentOS)

Enviado em 27/07/2015 - 21:51h

Então sergeimartao, vou te contar o que estou fazendo, senta que lá vem a história kkk. Tenho que fazer esse benchmark para monitorar compressores de DNA. Estou ajudando um amigo meu em seu artigo de doutorado. Então tem lá 20 programas para com pilar, executar e monitorar a execução. O motivo final de tudo isso é dizer qual é melhor que qual. Então vamos aos problemas:
1° Esses programas são de várias pessoas ao redor do mundo, não sei como é o comportamento deles, se o mesmo terá 10, 15, 20 ou mais processos filhos.
2° Tem programa que é divido em partes, e as vezes uma parte dessa é muuuuito rápida, e quando vou dar o primeiro PS para pegar pelo menos um snapshot do carinha ele já morreu.
3° Meu benchmark geralmente vem com 0.0 de uso de cpu e memoria, pois meu PS está buscando o programa principal, não seus filhos. Agora se tivesse apenas um filho seria fácil, era só usar o PPID, mas se o filho do programa principal chamar outro programa já da problema de novo.

Não sei mais o que fazer, estou à 3 dias procurando resolver estes problemas e não aparece nada, ainda por cima faz +- um mês que estou mexendo com linux, não manjo quase nada hehehe.


21. Re: TOP vs PS

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/07/2015 - 10:19h

O mais parecido com o que você quer é a versão externa do comando time, que reside em /usr/bin/time. O default é mostrar só tempos, mas você pode usar a opção -f para especificar outros valores a exibir, incluindo uso de CPU e memória, quantidade de page faults, swap etc.

O problema é que, pela documentação e por testes que fiz aqui, ele só pega dados do processo imediato, não de eventuais filhos e outros descendentes que eles tenham produzido.

É possível pegar dados de consumo de recursos de dependentes, mas isso requer um pouco mais de inteligência tanto no coletor de dados (uma versão incrementada do time, que talvez até já exista) quanto no próprio programa cujos dados serão coletados: o coletor de cima teria de chamar getrusage() com o parâmetro RUSAGE_CHILDREN _antes_ de chamar wait(), e todos os processos da árvore de descendentes abaixo dele têm de chamar wait() sobre seus próprios filhos. A primeira parte é fácil de fazer; a segunda, não, ainda mais se os programas estão fora do seu controle direto.

Já lhe ocorreu ativar o serviço de process accounting (pacct), e depois rodar o comando sa para consolidar a saída?


22. Re: TOP vs PS + Monitorar processos filhos [RESOLVIDO]

Sergei Martao
sergeimartao

(usa Linux Mint)

Enviado em 28/07/2015 - 14:10h

jhonatan1090

Imagino que mais pessoas participam desse projeto, você não consegue falar com alguém, tipo um fórum específico deles, talvez já utilizem algum procedimento e seja só questão de compartilhar



23. TOP vs PS

Jhonatan Francisco de Paula
jhonatan1090

(usa CentOS)

Enviado em 28/07/2015 - 22:41h

sergeimartao e paulo1205, muito obrigado pelas dicas e pela paciência, achei uma forma bem simples de resolver (pelo menos o problema dos processos pais e filhos), nem acredito que perdi 3 dias para achar isso kkk. O comando PS tem uma coluna chamada PGID que é igual para todos os programas que originaram do mesmo processo principal (O PGID é o PID do processo pai). Por exemplo.

4631 25443 4631 teste1.sh 0.0 0.0
4632 4631 4631 teste2.sh 0.0 0.0
4634 1 4631 ex1.s h 0.0 0.0
4636 4634 4631 usleep 0.0 0.0

Dai é só buscar por ele:

watch -n 0.5 'ps -o pid,ppid,pgid,comm,%cpu,%mem  -u jhonatan | {grep PID_PRINCIPAL}' 


Galera valeu pela ajuda!!!!


24. Re: TOP vs PS + Monitorar processos filhos [RESOLVIDO]

Sergei Martao
sergeimartao

(usa Linux Mint)

Enviado em 29/07/2015 - 00:12h

Shooowwww
Bem interessante isso, vou salvar esse comando, importante se lembrar dos PGID! rsrs
Vlw por ter postado a solução, por favor marque o tópico como resolvido




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts