Uso da CPU de acordo com ps e operf

1

Adquiri alguns dados aparentemente em conflito a partir de duas fontes que alguém poderia considerar confiáveis. Com toda a probabilidade, estou lendo mal uma das fontes.

O ambiente do servidor é: Ubuntu 14.04.2 LTS, 3.13.0-53-generic

Por um lado, há um script Python que mostra o uso da CPU e a coloca em um InfluxDB que é renderizado pelo Grafana. O comando usado resume-se a algo como:

ps -eLo pid,lwp,pcpu | grep 2924  | awk {'print $2,$3'}
...
2924  2924  0.1
2924  2926  2.4
2924  2927  2.4
2924  2930  2.4
2924  2933  2.4
2924  2935  0.0
2924  3096  0.0
2924  3099  9.0
2924  3100  5.7

Os gráficos relatam previsivelmente na maioria das circunstâncias, embora o uso da CPU seja apenas amostrado a cada 45 segundos.

De acordo com esse gráfico, o thread que chama Foo() quando ele gera tem o maior uso de CPU de todos os itens acima. De fato, o TID 3099 da saída real acima é o encadeamento em questão. Esse alto uso persiste ao longo do dia durante cargas de dados variáveis, etc.

Por outro lado, temos o pacote OProfile. Eu corri operf -gl neste programa por algumas horas ontem e recebi um bom pedaço de dados em troca. Quando renderizado com opreport -gc , obtenho a seguinte linha:

46423     0.2396  FooManager.cpp:625      foobinary.V0.28       Foo()

Esta é a linha em que Foo() está sem recuo. Minha leitura disso, então, diz: Foo() é responsável por consideravelmente mais uso de CPU do que seus threads, consistentemente. No entanto, quando perfilado, apenas 0,2396% das amostras capturadas mostraram a função na pilha de chamadas.

Isso parece impossível. Certamente, um segmento que tenha o maior uso relativo de CPU para seus colegas de trabalho será responsável pela maior porcentagem de amostras de perfis?

    
por musasabi 11.03.2016 / 21:51

0 respostas