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?