Linux'ta sistem CPU / sistem çağrılarını izleyin


9

Ben (vmstat bakarak belirlendiği gibi) sistem CPU zaman çok yiyor birkaç süreç var. Ne tür bir sistem çağrısı yapıldığını bulmanın kolay bir yolu var mı?

Strace olduğunu biliyorum, ama daha hızlı ve daha kolay bir yol var mı? Sistem çağrıları için "üst" gibi bir şey var mı?


1
strace çözümdür.
Warner

Yanıtlar:


15

Sanırım -cbayrakla ilgili strace muhtemelen bildiğim en yakın şey. Eğer kullanmadıysanız -cbayrak, şunu deneyin:

$  sudo strace -c -p 12345

Burada 12345, söz konusu işlemin İşlem Kimliği (PID) 'dir. Bir işlemi izlemenin ek yük getirdiğini unutmayın, bu nedenle izlerken işlem daha yavaş çalışacaktır.

Ne kadar uzun süre veri toplamak istediğinizi çalıştırdıktan sonra Ctrl-C, veri toplama işlemini durdurmak ve sonuçların çıktısını almak için düğmesine basın . Bunun gibi bir şey üretecek:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 31.88    0.001738         145        12           futex
 16.79    0.000915          11        80           tgkill
 12.36    0.000674          34        20           read
  9.76    0.000532         266         2           statfs
  8.42    0.000459          13        35           time
  4.38    0.000239           6        40           gettimeofday
  3.65    0.000199           4        48           sigprocmask
  2.94    0.000160          18         9           open
  2.88    0.000157          12        13           stat64
  1.32    0.000072           9         8           munmap
  0.90    0.000049           6         8           mmap2
  0.88    0.000048           3        14         7 sigreturn
  0.79    0.000043           5         9           close
  0.77    0.000042           4        10           rt_sigprocmask
  0.64    0.000035           3        12           setitimer
  0.55    0.000030           5         6         6 rt_sigsuspend
  0.53    0.000029           4         8           fstat64
  0.29    0.000016           8         2           setresuid32
  0.13    0.000007           4         2           _llseek
  0.09    0.000005           3         2           prctl
  0.04    0.000002           2         1           geteuid32
------ ----------- ----------- --------- --------- ----------------
100.00    0.005451                   341        13 total

Gördüğünüz gibi, bu, uygulama tarafından yapılan, toplam süreye göre sıralanmış ve her bir çağrı için ortalama süre ve her bir sistem çağrısı için çağrı sayısı dahil olmak üzere tüm sistem çağrılarının dökümüdür. Onları farklı sıralamak istiyorsanız, birkaç seçenek olduğu için strace için man sayfasına bakın.


2
Lanet olsun, boşuna muteks! yumruk sallıyor
Gaius

2

Belki de oprofile veya daha yeni çekirdekler için örnekleme profillerinden birini deneyin perf. Eğer şanslıysanız, "mükemmel üst" tam olarak ne istediğinizi söyleyebilir. Bazı örnekler için buraya bakın


2

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.