Тип стринг-переключателей, который я обычно использую, таков.
strace -ffttT -p pid -o /tmp/strace.out
Пример этого будет выглядеть так:
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>
Вы видите разницу во времени с правой стороны системного вызова, показывающую, сколько времени потребовалось для перехода от одного системного вызова к другому.
Он поймает разницу во времени между системными вызовами. Таким образом, когда вы видите, что системный вызов имеет разрыв в несколько секунд со следующим системным вызовом, тогда он создает некоторый шум.
Еще один метод - установить ядро в gcore. Однако это требует небольшого опыта навигации по GDB.
Но, если этот поток является потоком ядра, вы не можете связать его или выполнить дамп. В этом случае мы должны использовать что-то более сложное. В ядре RHEL5 мы используем oprofile. В RHEL6 мы используем перф. Я предпочитаю перф, а не опрофиль. Данные о производительности можно собирать в графическом формате, показывающем системный вызов, в котором используется максимальный процент использования ЦП.
С тестовым перфом я вижу это.
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
Он показывает функцию ядра, на которую тратится 38% процессорного времени. Теперь мы можем проверить функцию и посмотреть, что она делает и что она должна делать.
С несколькими примерами это не так уж сложно.