Saya pernah memiliki tugas untuk menentukan parameter kinerja berikut dari dalam aplikasi yang sedang berjalan:
- Total memori virtual tersedia
- Memori virtual saat ini digunakan
- Memori virtual saat ini digunakan oleh proses saya
- Total RAM tersedia
- RAM saat ini digunakan
- RAM saat ini digunakan oleh proses saya
- % CPU saat ini digunakan
- % CPU saat ini digunakan oleh proses saya
Kode harus dijalankan di Windows dan Linux. Meskipun ini tampaknya menjadi tugas standar, menemukan informasi yang diperlukan dalam manual (WIN32 API, GNU docs) serta di Internet membutuhkan waktu beberapa hari, karena ada begitu banyak informasi yang tidak lengkap / tidak benar / ketinggalan zaman mengenai topik ini menjadi ditemukan di sana.
Untuk menyelamatkan orang lain dari mengalami masalah yang sama, saya pikir itu akan menjadi ide yang baik untuk mengumpulkan semua informasi yang tersebar ditambah apa yang saya temukan dengan coba-coba di sini di satu tempat.
Jawaban:
Windows
Beberapa nilai di atas mudah tersedia dari WIN32 API yang sesuai, saya hanya daftar di sini untuk kelengkapan. Namun, yang lain perlu diperoleh dari perpustakaan Performance Data Helper (PDH), yang sedikit "tidak intuitif" dan membutuhkan banyak percobaan dan kesalahan yang menyakitkan untuk dapat bekerja. (Setidaknya butuh beberapa saat, mungkin aku hanya sedikit bodoh ...)
Catatan: untuk kejelasan semua pengecekan kesalahan telah dihilangkan dari kode berikut. Periksa kode pengembalian ...!
Total Memori Virtual:
Catatan: Nama "TotalPageFile" agak menyesatkan di sini. Pada kenyataannya, parameter ini memberikan "Ukuran Memori Virtual", yang merupakan ukuran file swap plus RAM yang dipasang.
Memori Virtual yang saat ini digunakan:
Kode yang sama seperti pada "Total Virtual Memory" dan kemudian
Memori Virtual saat ini digunakan oleh proses saat ini:
Total Memori Fisik (RAM):
Kode yang sama seperti pada "Total Virtual Memory" dan kemudian
Memori Fisik yang saat ini digunakan:
Memori Fisik saat ini digunakan oleh proses saat ini:
Kode yang sama seperti dalam "Memori Virtual saat ini digunakan oleh proses saat ini" dan kemudian
CPU saat ini digunakan:
CPU saat ini digunakan oleh proses saat ini:
Linux
Di Linux, pilihan yang tampak jelas pada awalnya adalah menggunakan API POSIX seperti
getrusage()
dll. Saya menghabiskan beberapa waktu untuk mencoba ini berfungsi, tetapi tidak pernah mendapatkan nilai yang berarti. Ketika saya akhirnya memeriksa sendiri sumber kernel, saya menemukan bahwa ternyata API ini belum sepenuhnya diimplementasikan pada kernel Linux 2.6 !?Pada akhirnya saya mendapatkan semua nilai melalui kombinasi membaca sistem file semu
/proc
dan panggilan kernel.Total Memori Virtual:
Memori Virtual yang saat ini digunakan:
Kode yang sama seperti pada "Total Virtual Memory" dan kemudian
Memori Virtual saat ini digunakan oleh proses saat ini:
Total Memori Fisik (RAM):
Kode yang sama seperti pada "Total Virtual Memory" dan kemudian
Memori Fisik yang saat ini digunakan:
Kode yang sama seperti pada "Total Virtual Memory" dan kemudian
Memori Fisik saat ini digunakan oleh proses saat ini:
Ubah getValue () di "Memori Virtual yang saat ini digunakan oleh proses saat ini" sebagai berikut:
CPU saat ini digunakan:
CPU saat ini digunakan oleh proses saat ini:
TODO: Platform Lainnya
Saya akan berasumsi, bahwa beberapa kode Linux juga berfungsi untuk Unix, kecuali untuk bagian yang membaca / proc pseudo-filesystem. Mungkin di Unix bagian-bagian ini dapat diganti dengan
getrusage()
dan fungsi yang serupa? Jika seseorang dengan pengetahuan Unix dapat mengedit jawaban ini dan mengisi detailnya ?!sumber
PROCESS_MEMORY_COUNTERS
, bagaimana Anda mengambil "Memori Virtual yang saat ini digunakan oleh proses saat ini"?PrivateUsage
bukan anggotaPROCESS_MEMORY_COUNTERS
kesalahan kompilator yang saya terima!"quotes like these"
untuk menyertakan header sistem?GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
denganGetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
Mac OS X
Saya berharap untuk menemukan informasi serupa untuk Mac OS X juga. Karena tidak ada di sini, saya pergi dan menggali sendiri. Inilah beberapa hal yang saya temukan. Jika ada yang punya saran lain, saya ingin mendengarnya.
Total Memori Virtual
Yang ini rumit pada Mac OS X karena tidak menggunakan partisi swap atau file seperti Linux. Berikut ini entri dari dokumentasi Apple:
Jadi, jika Anda ingin tahu berapa banyak memori virtual yang masih tersedia, Anda perlu mendapatkan ukuran partisi root. Anda dapat melakukannya seperti ini:
Total Virtual Saat Ini Digunakan
Memanggil systcl dengan tombol "vm.swapusage" memberikan informasi menarik tentang penggunaan swap:
Bukan berarti total penggunaan swap yang ditampilkan di sini dapat berubah jika diperlukan lebih banyak swap seperti yang dijelaskan pada bagian di atas. Jadi total sebenarnya adalah total swap saat ini . Dalam C ++, data ini dapat dikueri dengan cara ini:
Perhatikan bahwa "xsw_usage", dinyatakan dalam sysctl.h, tampaknya tidak didokumentasikan dan saya menduga ada cara yang lebih portabel untuk mengakses nilai-nilai ini.
Memori Virtual Saat Ini Digunakan oleh Proses saya
Anda bisa mendapatkan statistik tentang proses Anda saat ini menggunakan
task_info
fungsi. Itu termasuk ukuran penduduk saat ini dari proses Anda dan ukuran virtual saat ini.Total RAM tersedia
Jumlah RAM fisik yang tersedia di sistem Anda tersedia menggunakan
sysctl
fungsi sistem seperti ini:RAM Saat Ini Digunakan
Anda bisa mendapatkan statistik memori umum dari
host_statistics
fungsi sistem.Satu hal yang perlu diperhatikan di sini adalah bahwa ada lima jenis halaman memori di Mac OS X. Mereka adalah sebagai berikut:
Adalah baik untuk dicatat bahwa hanya karena Mac OS X dapat menunjukkan sangat sedikit memori bebas aktual pada waktu itu mungkin bukan indikasi yang baik tentang seberapa banyak yang siap digunakan dalam waktu singkat.
RAM Saat Ini Digunakan oleh Proses saya
Lihat "Memori Virtual Saat Ini Digunakan oleh Proses Saya" di atas. Kode yang sama berlaku.
sumber
Linux
Di Linux, informasi ini tersedia di sistem file / proc. Saya bukan penggemar format file teks yang digunakan, karena setiap distribusi Linux tampaknya mengkustomisasi setidaknya satu file penting. Pandangan cepat ketika sumber ke 'ps' mengungkapkan kekacauan.
Tetapi di sinilah tempat mencari informasi yang Anda cari:
/ proc / meminfo berisi sebagian besar informasi seluruh sistem yang Anda cari. Di sini sepertinya di sistem saya; Saya pikir Anda tertarik pada MemTotal , MemFree , SwapTotal , dan SwapFree :
Untuk pemanfaatan CPU, Anda harus melakukan sedikit pekerjaan. Linux menyediakan keseluruhan pemanfaatan CPU sejak sistem dimulai; ini mungkin bukan yang Anda minati. Jika Anda ingin tahu pemanfaatan CPU untuk detik terakhir, atau 10 detik, maka Anda perlu menanyakan informasi dan menghitungnya sendiri.
Informasi ini tersedia di / proc / stat , yang didokumentasikan dengan cukup baik di http://www.linuxhowtos.org/System/procstat.htm ; di sini seperti apa kotak 4-core saya:
Pertama, Anda perlu menentukan berapa banyak CPU (atau prosesor, atau inti proses) yang tersedia di sistem. Untuk melakukan ini, hitung jumlah entri 'cpuN', di mana N dimulai pada 0 dan kenaikan. Jangan hitung baris 'cpu', yang merupakan kombinasi dari baris cpuN. Dalam contoh saya, Anda dapat melihat cpu0 hingga cpu3, dengan total 4 prosesor. Mulai sekarang, Anda dapat mengabaikan cpu0..cpu3, dan fokus hanya pada baris 'cpu'.
Selanjutnya, Anda perlu tahu bahwa angka keempat di baris ini adalah ukuran waktu idle, dan dengan demikian angka keempat pada baris 'cpu' adalah total waktu idle untuk semua prosesor sejak waktu boot. Waktu ini diukur dalam Linux "jiffies", yang masing-masing 1/100 detik.
Tetapi Anda tidak peduli dengan total waktu idle; Anda peduli dengan waktu idle dalam periode tertentu, misalnya detik terakhir. Apakah menghitung itu, Anda perlu membaca file ini dua kali, terpisah 1 detik. Kemudian Anda dapat melakukan perbedaan dari nilai keempat baris. Misalnya, jika Anda mengambil sampel dan mendapatkan:
Kemudian satu detik kemudian Anda mendapatkan sampel ini:
Kurangi dua angka, dan Anda mendapatkan perbedaan 396, yang berarti bahwa CPU Anda menganggur selama 3,96 detik dari 1,00 detik terakhir. Triknya, tentu saja, adalah Anda harus membaginya dengan jumlah prosesor. 3,96 / 4 = 0,99, dan ada persentase idle Anda; 99% menganggur, dan 1% sibuk.
Dalam kode saya, saya memiliki buffer cincin 360 entri, dan saya membaca file ini setiap detik. Itu memungkinkan saya dengan cepat menghitung pemanfaatan CPU selama 1 detik, 10 detik, dll., Hingga 1 jam.
Untuk informasi spesifik proses, Anda harus melihat di / proc / pid ; jika Anda tidak peduli dengan pid Anda, Anda dapat melihat / proc / self.
CPU yang digunakan oleh proses Anda tersedia di / proc / self / stat . Ini adalah file yang tampak aneh yang terdiri dari satu baris; sebagai contoh:
Data penting di sini adalah token ke-13 dan ke-14 (0 dan 770 di sini). Token ke-13 adalah jumlah jiffies yang telah dieksekusi proses dalam mode pengguna, dan yang ke-14 adalah jumlah jiffies yang telah dieksekusi proses dalam mode kernel. Tambahkan keduanya bersamaan, dan Anda memiliki utilisasi CPU total.
Sekali lagi, Anda harus mengambil sampel file ini secara berkala, dan menghitung perbedaannya, untuk menentukan penggunaan CPU dari waktu ke waktu.
Sunting: ingat bahwa ketika Anda menghitung pemanfaatan CPU proses Anda, Anda harus mempertimbangkan 1) jumlah utas dalam proses Anda, dan 2) jumlah prosesor dalam sistem. Misalnya, jika proses single-threaded Anda hanya menggunakan 25% dari CPU, itu bisa baik atau buruk. Baik pada sistem prosesor tunggal, tetapi buruk pada sistem prosesor 4; ini berarti bahwa proses Anda berjalan terus-menerus, dan menggunakan 100% siklus CPU yang tersedia untuknya.
Untuk informasi memori khusus proses, Anda harus melihat / proc / self / status, yang terlihat seperti ini:
Entri yang dimulai dengan 'Vm' adalah yang menarik:
Satu-satunya item yang saya tidak yakin tentang Swapspace saat ini digunakan oleh proses saya . Saya tidak tahu apakah ini tersedia.
sumber
di windows Anda bisa mendapatkan penggunaan CPU dengan kode di bawah ini:
sumber
usage =
adalah hal paling kreatif yang pernah saya lihat, tidak dapat dibaca sama sekali selain kreatifULONGLONG
untuk VS bukanULARGE_INTEGER
. 2) Anda terlalu rumit dengan meneleponCopyMemory()
, lakukanULONGLONG ul_sys_idle = *(ULONGLONG*)&ft_sys_idle;
saja. Ini akan diterjemahkan ke dalam instruksi CPUmov
(ataulea
) tunggal .Linux
Cara portabel membaca memori dan memuat nomor adalah
sysinfo
panggilanPemakaian
DESKRIPSI
sumber
QNX
Karena ini seperti "wikipage of code" Saya ingin menambahkan beberapa kode dari basis Pengetahuan QNX (catatan: ini bukan pekerjaan saya, tapi saya memeriksanya dan berfungsi dengan baik di sistem saya):
Cara mendapatkan penggunaan CPU di%: http://www.qnx.com/support/knowledgebase.html?id=50130000000P9b5
Cara mendapatkan memori gratis (!): Http://www.qnx.com/support/knowledgebase.html?id=50130000000mlbx
sumber
Mac OS X - CPU
Penggunaan CPU secara keseluruhan:
Dari Ambil informasi sistem pada MacOS X? :
sumber
Untuk Linux Anda juga dapat menggunakan / proc / self / statm untuk mendapatkan satu baris angka yang berisi informasi proses memori utama yang merupakan proses yang lebih cepat daripada melalui daftar panjang informasi yang dilaporkan saat Anda dapatkan dari proc / self / status
Lihat http://man7.org/linux/man-pages/man5/proc.5.html
sumber
Saya menggunakan kode berikut ini dalam proyek C ++ saya dan itu bekerja dengan baik:
sumber