2012-08-26 8 views
5

¿Hay alguna manera de leer los contadores de rendimiento periódicamente en Linux?Lea los contadores de rendimiento periódicamente en Linux

Algo así como perf stat con la capacidad de probar cada X ciclos es lo que estoy buscando.

Básicamente me gustaría poder leer el contador de instrucciones (número de instrucciones ejecutadas) cada X cantidad de ciclos de CPU para algún programa.

Respuesta

5

Parece que la herramienta de ejecución en Linux funciona registrando un evento cuando los contadores alcanzan un valor específico, en lugar de muestrear a intervalos regulares. El perf record -e cycles,instructions -c 10000 almacena un evento cada 10000 ciclos y cada 10000 instrucciones. Se puede ejecutar contra un nuevo comando o un pid existente. Registra a perf.data en el directorio actual.

Analizar los datos es otro asunto. Usando perf script que se pone bastante estrecha:

ls 16040 2152149.005813: cycles:   c113a068 ([kernel.kallsyms]) 
ls 16040 2152149.005820: cycles:   c1576af0 ([kernel.kallsyms]) 
ls 16040 2152149.005827: cycles:   c10ed6aa ([kernel.kallsyms]) 
ls 16040 2152149.005831: instructions:   c1104b30 ([kernel.kallsyms]) 
ls 16040 2152149.005835: cycles:   c11777c1 ([kernel.kallsyms]) 
ls 16040 2152149.005842: cycles:   c10702a8 ([kernel.kallsyms]) 
... 

Usted tiene que escribir un guión que lleva un montón de líneas de producción y que cuenta el número de ciclos '' y eventos 'instrucciones' en ese conjunto. Puede ajustar la resolución cambiando el parámetro -c 10000 en el comando de grabación.

He verificado el análisis ejecutando perf stat y perf record contra ls /. Stat reportó 2 634 205 ciclos, 1 725 255 instrucciones, mientras que la secuencia de comandos tuvo 410 eventos de ciclos y 189 eventos de instrucciones. Cuanto menor sea el valor de -c, más gastos adicionales parece haber en la lectura de ciclos.

También hay una opción de -F en perf record, que toma muestras a intervalos regulares. Sin embargo, no pude encontrar una manera de recuperar los valores del contador al usar esta opción.

Editar:perf stat aparentemente también funciona en pids, y captura datos hasta que se presiona ctrl-c. Debería ser bastante fácil modificar la fuente para que siempre capture durante N segundos y luego ejecutarla en un bucle.

+0

Cómo hacer ¿ejecutas el script de perf? He intentado ejecutar 'perf record -e cycles, instrucciones -c 10000 -R ls;' 'perf script', pero aparece el error ** Fatal: no event_list! **. – Ben

+0

@Skim extraño, para mí solo escribiendo 'perf script' works. ¿Funciona 'perf informe', es decir, el archivo perf.data grabado está bien? – jpa

+0

Resulta que estaba usando una versión anterior de perf (2.6). perf 3.0.38 funciona como usted indicó anteriormente. Volveré y te votaré cuando tenga suficiente representante. Gracias! – Ben

0

Puede modificar fácilmente la estadística de rendimiento para hacer esto.

De hecho, tengo una modificación crudo ya ejecutados, y estaría encantado de compartir este cambio con ustedes ..

Los cambios que he realizado son en su mayoría en la función run_perf_stat en el tiempo (! Hecho) de bucle

Simplemente mueva las líneas debajo del while (! Done) {sleep (1);} hacia el interior del loop y cambie el sleep a un nanosleep con el período de tiempo que desea muestrear en

Eso debería hacer perf la salida en STDOUT (o STDERR)

Si desea almacenar estos valores, le sugiero que cree una matriz bidimensional de tipo struct stats, actualícela con cada muestra y escriba periódicamente en un archivo

4

Buenas noticias: en el siguiente kernel (Linux 3.9), perf stat tendrá una opción -I msecs para imprimir deltas de eventos en intervalos de tiempo regulares.

https://patchwork.kernel.org/patch/2004891/

$ perf stat -I 1000 -e cycles noploop 10 
noploop for 10 seconds 
1.000086918   2385155642 cycles     # 0.000 GHz 
2.000267937   2392279774 cycles     # 0.000 GHz 
3.000385400   2390971450 cycles     # 0.000 GHz 
4.000504408   2390996752 cycles     # 0.000 GHz 
5.000626878   2390853097 cycles     # 0.000 GHz 

http://man7.org/linux/man-pages/man1/perf-stat.1.html

-I msecs, --interval-print msecs 

deltas de la cantidad de copias cada N milisegundos (mínimo: 10 ms)

+0

Gracias por el aviso. – Ben

+0

La opción es '-I 1000' para la impresión de 1 segundo: http://man7.org/linux/man-pages/man1/perf-stat.1.html -' -I msecs, --interval-print msecs' "Imprimir deltas contados cada N milisegundos (mínimo: 10 ms)" – osgx

Cuestiones relacionadas