Я пытаюсь провести некоторые тесты производительности и обнаружил, что большая часть накладных расходов приходится на ядро (kernel.kallsyms).
Поэтому мне нужно ядро с отладочными символами и извлеченным vmlinuz, чтобы запустить отчет о производительности с опцией -k.
Я установил отладочный пакет ядра из ddebs, но не уверен, как загрузить ядро. Я запустил update-grub2, но ядро не появилось в списке..
Я проверил пакет и обнаружил, что ядро установлено внутри /usr/lib/debug - там находятся его библиотеки (libc и т. д.) и модули ядра.
Теперь я не могу найти способ загрузить ядро во время загрузки системы.
Полагаю, мне нужно запустить ядро с отладочными символами, чтобы perf работал правильно с опцией -k. В противном случае адреса памяти не будут правильно отображены, верно?
Я запускаю perf -k для ядра, не запуская то же самое, но я не уверен, правильно ли это..
решение1
Хорошо, на самом деле все нормально, если запустить perf на отладочном ядре, когда загружено только обычное ядро.
Кстати, ядро было установлено с помощью этого руководства для systemtap: https://wiki.ubuntu.com/Kernel/Systemtap
Я заметил несколько вещей: отладочное ядро уже извлечено, его имя — vmlinux, а не vmlinuz, и оно большое...
во-вторых, когда я загружаю его в gdb, я вижу точно такое же число и время сборки, как и у моего загруженного неотладочного ядра:
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
и gdb (на основеэтот:
(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>}
Я имею в виду деталь №94... она такая же.
Когда я запускаю записанную производительность с помощью:
perf report -g -k /usr/lib/debug/boot/vmlinux-3.13.0-55-generic
на самом деле это работает нормально - я вижу символы ядра, преобразованные в реальные функции (-g - только для трассировки вызовов):
- 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
кто-то сказал мне, что когда ядро загружается и ядро, используемое perf, не выровняется, то я определенно это увижу — функции для выборок ядра не будут иметь смысла (просто какие-то случайные данные вместо настоящего имени).