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

1

Eu tenho um aplicativo que normalmente reporta ( time relatórios de comando):

real 1.59
user 1.42
sys 4.73

Mas quando carrego uma biblioteca compartilhada e a executo, o tempo sobe bastante (relatórios do comando time ):

real 28.51
user 106.22
sys 5.23

Enquanto um certo nível de aumento (2 a 4 vezes é relatado no CentOS e no Ubuntu - o que é esperado) na execução é esperado devido ao trabalho da minha biblioteca compartilhada, o acima o tempo relatado no Fedora 24 é muito alto.

Eu tentei usar o perf 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 está ociosa por muito 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 informa o tempo gasto em porcentagens em funções / chamadas do sistema. Mas estou interessado em um nível ainda melhor, ou seja, qual (is) linha (s) nessas funções, para que eu possa entender o porquê.

Aprecio que não seja fácil fornecer qualquer conselho concreto, pois não forneci muitas informações sobre meu aplicativo / biblioteca compartilhada. Eu estou apenas procurando por sugestões / ferramentas / idéias para descobrir onde a CPU está gastando a maior parte do tempo no código (ou sendo inativa).

É um Fedora 24 Linux / x86_64 com o glibc 2.23 (tanto meu aplicativo quanto a biblioteca compartilhada são compilados com gcc 6.1.1 e glibc 2.23).

    
por usr 27.09.2016 / 18:31

1 resposta

1

This appears to say that CPU is idle for plenty of time.

Sim. Ou seja, 87% do tempo todo. 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 a CPU e a memória acessa tarefas complexas e sem qualquer código, é impossível responder a você com mais detalhes.

    
por 29.09.2016 / 13:42

Tags