arrancando el kernel de depuración para perf

arrancando el kernel de depuración para perf

Estoy intentando hacer algunas pruebas de rendimiento y descubrí que la mayor parte de la sobrecarga está dentro del kernel (kernel.kallsyms).

Entonces necesito un kernel con símbolos de depuración y vmlinuz extraído para poder ejecutar el informe de rendimiento con la opción -k.

Instalé el paquete de depuración del kernel desde ddebs pero no estoy seguro de cómo iniciar el kernel. Ejecuto update-grub2 pero el kernel no apareció en la lista.

Revisé el paquete y descubrí que el kernel está instalado dentro de /usr/lib/debug; allí están sus bibliotecas (libc, etc.) y módulos del kernel.

Ahora no puedo encontrar alguna manera de cargar el kernel en el momento del arranque.

Supongo que necesito ejecutar el kernel con símbolos de depuración para que el rendimiento funcione correctamente con la opción -k; de lo contrario, las direcciones de memoria no se asignarían correctamente, ¿verdad?

Ejecuto perf -k en el kernel sin ejecutar el mismo, pero no estoy seguro de si es correcto.

Respuesta1

Ok, en realidad está bien ejecutar el rendimiento contra el kernel de depuración cuando solo se carga el kernel normal.

Por cierto, el kernel se instaló con este tutorial para systemtap: https://wiki.ubuntu.com/Kernel/Systemtap

Noté algunas cosas: el kernel de depuración ya está extraído; el nombre es vmlinux, no vmlinuz, y es grande.

La segunda cosa, cuando lo cargo en gdb, veo exactamente el mismo número y el tiempo de compilación es el mismo que el de mi kernel sin depuración cargado:

uname -a
Linux delo 3.13.0-55-generic #94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

y el BGF (basado eneste:

(gdb) print init_uts_ns.name
$1 = {sysname = "Linux", '\000' <repeats 59 times>, nodename = "(none)", '\000' <repeats 58 times>, 
release = "3.13.0-55-generic", '\000' <repeats 47 times>, version = 
"#94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015", '\000' <repeats 21 times>, 
machine = "x86_64", '\000' <repeats 58 times>, domainname = "(none)", '\000' <repeats 58 times>}

Me refiero a la parte #94... es la misma.

Cuando ejecuto el rendimiento grabado con:

perf report -g -k /usr/lib/debug/boot/vmlinux-3.13.0-55-generic

en realidad funciona bien: veo los símbolos del núcleo traducidos a funciones reales (-g es solo para el seguimiento de llamadas):

- 3,18%  app  [kernel.kallsyms]  [k] copy_user_enhanced_fast_string
 - copy_user_enhanced_fast_string
  - 98,98% system_call 
     -syscall 
       68,60% 0xbeef0100
       31,40% 0xbeee0100 
  + 0,54% generic_file_aio_read 

alguien me dijo que cuando el kernel arrancara y el kernel usado por perf no se alineara, definitivamente lo vería: las funciones para las muestras del kernel no tendrían sentido (solo algunos datos aleatorios en lugar del nombre real).

información relacionada