Psutil.cpu percent: примеры (PYTHON)

Работа с функцией cpu_percent в Python для анализа нагрузки на процессор
Раздел: Мониторинг, Системные ресурсы
psutil.cpu_percent(interval: float): float

Описание функции psutil.cpu_percent

Функция cpu_percent() из библиотеки psutil предназначена для получения данных о текущей загрузке центрального процессора. Её применение актуально в задачах системного мониторинга, создания дашбордов, профилирования производительности приложений и управления ресурсами.

Функция возвращает значение в процентах, представляющее использование CPU.

Аргументы функции

  • interval (float, optional): Определяет временной интервал в секундах для измерения. Если значение равно None или 0, функция возвращает моментальную загрузку с момента последнего вызова. При первом вызове с такими параметрами всегда возвращается 0.0. Положительное значение заставляет функцию блокировать выполнение на указанный промежуток, усредняя нагрузку за это время.
  • percpu (bool, optional): Если установлено в True, функция возвращает список процентов загрузки для каждого логического ядра процессора. По умолчанию False, что приводит к возврату одного агрегированного значения для всех ядер.

Возвращаемое значение

  • При percpu=False (по умолчанию): одно число с плавающей точкой (float).
  • При percpu=True: список чисел с плавающей точкой (list of floats), где каждый элемент соответствует проценту загрузки отдельного ядра.

Примеры использования функции

Моментальная загрузка CPU

import psutil
# Первый вызов всегда 0.0
print(psutil.cpu_percent(interval=None))
# Второй вызов покажет загрузку с момента первого вызова
print(psutil.cpu_percent(interval=None))
0.0
4.2

Измерение загрузки за интервал времени

# Измерение средней загрузки за 2 секунды
load = psutil.cpu_percent(interval=2)
print(f"Средняя загрузка за 2 секунды: {load}%")
Средняя загрузка за 2 секунды: 12.5%

Получение загрузки по каждому ядру

per_cpu_load = psutil.cpu_percent(interval=1, percpu=True)
print(f"Загрузка по ядрам: {per_cpu_load}")
print(f"Количество ядер: {len(per_cpu_load)}")
Загрузка по ядрам: [10.2, 5.6, 25.0, 3.1]
Количество ядер: 4

Похожие функции в Python

Библиотека psutil предоставляет и другие инструменты для мониторинга процессора.

  • psutil.cpu_times(): Возвращает именованный кортеж с детализированной статистикой времени работы CPU (user, system, idle и др.) в секундах. Полезна для глубокого анализа, а не только процентной нагрузки.
  • psutil.cpu_count(logical=True): Возвращает количество логических (по умолчанию) или физических ядер. Не измеряет загрузку, но помогает интерпретировать данные от cpu_percent(percpu=True).
  • psutil.cpu_stats(): Показывает статистику по количеству прерываний, контекстных переключений и системных вызовов.

Когда что использовать: cpu_percent() оптимальна для получения понятного процентного показателя общей нагрузки или нагрузки на ядра. cpu_times() нужна для анализа, где именно (user/system/idle) тратится процессорное время.

Аналоги функции в других языках программирования

JavaScript (Node.js)

Используют пакет os-utils или встроенный модуль os для менее детальной информации.

const os = require('os');
// Аналог моментального снимка (не такой точный, как в psutil)
const cpus = os.cpus();
let totalIdle = 0, totalTick = 0;
cpus.forEach(cpu => {
    for(type in cpu.times) {
        totalTick += cpu.times[type];
    }
    totalIdle += cpu.times.idle;
});
const idle = totalIdle / cpus.length;
const total = totalTick / cpus.length;
const usage = 100 - (100 * idle / total);
console.log(`Загрузка CPU: ${usage.toFixed(2)}%`);
Загрузка CPU: 15.75%

Golang

Пакет github.com/shirou/gopsutil/cpu (вдохновлен psutil).

package main
import (
    "fmt"
    "github.com/shirou/gopsutil/cpu"
    "time"
)
func main() {
    percentages, _ := cpu.Percent(2*time.Second, false)
    fmt.Printf("Загрузка: %.2f%%\n", percentages[0])
}
Загрузка: 8.30%

PHP

Функция sys_getloadavg() возвращает среднюю нагрузку за 1, 5 и 15 минут, но не процент загрузки CPU в реальном времени.

<?
$load = sys_getloadavg();
echo "Нагрузка за 1 мин: " . $load[0];
?>
Нагрузка за 1 мин: 0.45

Отличия: Многие аналоги требуют больше кода для расчета процента или предоставляют менее детализированные данные. Python с psutil предлагает наиболее простой и кросс-платформенный API.

Типичные ошибки

Неверная интерпретация первого вызова

import psutil
# Ожидание увидеть текущую загрузку, но получаем 0.0
current_load = psutil.cpu_percent()
print(f"Текущая загрузка: {current_load}%") # Всегда 0.0 при первом вызове
Текущая загрузка: 0.0%

Решение: Для моментального замера нужно вызвать функцию дважды или использовать интервал.

Использование некорректного типа для interval

import psutil
# Передача строки вместо числа
load = psutil.cpu_percent(interval="1") # TypeError
TypeError: a float is required

Ожидание списка при percpu=False

import psutil
load = psutil.cpu_percent(interval=1, percpu=False)
# Попытка обратиться по индексу
print(load[0]) # TypeError
TypeError: 'float' object is not subscriptable

Изменения в последних версиях

Функция psutil.cpu_percent() является стабильной, и её сигнатура не менялась в последних основных релизах. Основные изменения в библиотеке psutil касаются поддержки новых платформ, исправлений для конкретных систем (например, Windows или Linux) и внутренних оптимизаций.

В версии psutil 5.9.0 были общие улучшения для всех функций, связанных с CPU, на платформе Windows. Рекомендуется использовать актуальную версию библиотеки для обеспечения кросс-платформенной точности и надежности.

Расширенные примеры использования

Мониторинг загрузки CPU в реальном времени

Пример python
import psutil, time
def monitor_cpu(duration=10, sample_interval=1):
    print("Мониторинг загрузки CPU...")
    samples = []
    end_time = time.time() + duration
    while time.time() < end_time:
        load = psutil.cpu_percent(interval=sample_interval)
        samples.append(load)
        print(f"{load:.1f}%", end=" ", flush=True)
    avg_load = sum(samples) / len(samples)
    print(f"\nСредняя загрузка за {duration} сек: {avg_load:.1f}%")
    return samples
monitor_cpu(5, 0.5)
Мониторинг загрузки CPU...
4.5% 12.3% 8.9% 5.2% 7.1% 15.6% 3.4% 9.8% 6.7% 10.2%
Средняя загрузка за 5 сек: 8.4%

Анализ дисбаланса загрузки ядер

Пример python
import psutil
load_per_core = psutil.cpu_percent(interval=2, percpu=True)
for i, load in enumerate(load_per_core):
    print(f"Ядро {i}: {load:5.1f}% {'*' * int(load/5)}")
max_load = max(load_per_core)
min_load = min(load_per_core)
print(f"\nДисбаланс (max-min): {max_load - min_load:.1f}%")
Ядро 0:   8.2% **
Ядро 1:  45.6% *********
Ядро 2:   3.1% *
Ядро 3:  12.7% ***

Дисбаланс (max-min): 42.5%

Использование в контексте асинхронного приложения

Пример python
import psutil, asyncio, time
async def cpu_intensive_task():
    # Имитация нагрузки
    _ = [i*i for i in range(2000000)]
async def monitor_with_async():
    print("Загрузка до задачи:", psutil.cpu_percent(interval=None))
    task = asyncio.create_task(cpu_intensive_task())
    await asyncio.sleep(0.1)  # Даем задаче начаться
    # Краткий синхронный интервал для измерения
    load_during = psutil.cpu_percent(interval=0.5)
    print(f"Загрузка во время задачи: {load_during}%")
    await task
    await asyncio.sleep(0.5)
    print("Загрузка после задачи:", psutil.cpu_percent(interval=None))
asyncio.run(monitor_with_async())
Загрузка до задачи: 0.0
Загрузка во время задачи: 35.8%
Загрузка после задачи: 2.1

Интеграция в класс для сбора метрик

Пример python
import psutil, time
class SystemMonitor:
    def __init__(self):
        self.prev_call_time = time.time()
        # Инициализация для моментального замера
        psutil.cpu_percent(interval=None)
    def get_cpu_metrics(self):
        instant_load = psutil.cpu_percent(interval=None)
        per_core_load = psutil.cpu_percent(interval=0, percpu=True)
        metrics = {
            'cpu_total': instant_load,
            'cpu_per_core': per_core_load,
            'timestamp': time.time()
        }
        return metrics
monitor = SystemMonitor()
time.sleep(0.1)
print(monitor.get_cpu_metrics())
{'cpu_total': 5.8, 'cpu_per_core': [10.2, 3.1, 8.4, 1.5], 'timestamp': 1720000000.123456}

питон psutil.cpu_percent function comments

En
Psutil.cpu percent Get CPU usage percent