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.
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:
Also monitoring free RAM and swap would be a good idea.
>>> 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With