Тип тягових вимикачів, якими я схильний користуватися, це такий.
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 ми використовуємо perf. Я віддаю перевагу perf над oprofile. Дані Perf можуть бути зібрані у графічному форматі, що показує системний виклик, де використовується максимальний відсоток процесора.
З тестовим парфумом я це бачу.
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% часу процесора. Тепер ми можемо перевірити функцію і побачити, що вона робить і що вона повинна робити.
Маючи кілька прикладів, це не так вже й важко.