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?
linux
performance
monitoring
central-processing-unit
strace
bajafresh4life
sumber
sumber
Jawaban:
Saya pikir strace dengan
-c
bendera mungkin yang paling dekat yang saya tahu. Jika Anda belum menggunakan-c
bendera, coba ini: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-C
untuk menghentikan pengumpulan data Anda dan output hasilnya. Ini akan menghasilkan sesuatu seperti ini: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.
sumber
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
sumber
Jenis switch strace yang cenderung saya gunakan adalah ini.
strace -ffttT -p pid -o /tmp/strace.out
Contoh dari ini akan terlihat seperti,
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.
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.
sumber