Compreender o tempo de CPU gasto pelo processo no espaço do usuário/kernel

Compreender o tempo de CPU gasto pelo processo no espaço do usuário/kernel

Tenho uma aplicação que normalmente reporta ( timecomando report):

real 1.59
user 1.42
sys 4.73

Mas quando carrego uma biblioteca compartilhada e a executo, o tempo aumenta bastante ( timerelató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 perfo 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 reportque 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.

informação relacionada