How to get total cpu usage in Linux using C++
cat /proc/stat
http://www.linuxhowtos.org/System/procstat.htm
I agree with this answer above. The cpu line in this file gives the total number of "jiffies" your system has spent doing different types of processing.
What you need to do is take 2 readings of this file, seperated by whatever interval of time you require. The numbers are increasing values (subject to integer rollover) so to get the %cpu you need to calculate how many jiffies have elapsed over your interval, versus how many jiffies were spend doing work.
e.g.
Suppose at 14:00:00 you have
cpu 4698 591 262 8953 916 449 531
total_jiffies_1 = (sum of all values) = 16400
work_jiffies_1 = (sum of user,nice,system = the first 3 values) = 5551
and at 14:00:05 you have
cpu 4739 591 289 9961 936 449 541
total_jiffies_2 = 17506
work_jiffies_2 = 5619
So the %cpu usage over this period is:
work_over_period = work_jiffies_2 - work_jiffies_1 = 68
total_over_period = total_jiffies_2 - total_jiffies_1 = 1106
%cpu = work_over_period / total_over_period * 100 = 6.1%
Hope that helps a bit.
C Program to get CPU usage for a PID and all its children
Yes, the parent needs to wait for the CPU time of the children to be added in (see manual entry for getrusage
link). Also see this answer for more details.
How to get the CPU Usage in C?
This is platform-specific:
- In Windows, you can use the
GetProcessTimes()
function. - In Linux, you can actually just use
clock()
.
These can be used to measure the amount of CPU time taken between two time intervals.
EDIT :
To get the CPU consumption (as a percentage), you will need to divide the total CPU time by the # of logical cores that the OS sees, and then divided by the total wall-clock time:
% CPU usage = (CPU time) / (# of cores) / (wall time)
Getting the # of logical cores is also platform-specific:
- Windows:
GetSystemInfo()
- Linux:
sysconf(_SC_NPROCESSORS_ONLN)
How to calculate the CPU usage of a process by PID in Linux from C?
You need to parse out the data from /proc/<PID>/stat
. These are the first few fields (from Documentation/filesystems/proc.txt
in your kernel source):
Table 1-3: Contents of the stat files (as of 2.6.22-rc3)
..............................................................................
Field Content
pid process id
tcomm filename of the executable
state state (R is running, S is sleeping, D is sleeping in an
uninterruptible wait, Z is zombie, T is traced or stopped)
ppid process id of the parent process
pgrp pgrp of the process
sid session id
tty_nr tty the process uses
tty_pgrp pgrp of the tty
flags task flags
min_flt number of minor faults
cmin_flt number of minor faults with child's
maj_flt number of major faults
cmaj_flt number of major faults with child's
utime user mode jiffies
stime kernel mode jiffies
cutime user mode jiffies with child's
cstime kernel mode jiffies with child's
You're probably after utime
and/or stime
. You'll also need to read the cpu
line from /proc/stat
, which looks like:
cpu 192369 7119 480152 122044337 14142 9937 26747 0 0
This tells you the cumulative CPU time that's been used in various categories, in units of jiffies. You need to take the sum of the values on this line to get a time_total
measure.
Read both utime
and stime
for the process you're interested in, and read time_total
from /proc/stat
. Then sleep for a second or so, and read them all again. You can now calculate the CPU usage of the process over the sampling time, with:
user_util = 100 * (utime_after - utime_before) / (time_total_after - time_total_before);
sys_util = 100 * (stime_after - stime_before) / (time_total_after - time_total_before);
Make sense?
Related Topics
How to See the Assembly Code for a C++ Program
Difference Between Rdtscp, Rdtsc:Memory and Cpuid/Rdtsc
Does Std::Mt19937 Require Warmup
Cmake Unable to Determine Linker Language with C++
Simplest Way to Determine Return Type of Function
Initial Capacity of Vector in C++
Using Quaternions for Opengl Rotations
Correct Printf Format Specifier for Size_T: %Zu or %Iu
How to Set the Decimal Separator to Be a Comma
Trial-Division Code Runs 2X Faster as 32-Bit on Windows Than 64-Bit on Linux
.C VS .Cc VS. .Cpp VS .Hpp VS .H VS .Cxx
How to Use Formatmessage() Properly in C++
Declare a Reference and Initialize Later