Como descobrir o (s) processo (s) que se bifurca muito?

3

Recentemente, recebi um problema muito alto em nosso servidor. Eu assisti top por meia hora para descobrir que era o Nagios que bifurcava muitos processos de curta duração. Depois de quicar o Nagios, tudo voltou ao normal.

A minha pergunta aqui é: como descobrir o processo raiz que se bifurra muito mais rapidamente?

Obrigado.

    
por Magicloud 22.09.2015 / 13:41

3 respostas

4

Se você executar um sistema operacional que suporte dtrace , esse script ajudará você a identificar quais processos estão iniciando processos de curta duração:

#!/usr/sbin/dtrace -qs

proc:::exec
{
  self->parent=stringof((unsigned char*)curpsinfo->pr_psargs);
}

proc:::exec-success
/self->parent != NULL/
{
  printf("%s -> %s\n",self->parent,curpsinfo->pr_psargs);
  self->parent=NULL;
}

Se você estiver em um SO sem dtrace support, dê uma olhada nas alternativas, por exemplo, systemtap ou sysdig com Linux, ProbeView com AIX.

Aqui está um script de sysdig que mostrará todos os horários de lançamento e saída de comandos com seus pid e ppid :

sysdig -p"*%evt.time %proc.pid %proc.ppid %evt.dir %proc.exeline" \
    "( evt.dir=< and evt.type=execve ) or evt.type=procexit"

Outro método seria habilitar a contabilidade de processo com seu SO (se disponível, geralmente o pacote acct no Linux) e dar uma olhada nos logs gerados. Existe também um programa semelhante ao top que alavanca a contabilidade do processo: no topo .

    
por 22.09.2015 / 14:46
0

Experimente top -Sd1 . Isso mostrará o tempo acumulado de cada processo em vez de apenas o seu. Cumulativo aqui significa o tempo que um processo consumiu, mais o tempo que seus filhos não existem mais são consumidos.

Normalmente, o processo que sobe mais rápido (e provavelmente o que já é alto o suficiente) é o que você está procurando. Depois disso, você pode avaliar o processo para verificar sua suspeita.

    
por 23.09.2015 / 01:14
-1

ps ej |cut -d" " -f1 |sort |uniq -c

Na verdade, ps ej exibe o Pid pai do processo, portanto, se um processo for muito, todos os seus filhos terão o mesmo Pid.

cut -d" " -f1 está lá apenas para manter o primeiro campo da saída do ps, em seguida, sort dos dados e, finalmente, uniq -c exibirá o número de ocorrências de cada uniq pid.

Você também pode ter uma versão somente do awk com a contagem de ocorrências com um array: ps ejx |awk -n '{count[$1]++}END{for(j in count) print "process:" j, "("count[j]")"}'

    
por 22.09.2015 / 14:48