Tengo una aplicación que normalmente informa ( time
informes de comando):
real 1.59
user 1.42
sys 4.73
Pero cuando cargo una biblioteca compartida y la ejecuto, el tiempo aumenta bastante ( time
informes 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 perf
el 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 report
que 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.