Loại công tắc strace mà tôi có xu hướng sử dụng là cái này.
strace -ffttT -p pid -o /tmp/strace.out
Một ví dụ về điều này sẽ giống như,
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>
Bạn thấy sự khác biệt về thời gian ở phía bên phải của cuộc gọi hệ thống cho biết thời gian cần thiết để chuyển từ cuộc gọi hệ thống này sang cuộc gọi khác.
Nó sẽ bắt bạn chênh lệch múi giờ giữa các cuộc gọi hệ thống. Vì vậy, khi bạn thấy rằng một cuộc gọi hệ thống có khoảng cách khá vài giây với cuộc gọi hệ thống tiếp theo, thì nó sẽ gây ra một số tiếng ồn.
Một phương pháp khác là coredump nó với gcore. Tuy nhiên, điều đó đòi hỏi một chút kinh nghiệm điều hướng qua gdb.
Nhưng, nếu luồng là một luồng nhân, thì bạn không thể thoát hoặc bỏ qua nó. Trong trường hợp đó, chúng ta phải sử dụng một cái gì đó phức tạp hơn. Trong kernel RHEL5, chúng tôi sử dụng oprofile. Trong RHEL6, chúng tôi sử dụng perf. Tôi thích sự hoàn hảo hơn oprofile. Dữ liệu hoàn hảo có thể được thu thập với biểu đồ như định dạng hiển thị cuộc gọi hệ thống trong đó phần trăm tối đa của CPU đang được sử dụng.
Với một thử nghiệm hoàn hảo, tôi thấy điều này.
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
Nó cho thấy chức năng kernel trong đó 38% thời gian CPU đang được sử dụng. Bây giờ, chúng ta có thể kiểm tra chức năng và xem nó đang làm gì và nó phải làm gì.
Với một vài ví dụ, nó không khó lắm.