Понимание времени ЦП, затрачиваемого процессом в пространстве пользователя/ядра

Понимание времени ЦП, затрачиваемого процессом в пространстве пользователя/ядра

У меня есть приложение, которое обычно сообщает ( timeкоманда сообщает):

real 1.59
user 1.42
sys 4.73

Но когда я загружаю общую библиотеку и запускаю ее, то время значительно увеличивается ( timeкоманда сообщает):

real 28.51
user 106.22
sys 5.23

Хотя определенный уровень увеличения производительности (в 2–4 раза, как и ожидалось, сообщается в CentOS и Ubuntu) можно ожидать из-за работы моей общей библиотеки, приведенные выше временные показатели для Fedora 24 слишком высоки.

Я попытался использовать perf, что сообщило:

     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

Похоже, это говорит о том, что ЦП простаивает довольно долго. Но я пытаюсь найти, где это происходит в коде (у меня есть доступ ко всему исходному коду как моего приложения, так и разделяемой библиотеки, о которой идет речь). Я также видел, perf reportчто which сообщает о времени, потраченном в процентах в функциях/системных вызовах. Но мне интересен еще более тонкий уровень, то есть какая строка(ы) в этих функциях, чтобы я мог понять, почему.

Я понимаю, что нелегко дать какой-либо конкретный совет, учитывая, что я не предоставил много информации о своем приложении/общей библиотеке. Я ищу только предложения/инструменты/идеи, чтобы выяснить, где процессор проводит большую часть своего времени в коде (или простаивает).

Это Fedora 24 Linux/x86_64 с glibc 2.23 (и мое приложение, и общая библиотека скомпилированы с помощью gcc 6.1.1 и glibc 2.23).

решение1

Похоже, это говорит о том, что процессор простаивает в течение длительного времени.

Да. А именно 87% всего времени. Но это не значит, что процессор не работает над другими задачами и процессами.

   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

Оптимизация программ для лучшего использования ресурсов ЦП и памяти — сложная задача, и без какого-либо кода невозможно дать вам более подробный ответ.

Связанный контент