Die Art von Strace-Schaltern, die ich normalerweise benutze, ist diese.
strace -ffttT -p pid -o /tmp/strace.out
Ein Beispiel dafür würde aussehen wie:
19:35:57.485493 mprotect(0x7f35e7472000, 16384, PROT_READ) = 0 <0.000037>
19:35:57.485599 mprotect(0x7f35e7692000, 4096, PROT_READ) = 0 <0.000030>
19:35:57.485697 mprotect(0x7f35e78b7000, 4096, PROT_READ) = 0 <0.000030>
19:35:57.485782 munmap(0x7f35e7896000, 129588) = 0 <0.000037>
19:35:57.485875 set_tid_address(0x7f35e78949d0) = 10730 <0.000029>
19:35:57.485960 set_robust_list(0x7f35e78949e0, 0x18) = 0 <0.000024>
19:35:57.486048 futex(0x7fff8f58628c, FUTEX_WAKE_PRIVATE, 1) = 0 <0.000025>
19:35:57.486131 futex(0x7fff8f58628c, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, NULL, 7f35e7894700) = -1 EAGAIN (Resource temporarily unavailable) <0.000024>
Der Zeitunterschied auf der rechten Seite des Systemaufrufs zeigt an, wie lange es gedauert hat, von einem Systemaufruf zum nächsten zu wechseln.
Sie erkennen den Zeitunterschied zwischen den Systemaufrufen. Wenn Sie also sehen, dass ein Systemaufruf einige Sekunden Abstand zum nächsten Systemaufruf hat, macht er dort ein gewisses Rauschen.
Eine andere Methode besteht darin, es mit gcore zu entleeren. Dies erfordert jedoch ein wenig Erfahrung in der Navigation durch GDB.
Wenn es sich bei dem Thread jedoch um einen Kernel-Thread handelt, können Sie ihn nicht straffen oder entleeren. In diesem Fall müssen wir etwas Komplexeres verwenden. Im RHEL5-Kernel verwenden wir oprofile. In RHEL6 verwenden wir perf. Ich bevorzuge Perf gegenüber Oprofile. Perf-Daten können mit einem grafischen Format erfasst werden, das den Systemaufruf zeigt, bei dem der maximale Prozentsatz der CPU verwendet wird.
Mit einer Testleistung sehe ich das.
38.06% swapper [kernel.kallsyms] [k] mwait_idle_with_hints ↑
29.45% swapper [kernel.kallsyms] [k] read_hpet
4.90% swapper [kernel.kallsyms] [k] acpi_os_read_port ▒
4.74% swapper [kernel.kallsyms] [k] hpet_next_event
Es zeigt die Kernelfunktion, in der 38% der CPU-Zeit verbracht werden. Jetzt können wir die Funktion überprüfen und sehen, was sie tut und was sie tun soll.
Mit ein paar Beispielen ist es nicht so schwer.