Oto typ przełączników strace, których zwykle używam.
strace -ffttT -p pid -o /tmp/strace.out
Przykładem może być:
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>
Różnica czasu widoczna jest po prawej stronie wywołania systemowego, pokazując ile czasu zajęło przejście z jednego wywołania systemowego do drugiego.
Złapie różnicę czasu między wywołaniami systemowymi. Tak więc, gdy zobaczysz, że wywołanie systemowe ma kilka sekund przerwy w stosunku do następnego wywołania systemowego, wtedy robi hałas.
Inną metodą jest poradzenie sobie z gcore. Jednak wymaga to trochę doświadczenia w poruszaniu się po gdb.
Ale jeśli wątek jest wątkiem jądra, nie można go śledzić ani zrzucać. W takim przypadku musimy użyć czegoś bardziej złożonego. W jądrze RHEL5 używamy oprofile. W RHEL6 używamy perf. Wolę perf niż oprofile. Dane Perf mogą być gromadzone w formacie wykresu pokazującym wywołanie systemowe, w którym wykorzystywany jest maksymalny procent procesora.
Widzę to z testową wydajnością.
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
Pokazuje funkcję jądra, w której spędza się 38% czasu procesora. Teraz możemy sprawdzić funkcję i zobaczyć, co robi i co ma robić.
Z kilkoma przykładami nie jest to takie trudne.