In the Wikipedia page for CPU time, it says
The CPU time is measured in clock ticks or seconds. Often, it is useful to measure CPU time as a percentage of the CPU's capacity, which is called the CPU usage.
I don't understand how a time duration can be replaced by a percentage. When I look at top
, doesn't %CPU
tell me that MATLAB
is using 2.17 of my cores?
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18118 jasl 20 0 9248400 261528 78676 S 217.2 0.1 8:14.75 MATLAB
Question
In order to better understand what CPU usage is, how do I calculate the CPU usage myself?
CPU time is allocated in discrete time slices (ticks). For a certain number of time slices, the CPU is busy, other times it is not (which is represented by the idle process). In the picture below the CPU is busy for 6 of the 10 CPU slices. 6/10 = .60 = 60% of busy time (and there would therefore be 40% idle time).
A percentage is defined as "a number or rate that is expressed as a certain number of parts of something divided into 100 parts". So in this case, those parts are discrete slices of time and the something is busy time slices vs idle time slices -- the rate of busy to idle time slices.
Since CPUs operate in GHz (billions of cycles a second). The operating system slices that time in smaller units called ticks. They are not really 1/10 of a second. The tick rate in windows is 10 million ticks in a second and in Linux it is
sysconf(_SC_CLK_TCK)
(usually 100 ticks per second).In something like
top
, the busy CPU cycles are then further broken down into percentages of things like user time and system time. Intop
on Linux and perfmon in Windows, you will often get a display that goes over 100%, that is because the total is 100% * the_number_of_cpu_cores.In an operating system, it is the scheduler's job to allocate these precious slices to processes, so the scheduler is what reports this.
The CPU time is the time that the process is using the CPU - converting it to a percentage is done by dividing by the amount of real time that's passed.
So, if I have a process that uses 1 second of CPU time over a period of 2 seconds, it's using 50% of a CPU.
In the case of your MATLAB process, 217% indicates that it's used 2.17 seconds of CPU time per second over the last sample interval - effectively, monopolizing 2 CPU cores and taking some of a third.