Saya ingin secara terprogram [dalam C] menghitung% penggunaan CPU untuk ID proses tertentu di Linux.
Bagaimana kita bisa mendapatkan% penggunaan CPU waktu nyata untuk proses tertentu?
Untuk membuatnya lebih jelas:
- Saya harus dapat menentukan penggunaan CPU untuk proses atau proses yang disediakan.
- Proses tidak perlu proses anak.
- Saya ingin solusi dalam bahasa 'C'.
Jawaban:
Anda perlu mengurai data dari
/proc/<PID>/stat
. Ini adalah beberapa kolom pertama (dariDocumentation/filesystems/proc.txt
dalam sumber kernel Anda):Anda mungkin mengejar
utime
dan / ataustime
. Anda juga perlu membacacpu
baris dari/proc/stat
, yang terlihat seperti:Ini memberi tahu Anda waktu CPU kumulatif yang telah digunakan dalam berbagai kategori, dalam satuan jiffies. Anda perlu menjumlahkan nilai pada garis ini untuk mendapatkan
time_total
ukuran.Baca baik
utime
danstime
untuk proses Anda tertarik, dan membacatime_total
dari/proc/stat
. Kemudian tidur sebentar, dan baca semuanya lagi. Anda sekarang dapat menghitung penggunaan CPU dari proses selama waktu pengambilan sampel, dengan:Masuk akal?
sumber
/proc/stat
memberi tahu Anda berapa banyak jiff yang telah dieksekusi CPU secara total, dan/proc/<PID>/stat
memberi tahu Anda berapa banyak jiffy yang telah dieksekusi oleh a proses tunggal.man proc
adalah teman Anda (cari/proc/[pid]/stat
)/proc
sistem file semu: pengajaran tentang fungsi akses sistem file C standar sepertifopen()
danscanf()
tidak penting.getrusage () dapat membantu Anda dalam menentukan penggunaan proses saat ini atau turunannya
Pembaruan: Saya tidak dapat mengingat API. Tapi semua detail ada di / proc / PID / stat, jadi kalau bisa kita parsing, kita bisa mendapatkan persentasenya.
EDIT: Karena CPU% tidak langsung menghitung, Anda dapat menggunakan jenis sampel di sini. Baca waktu dan waktu untuk PID pada suatu titik waktu dan baca kembali nilai yang sama setelah 1 detik. Temukan selisihnya dan bagi dengan ratus. Anda akan mendapatkan pemanfaatan untuk proses itu selama satu detik terakhir.
(mungkin menjadi lebih kompleks jika ada banyak prosesor)
sumber
Langkah mudah untuk pemula seperti saya:
/proc/stat
untuk mendapatkantotal_cpu_usage1
./proc/pid/stat
manapid
PID dari proses yang Anda inginkan untuk mengetahui penggunaan CPU, seperti ini:usertime
dansystemtime
dan mendapatkanproc_times1
total_cpu_usage2
danproc_times2
Rumusnya adalah:
Anda bisa mendapatkan jumlah CPU dari
/proc/cpuinfo
.sumber
#include <unistd.h>
dan beri nama metode iniint nb = sysconf(_SC_NPROCESSORS_ONLN);
Saya menulis dua fungsi C kecil berdasarkan jawaban cafs untuk menghitung penggunaan cpu pengguna + kernel dari suatu proses: https://github.com/fho/code_snippets/blob/master/c/getusage.c
sumber
Anda dapat membaca halaman manual proc untuk lebih jelasnya, tetapi secara ringkas anda dapat membaca / proc / [number] / stat untuk mendapatkan informasi tentang suatu proses. Ini juga digunakan oleh perintah 'ps'.
Semua bidang dan penentu format scanf-nya didokumentasikan di proc manpag e.
Berikut adalah beberapa informasi dari halaman manual yang disalin (cukup panjang):
sumber
ps aux
lebih baik :)Lihatlah perintah "pidstat", terdengar seperti yang Anda butuhkan.
sumber
Ini solusi saya ...
sumber
Ketika Anda ingin memantau proses tertentu, biasanya dilakukan dengan scripting. Ini contoh perl. Ini menempatkan persen sebagai cara yang sama seperti atas, menskalakannya ke satu CPU. Kemudian ketika beberapa proses aktif bekerja dengan 2 utas, penggunaan cpu bisa lebih dari 100%. Secara khusus lihat bagaimana inti cpu dihitung: D, biarkan saya menunjukkan contoh saya:
Saya harap ini akan membantu Anda dalam pemantauan apa pun. Tentu saja Anda harus menggunakan scanf atau fungsi C lainnya untuk mengubah regexp perl yang saya gunakan ke sumber C. Tentu 1 detik untuk tidur tidak wajib. Anda dapat menggunakan kapan saja. Akibatnya, Anda akan mendapatkan beban rata-rata pada periode waktu yang ditentukan. Saat Anda akan menggunakannya untuk monitoring, tentu nilai terakhir harus Anda letakkan di luar. Hal ini diperlukan, karena monitoring biasanya memanggil skrip secara berkala, dan skrip harus segera menyelesaikan pekerjaannya.
sumber
Instal
psacct
atauacct
paketkan. Kemudian gunakansa
perintah untuk menampilkan waktu CPU yang digunakan untuk berbagai perintah. sa halaman manualHowto bagus dari situs nixCraft.
sumber
Saya pikir ada baiknya melihat kode sumber perintah "waktu" GNU. waktu Ini mengeluarkan waktu cpu pengguna / sistem bersama dengan waktu yang berlalu secara nyata. Ini memanggil panggilan sistem wait3 / wait4 (jika tersedia) dan sebaliknya memanggil kali panggilan sistem. wait * system call mengembalikan variabel struct "rusage" dan waktu system call mengembalikan "tms". Juga, Anda dapat melihat panggilan sistem getrusage yang juga mengembalikan informasi waktu yang sangat menarik. waktu
sumber
Alih-alih mem-parsing ini dari proc, seseorang dapat menggunakan fungsi seperti getrusage () atau clock_gettime () dan menghitung penggunaan cpu sebagai rasio atau waktu jam dan waktu proses / utas yang digunakan pada cpu.
sumber
Gunakan strace yang ditemukan bahwa penggunaan CPU perlu dihitung dengan jangka waktu:
sumber