Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reliably monitor current CPU usage

Tags:

python

macos

cpu

I'd like to monitor the current system-wide CPU usage on a Mac with Python.

I've written some code that starts 'ps', and adds up all the values from the '%cpu' column.

def psColumn(colName):
    """Get a column of ps output as a list"""
    ps = subprocess.Popen(["ps", "-A", "-o", colName], stdout=subprocess.PIPE)
    (stdout, stderr) = ps.communicate()
    column = stdout.split("\n")[1:]
    column = [token.strip() for token in column if token != '']
    return column

def read(self):
    values = map(float, psColumn("%cpu"))
    return sum(values)

However, I always get high readings from 50% - 80%, probably caused by the measuring program itself. This CPU usage peak does not register on my MenuMeters or other system monitoring programs. How can I get readings which are more like what MenuMeters would display? (I want to detect critical situations in which some program is hogging the CPU.)

p.s. I have tried psutil, but

psutil.cpu_percent()

always returns 100%, so either it's useless for me or I am using it wrongly.

like image 502
D-Bug Avatar asked Dec 11 '25 06:12

D-Bug


2 Answers

For detecting critical situations when some program is hogging the CPU perhaps looking at load average is better? Take a look at "uptime" command.

Load average number tells you how many processes on average are using or waiting on CPU for execution. If it is close to or over 1.0, it means the system is constantly busy with something. If load average is constantly raising, it means that system cannot keep up with the demand and tasks start to pile up. Monitoring load average instead of CPU utilization for system "health" has two advantages:

  • Load averages given by system are already averaged. They don't fluctuate that much so you don't get that problem with parsing "ps" output.
  • Some app may be thrashing disk and rendering system unresponsive. In this case CPU utilization might be low, but load average would still be high indicating a problem.

Also monitoring free RAM and swap would be a good idea.

like image 198
Pēteris Caune Avatar answered Dec 12 '25 19:12

Pēteris Caune


>>> import psutil, time
>>> print psutil.cpu_times()
softirq=50.87; iowait=39.63; system=1130.67; idle=164171.41; user=965.15; irq=7.08; nice=0.0
>>>
>>> while 1:
...     print round(psutil.cpu_percent(), 1)
...     time.sleep(1)
...
5.4
3.2
7.3
7.1
2.5
like image 38
Giampaolo Rodolà Avatar answered Dec 12 '25 20:12

Giampaolo Rodolà