Comprender el tiempo de CPU empleado por proceso en el espacio de usuario/kernel

Comprender el tiempo de CPU empleado por proceso en el espacio de usuario/kernel

Tengo una aplicación que normalmente informa ( timeinformes de comando):

real 1.59
user 1.42
sys 4.73

Pero cuando cargo una biblioteca compartida y la ejecuto, el tiempo aumenta bastante ( timeinformes de comando):

real 28.51
user 106.22
sys 5.23

Si bien se espera un cierto nivel de aumento (de 2 a 4 veces en CentOS y Ubuntu, lo cual es lo esperado) en ejecución debido al trabajo de mi biblioteca compartida, el tiempo reportado anteriormente en Fedora 24 es demasiado alto.

Intenté usar perfel que informó:

     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

Esto parece decir que la CPU está inactiva durante mucho tiempo. Pero estoy tratando de encontrar dónde sucede eso en el código (tengo acceso al código fuente completo tanto de mi aplicación como de la biblioteca compartida en cuestión). También he visto perf reportque informa el tiempo dedicado en porcentajes a funciones/llamadas al sistema. Pero estoy interesado en un nivel aún más preciso, es decir, qué líneas en esas funciones para poder entender por qué.

Aprecio que no sea fácil brindar algún consejo concreto dado que no he proporcionado mucha información sobre mi aplicación/biblioteca compartida. Solo estoy buscando sugerencias/herramientas/ideas para descubrir dónde pasa la CPU la mayor parte de su tiempo en el código (o está inactiva).

Es Fedora 24 Linux/x86_64 con glibc 2.23 (tanto mi aplicación como mi biblioteca compartida están compiladas con gcc 6.1.1 y glibc 2.23).

Respuesta1

Esto parece decir que la CPU está inactiva durante mucho tiempo.

Sí. Es decir, el 87 % de todo el tiempo. Pero eso no significa que el procesador no funcione en otras tareas y procesos.

   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

La optimización de los programas para utilizar mejor la CPU y la memoria supone una tarea compleja y, sin ningún código, es imposible responderle con más detalle.

información relacionada