Eu tenho alguns processos que estão consumindo muito tempo de CPU do sistema (conforme determinado olhando para vmstat). Existe uma maneira fácil de descobrir que tipo de chamadas do sistema estão sendo feitas?
Eu sei que há traços, mas existe uma maneira mais rápida e fácil? Existe algo como um "top" para chamadas do sistema?
linux
performance
monitoring
central-processing-unit
strace
bajafresh4life
fonte
fonte
Respostas:
Acho que strace com a
-c
bandeira é provavelmente o mais próximo que eu conheço. Se você não usou o-c
sinalizador, tente o seguinte:Onde 12345 é o ID do processo (PID) do processo em questão. Observe que rastrear um processo adiciona sobrecarga adicional; portanto, enquanto você o rastreia, o processo será mais lento.
Depois de executar isso por quanto tempo você desejar coletar dados, pressione
Ctrl-C
para interromper a coleta de dados e gerar os resultados. Produzirá algo como isto:Como você pode ver, trata-se de um detalhamento de todas as chamadas do sistema feitas pelo aplicativo, classificadas pelo tempo total e incluindo o tempo médio por chamada e o número de chamadas para cada syscall. Se você deseja classificá-los de maneira diferente, consulte a página de manual para strace, pois há algumas opções.
fonte
Talvez tente um dos criadores de perfil de amostragem, como oprofile, ou para kernels mais recentes, perf. Se você tiver sorte, o "perf top" poderá dizer exatamente o que você deseja. Veja aqui alguns exemplos
fonte
O tipo de switch strace que eu costumo usar é esse.
strace -ffttT -p pid -o /tmp/strace.out
Um exemplo disso seria,
Você vê a diferença horária no lado direito da chamada do sistema, mostrando quanto tempo levou para passar de uma chamada do sistema para outra.
Você perceberá a diferença de horário entre as chamadas do sistema. Portanto, quando você vê que uma chamada do sistema tem alguns segundos de diferença com a próxima chamada do sistema, então está fazendo barulho.
Outro método é despejá-lo com o gcore. No entanto, isso requer um pouco de experiência na navegação pelo gdb.
Mas, se o thread for um thread do kernel, não será possível rastreá-lo ou despejá-lo. Nesse caso, temos que usar algo mais complexo. No kernel RHEL5, usamos oprofile. No RHEL6, usamos perf. Eu prefiro perf sobre oprofile. Os dados do Perf podem ser coletados com formato gráfico, mostrando a chamada do sistema em que a porcentagem máxima de CPU está sendo usada.
Com um teste perf, eu vejo isso.
Ele mostra a função do kernel em que 38% do tempo da CPU está sendo gasto. Agora, podemos verificar a função e ver o que está fazendo e o que deve fazer.
Com alguns exemplos, não é tão difícil.
fonte