Estoy perplejo, leí el tutorial de rendimiento y estoy tratando de hacer una prueba simple más allá de "perf stat" que funciona. Sin embargo, el registro de rendimiento no funciona o la anotación de rendimiento no muestra muestras registradas. rendimiento en ejecución
Por ejemplo (estoy ejecutando sudo porque sin él obtengo un montón de errores que publicaré al final):
sudo perf record -e cycles,instructions,cache-misses -a -c 1 ./FooExe
[ perf record: Woken up 4 times to write data ] [ perf record: Captured and wrote 1.794 MB perf.data (~78393 samples) ].
sudo perf report -D -i perf.data |grep RECORD_SAMPLE |wc -l Failed to open /tmp/perf-23796.map, continuing without symbols 20486.
sudo perf annotate -d ./FooExe
the perf.data file has no samples! Press any key
Así que eso es todo lo que llego. Traté de reconstruir el rendimiento de mi sistema desde la fuente, pero eso tampoco pareció ayudar.
Estoy usando Ubuntu 14.04 kernel 3.19.0-49-generic. Esto está en la CPU Intel i7 I4510U. Me aseguré de compilar mi programa con símbolos, pero obtengo los mismos resultados independientemente de la aplicación que intente perfilar.
-- si ejecuto sin sudo :
WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted, check /proc/sys/kernel/kptr_restrict. Samples in kernel functions may not be resolved if a suitable vmlinux file is not found in the buildid cache or in the vmlinux path. Samples in kernel modules won't be resolved at all. If some relocation was applied (eg kexec) symbols may be misresolved even with a suitable vmlinux or kallsyms file. Cannot read kernel map Error: You may not have permission to collect system-wide stats. Consider tweaking /proc/sys/kernel/perf_event_paranoid: -1 - Not paranoid at all 0 - Disallow raw tracepoint access for unpriv 1 - Disallow cpu events for unpriv 2 - Disallow kernel profiling for unprivAcabo de probar tu comando. El problema fue que usó -a para perfilar todos los procesos en todo el sistema, por lo que nunca se ejecutó ./FooExe . Puede confirmar esto con strace -f perf ... ./FooExe , y tenga en cuenta la falta de una llamada al sistema execve . Y también el hecho de que vuelve al instante, incluso si FooExe debería haber tardado varios segundos.
Aquí hay un ejemplo de grabación de muestras para un comando awk de ciclo ocupado:
perf record -e cycles,instructions,cache-misses awk 'BEGIN{for(i=0;i<40000000;i++){}}' Ahora funciona perf report . No necesita especificar el ejecutable para el comando de report , porque perf.data solo tiene datos para un ejecutable.
Esto funciona de la misma manera con el envoltorio ocperf.py , pero puede registrar eventos para eventos más específicos de uarch usando nombres simbólicos (en lugar de buscar códigos y argumentos numéricos en -e ):
$ ocperf.py record -e cycles,cache-misses,uops_dispatched_port.port_0 awk 'BEGIN{for(i=0;i<40000000;i++){}}' perf record -e cycles,cache-misses,cpu/event=0xa1,umask=0x1,name=uops_dispatched_port_port_0,period=2000003/ awk 'BEGIN{for(i=0;i<40000000;i++){}}' (warning lines about kernel symbols) [ perf record: Woken up 2 times to write data ] [ perf record: Captured and wrote 0.352 MB perf.data (7819 samples) $ ocperf.py report