몇 가지 성능 테스트를 하려고 하는데 대부분의 오버헤드가 커널(kernel.kallsyms) 내부에 있다는 것을 알게 되었습니다.
따라서 -k 옵션을 사용하여 성능 보고서를 실행하려면 디버깅 기호가 포함된 커널과 추출된 vmlinuz가 필요합니다.
ddebs에서 디버깅 커널 패키지를 설치했지만 커널을 부팅하는 방법을 잘 모르겠습니다. update-grub2를 실행했지만 커널이 목록에 나타나지 않았습니다.
패키지를 확인해보니 커널이 /usr/lib/debug 안에 설치되어 있는 것으로 나타났습니다. 해당 라이브러리(libc 등)와 커널 모듈이 있습니다.
이제 부팅 시 커널을 로드하는 방법을 찾을 수 없습니다.
-k 옵션을 사용하여 성능이 제대로 작동하려면 디버깅 기호를 사용하여 커널을 실행해야 한다고 생각합니다. 그렇지 않으면 메모리 주소가 제대로 매핑되지 않습니다. 그렇죠?
동일한 것을 실행하지 않고 커널에 perf -k를 실행했지만 이것이 올바른지 확실하지 않습니다.
답변1
좋습니다. 실제로는 일반 커널만 로드되었을 때 디버그 커널에 대해 성능을 실행하는 것이 좋습니다.
그런데 커널은 systemtap에 대한 이 튜토리얼과 함께 설치되었습니다: https://wiki.ubuntu.com/Kernel/Systemtap
몇 가지 사항을 발견했습니다. 디버그 커널은 이미 추출되었습니다. 이름은 vmlinuz가 아니라 vmlinux이고 크기가 큽니다.
두 번째로 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가 사용하는 커널이 정렬되지 않을 때 분명히 그것을 보게 될 것이라고 말했습니다. 커널 샘플에 대한 기능은 의미가 없을 것입니다(실제 이름 대신 일부 임의의 데이터일 뿐입니다).