Estou tentando fazer alguns testes de desempenho, descobri que a maior parte da sobrecarga está dentro do kernel (kernel.kallsyms).
Então eu preciso do kernel com símbolos de depuração e extraído do vmlinuz para executar o relatório de desempenho com a opção -k.
Instalei o pacote de depuração do kernel do ddebs, mas não tenho certeza de como inicializar o kernel. Eu executo update-grub2 mas o kernel não apareceu na lista.
Eu verifiquei o pacote e descobri que o kernel está instalado dentro de /usr/lib/debug - existem suas bibliotecas (libc etc) e módulos do kernel.
Agora não consigo encontrar uma maneira de carregar o kernel no momento da inicialização.
Acho que preciso executar o kernel com símbolos de depuração para que o desempenho funcione corretamente com a opção -k - caso contrário, os endereços de memória não seriam mapeados corretamente - certo?
Eu executo o perf -k para o kernel sem executar o mesmo, mas não tenho certeza se isso está correto.
Responder1
Ok, na verdade não há problema em executar o desempenho no kernel de depuração quando apenas o kernel normal é carregado.
A propósito, o kernel foi instalado com este tutorial para systemtap: https://wiki.ubuntu.com/Kernel/Systemtap
Notei algumas coisas - o kernel de depuração já foi extraído - o nome é vmlinux, não vmlinuz e é grande.
a segunda coisa quando eu carrego no gdb vejo exatamente o mesmo número e o tempo de compilação é o mesmo do meu kernel não depurado carregado:
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
e o gdb (baseado emesse:
(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>}
Quero dizer, a parte 94... é a mesma.
Quando executo o desempenho gravado com:
perf report -g -k /usr/lib/debug/boot/vmlinux-3.13.0-55-generic
na verdade funciona bem - vejo os símbolos do kernel traduzidos para funções reais (-g é apenas para calltrace):
- 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
alguém me disse que quando o kernel inicializasse e o kernel usado pelo perf não se alinhasse, eu definitivamente veria isso - as funções para amostras do kernel não fariam sentido (apenas alguns dados aleatórios em vez do nome real).