Kullanmaya meyilli olduğum strace anahtarların türü şudur.
strace -ffttT -p pid -o /tmp/strace.out
Bunun bir örneği,
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>
Sistem çağrısının sağ tarafında, bir sistem çağrısından diğerine ne kadar zaman geçtiğini gösteren zaman farkını görürsünüz.
Sistem aramaları arasındaki zaman farkını yakalar. Yani, bir sistem çağrısının bir sonraki sistem çağrısı ile birkaç saniye boşluk olduğunu gördüğünüzde, orada biraz gürültü çıkarıyor.
Başka bir yöntem de gcore ile karıştırmaktır. Ancak, bu gdb'de gezinmek için biraz deneyim gerektirir.
Ancak, iş parçacığı bir çekirdek iş parçacığıysa, onu sıkıştıramaz veya koyamazsınız. Bu durumda, daha karmaşık bir şey kullanmalıyız. RHEL5 çekirdeğinde oprofile kullanıyoruz. RHEL6'da perf kullanıyoruz. Oprofile göre perf tercih ederim. Mükemmel veriler, maksimum CPU yüzdesinin kullanıldığı sistem çağrısını gösteren grafik benzeri formatta toplanabilir.
Bir test mükemmelliği ile, bunu görüyorum.
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 CPU süresinin geçtiği çekirdek işlevini gösterir. Şimdi, işlevi kontrol edebilir ve ne yaptığını ve ne yapması gerektiğini görebiliriz.
Birkaç örnekle, o kadar zor değil.