Надежно контролировать текущее использование процессора - PullRequest
3 голосов
/ 22 февраля 2010

Я хотел бы отслеживать текущее использование ЦП в масштабе всей системы на Mac с Python.

Я написал некоторый код, который запускает «ps» и складывает все значения из столбца «% cpu».

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)

Однако, я всегда получаю высокие показания от 50% до 80%, вероятно, вызванные самой программой измерения. Этот пик использования процессора не регистрируется на моих MenuMeters или других программах мониторинга системы. Как я могу получить показания, которые больше похожи на то, что отображает MenuMeters? (Я хочу обнаружить критические ситуации, в которых какая-то программа загружает процессор.)

p.s. Я пробовал psutil , но

psutil.cpu_percent()

всегда возвращает 100%, так что это либо бесполезно для меня, либо я использую его неправильно.

Ответы [ 4 ]

3 голосов
/ 25 июня 2010
>>> 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
3 голосов
/ 22 февраля 2010

Для обнаружения критических ситуаций, когда какая-либо программа загружает процессор, возможно, лучше смотреть на среднюю нагрузку? Посмотрите на команду «uptime».

Среднее значение загрузки показывает, сколько процессов в среднем используют или ожидают выполнения на ЦП. Если оно близко к 1.0 или выше, это означает, что система постоянно чем-то занята. Если средняя нагрузка постоянно растет, это означает, что система не может удовлетворить спрос, и задачи начинают накапливаться. Мониторинг средней нагрузки вместо загрузки ЦП для «работоспособности» системы имеет два преимущества:

  • Средние значения нагрузки, заданные системой, уже усреднены. Они не сильно колеблются, поэтому у вас не возникает проблем с анализом вывода "ps".
  • Некоторые приложения могут перебивать диск и выводить систему из строя. В этом случае загрузка ЦП может быть низкой, но средняя загрузка все равно будет высокой, что указывает на проблему.

Также хорошей идеей будет мониторинг свободной оперативной памяти и подкачки.

1 голос
/ 22 февраля 2010

Я работал над одной и той же вещью всего пару недель назад, и у меня тоже были проблемы с psutil.cpu_percent ().

Вместо этого я использовал psutil.cpu_times (), который дает время процессора, используемое для пользователя, системы, простоя и других вещей в зависимости от вашей ОС. Я не знаю, является ли это хорошим способом или даже точным способом ведения дел.

import psutil as ps

class cpu_percent:
    '''Keep track of cpu usage.'''

    def __init__(self):
        self.last = ps.cpu_times()

    def update(self):
        '''CPU usage is specific CPU time passed divided by total CPU time passed.'''

        last = self.last
        current = ps.cpu_times()

        total_time_passed = sum([current.__dict__.get(key, 0) - last.__dict__.get(key, 0) for key in current.attrs])

        #only keeping track of system and user time
        sys_time = current.system - last.system
        usr_time = current.user - last.user

        self.last = current

        if total_time_passed > 0:
            sys_percent = 100 * sys_time / total_time_passed
            usr_percent = 100 * usr_time / total_time_passed
            return sys_percent + usr_percent
        else:
            return 0
0 голосов
/ 13 февраля 2017

для psutil: при запуске файла .py в оболочке правильный ответ будет

psutil.cpu_percent(interval=1)

не забудьте аргумент интервал = 1, иначе он вернет 0 или 100, возможно, ошибку

...