Monitor sistem CPU / panggilan sistem di Linux

9

Saya punya beberapa proses yang memakan banyak waktu sistem CPU (sebagaimana ditentukan dengan melihat vmstat). Apakah ada cara mudah untuk mengetahui panggilan sistem apa yang sedang dibuat?

Saya tahu ada strace, tetapi apakah ada cara yang lebih cepat dan lebih mudah? Apakah ada sesuatu seperti "top" untuk panggilan sistem?

bajafresh4life
sumber
1
strace adalah solusinya.
Warner

Jawaban:

15

Saya pikir strace dengan -cbendera mungkin yang paling dekat yang saya tahu. Jika Anda belum menggunakan -cbendera, coba ini:

$  sudo strace -c -p 12345

Di mana 12345 adalah ID Proses (PID) dari proses yang dimaksud. Perhatikan bahwa memindah proses tidak menambah overhead tambahan, jadi saat Anda melacaknya, proses akan berjalan lebih lambat.

Setelah menjalankan itu untuk berapa lama Anda ingin mengumpulkan data, tekan Ctrl-Cuntuk menghentikan pengumpulan data Anda dan output hasilnya. Ini akan menghasilkan sesuatu seperti ini:

% 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

Seperti yang Anda lihat, ini adalah rincian dari semua panggilan sistem yang dibuat oleh aplikasi, diurutkan berdasarkan total waktu, dan termasuk waktu rata-rata per panggilan dan jumlah panggilan untuk setiap syscall. Jika Anda ingin mengurutkannya secara berbeda, lihat halaman manual untuk strace, karena ada beberapa opsi.

Christopher Cashell
sumber
2
Sialan kau, mutex yang sia-sia! getar kepalan tangan
Gayus
2

Mungkin mencoba salah satu profiler pengambilan sampel, seperti oprofile, atau untuk kernel yang lebih baru, perf. Jika Anda beruntung, "perf top" mungkin memberi tahu Anda dengan tepat apa yang Anda inginkan. Lihat di sini untuk beberapa contoh

janneb
sumber
2

Jenis switch strace yang cenderung saya gunakan adalah ini.

strace -ffttT -p pid -o /tmp/strace.out

Contoh dari ini akan terlihat seperti,

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>

Anda melihat perbedaan waktu di sisi kanan panggilan sistem yang menunjukkan berapa banyak waktu yang diperlukan untuk beralih dari satu panggilan sistem ke yang lain.

Ini akan menangkap Anda perbedaan waktu antara panggilan sistem. Jadi, ketika Anda melihat bahwa panggilan sistem memiliki beberapa detik kesenjangan dengan panggilan sistem berikutnya, maka ada beberapa kebisingan.

Metode lain adalah dengan memasukkannya dengan gcore. Namun, itu membutuhkan sedikit pengalaman menavigasi melalui gdb.

Tetapi, jika utas itu adalah utas kernel, maka Anda tidak dapat mengencangkan atau mengeluarkannya. Dalam hal ini, kita harus menggunakan sesuatu yang lebih kompleks. Dalam kernel RHEL5, kami menggunakan oprofile. Di RHEL6, kami menggunakan perf. Saya lebih suka perf daripada oprofile. Data perf dapat dikumpulkan dengan format seperti grafik yang menunjukkan panggilan sistem di mana persentase CPU maksimum digunakan.

Dengan tes perf, saya melihat ini.

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   

Ini menunjukkan fungsi kernel di mana 38% waktu CPU dihabiskan. Sekarang, kita dapat memeriksa fungsi dan melihat apa yang dilakukannya dan apa yang seharusnya dilakukan.

Dengan beberapa contoh, tidak terlalu sulit.

Soham Chakraborty
sumber