Tenho uma aplicação que normalmente reporta ( time
comando report):
real 1.59
user 1.42
sys 4.73
Mas quando carrego uma biblioteca compartilhada e a executo, o tempo aumenta bastante ( time
relatórios de comando):
real 28.51
user 106.22
sys 5.23
Embora um certo nível de aumento (2 a 4 vezes é relatado no CentOS e no Ubuntu - o que é esperado) na execução seja esperado devido ao trabalho da minha biblioteca compartilhada, o tempo acima relatado no Fedora 24 é muito alto.
Tentei usar perf
o que relatou:
255352.948615 task-clock:u (msec) # 3.895 CPUs utilized
0 context-switches:u # 0.000 K/sec
0 cpu-migrations:u # 0.000 K/sec
18,127 page-faults:u # 0.071 K/sec
664,852,184,198 cycles:u # 2.604 GHz (50.03%)
19,323,811,463 stalled-cycles-frontend:u # 2.91% frontend cycles idle (50.02%)
578,178,881,331 stalled-cycles-backend:u # 86.96% backend cycles idle (50.02%)
110,595,196,687 instructions:u # 0.17 insn per cycle
# 5.23 stalled cycles per insn (50.00%)
28,361,633,658 branches:u # 111.068 M/sec (50.01%)
777,249,031 branch-misses:u # 2.74% of all branches (50.01%)
65.564158710 seconds time elapsed
Isso parece dizer que a CPU fica ociosa por bastante tempo. Mas estou tentando descobrir onde isso acontece no código (tenho acesso a todo o código-fonte do meu aplicativo e da biblioteca compartilhada em questão). Também vi perf report
que relata o tempo gasto em porcentagens em funções/chamadas de sistema. Mas estou interessado em um nível ainda mais preciso, ou seja, quais linhas nessas funções, para que eu possa entender o porquê.
Compreendo que não é fácil fornecer conselhos concretos, visto que não forneci muitas informações sobre meu aplicativo/biblioteca compartilhada. Estou apenas procurando sugestões/ferramentas/ideias para descobrir onde a CPU está gastando a maior parte do tempo no código (ou estando ociosa).
É um Fedora 24 Linux/x86_64 com glibc 2.23 (tanto meu aplicativo quanto minha biblioteca compartilhada são compiladas com gcc 6.1.1 e glibc 2.23).
Responder1
Isso parece dizer que a CPU fica ociosa por bastante tempo.
Sim. Ou seja, 87% de todo o tempo. Mas isso não significa que o processador não funcione em outras tarefas e processos.
664,852,184,198 cycles:u # 2.604 GHz (50.03%)
19,323,811,463 stalled-cycles-frontend:u # 2.91% frontend cycles idle (50.02%)
578,178,881,331 stalled-cycles-backend:u # 86.96% backend cycles idle (50.02%)
110,595,196,687 instructions:u # 0.17 insn per cycle
Otimizar programas para melhor utilizar CPU e memória acessa esta tarefa complexa e sem nenhum código é impossível responder com mais detalhes.