Booten und Debuggen des Kernels für Leistung

Booten und Debuggen des Kernels für Leistung

Ich versuche, einige Leistungstests durchzuführen und habe herausgefunden, dass der meiste Overhead im Kernel (kernel.kallsyms) liegt.

Ich brauche also einen Kernel mit Debugsymbolen und extrahiertem vmlinuz, um den Leistungsbericht mit der Option -k auszuführen.

Ich habe das Debugging-Kernelpaket von ddebs installiert, bin mir aber nicht sicher, wie ich den Kernel booten soll. Ich führe update-grub2 aus, aber der Kernel erscheint nicht in der Liste.

Ich habe das Paket überprüft und festgestellt, dass der Kernel in /usr/lib/debug installiert ist – dort befinden sich seine Bibliotheken (libc usw.) und Kernelmodule.

Jetzt kann ich keine Möglichkeit finden, den Kernel beim Booten zu laden.

Ich schätze, ich muss den Kernel mit Debugsymbolen ausführen, damit die Leistung mit der Option -k richtig funktioniert – sonst würden die Speicheradressen nicht richtig zugeordnet, richtig?

Ich führe perf -k zum Kernel aus, ohne denselben auszuführen, aber ich bin nicht sicher, ob das richtig ist.

Antwort1

Ok, eigentlich ist es kein Problem, die Leistung gegen den Debug-Kernel auszuführen, wenn nur der normale Kernel geladen ist.

Übrigens wurde der Kernel mit diesem Tutorial für Systemtap installiert: https://wiki.ubuntu.com/Kernel/Systemtap

Mir sind ein paar Dinge aufgefallen – der Debug-Kernel ist bereits extrahiert – der Name ist vmlinux, nicht vmlinuz, und er ist groß …

das zweite ist, dass ich beim Laden in gdb genau dieselbe Nummer sehe und dass die Build-Zeit dieselbe ist wie bei meinem geladenen Nicht-Debug-Kernel:

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

und der GDB (basierend aufDas:

(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>}

Ich meine, Teil Nr. 94 … ist dasselbe.

Wenn ich die aufgezeichnete Leistung mit folgendem ausführe:

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

es funktioniert tatsächlich gut – ich sehe, wie die Kernelsymbole in echte Funktionen übersetzt werden (-g ist nur für 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 

jemand hat mir gesagt, dass ich es auf jeden Fall sehen würde, wenn der gebootete Kernel und der von Perf verwendete Kernel nicht übereinstimmen würden – die Funktionen für die Kernel-Samples würden keinen Sinn ergeben (nur einige zufällige Daten statt des richtigen Namens).

verwandte Informationen