
Estoy investigando el rendimiento de un servidor de bases de datos multiproceso. Hay una carga de trabajo particular que se ejecuta en aproximadamente 61 segundos en una máquina en particular. El pid del proceso de la base de datos fue 79894 cuando ejecuté perf contra la carga de trabajo.
Además de los subprocesos de software en el servidor de la base de datos, hay varios subprocesos relacionados con Linux, que normalmente están inactivos en un sistema inactivo, que se activan mientras se ejecuta mi carga de trabajo. Por lo tanto, quiero usar la opción -a de perf así como la opción -p.
Ejecuto perf de dos maneras y obtengo resultados algo diferentes en cada una de ellas.
Las primeras formas en que ejecuto el siguiente comando perf en una ventana
perf stat -p 2413 -a
e inmediatamente ejecute la carga de trabajo de la base de datos en otra ventana. Cuando finaliza la carga de trabajo de la base de datos, controlo C fuera de rendimiento y obtengo los siguientes resultados
Performance counter stats for process id '79894':
1,842,359.55 msec cpu-clock # 30.061 CPUs utilized
3,798,673 context-switches # 0.002 M/sec
153,995 cpu-migrations # 0.084 K/sec
16,038,992 page-faults # 0.009 M/sec
4,939,131,149,436 cycles # 2.681 GHz
3,924,220,386,428 stalled-cycles-frontend # 79.45% frontend cycles idle
3,418,137,943,654 instructions # 0.69 insn per cycle
# 1.15 stalled cycles per insn
402,389,588,237 branches # 218.410 M/sec
5,137,510,170 branch-misses # 1.28% of all branches
61.28834199 seconds time elapsed
El segundo método es ejecutar
perf stat -a sleep 61
en una ventana y ejecutar inmediatamente la carga de trabajo de la base de datos en otra ventana. Después de 61 segundos, tanto el rendimiento como la carga de trabajo finalizan y el rendimiento produce los siguientes resultados
Performance counter stats for 'system wide':
4,880,317.67 msec cpu-clock # 79.964 CPUs utilized
8,274,996 context-switches # 0.002 M/sec
202,832 cpu-migrations # 0.042 K/sec
14,605,246 page-faults # 0.003 M/sec
5,022,298,186,711 cycles # 1.029 GHz
7,599,517,323,727 stalled-cycles-frontend # 151.32% frontend cycles idle
3,421,512,233,294 instructions # 0.68 insn per cycle
# 2.22 stalled cycles per insn
402,726,487,019 branches # 82.521 M/sec
5,124,543,680 branch-misses # 1.27% of all branches
61.031494851 seconds time elapsed
Como usé -a en ambas versiones, esperaba obtener aproximadamente los mismos resultados.
Pero con el sueño,
cpu-clock is 2.5 times what you get with the -p version,
context-switches are double what you get with the -p version
and the other values are more or less the same
Entonces 2 preguntas,
(1) which set of results do I believe?
and
(2) how can there be more stalled-cycles-frontend than cycles in the sleep version?