Psutil.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") # TypeErrorTypeError: a float is required
Ожидание списка при percpu=False
import psutil
load = psutil.cpu_percent(interval=1, percpu=False)
# Попытка обратиться по индексу
print(load[0]) # TypeErrorTypeError: 'float' object is not subscriptable
Изменения в последних версиях
Функция psutil.cpu_percent() является стабильной, и её сигнатура не менялась в последних основных релизах. Основные изменения в библиотеке psutil касаются поддержки новых платформ, исправлений для конкретных систем (например, Windows или Linux) и внутренних оптимизаций.
В версии psutil 5.9.0 были общие улучшения для всех функций, связанных с CPU, на платформе Windows. Рекомендуется использовать актуальную версию библиотеки для обеспечения кросс-платформенной точности и надежности.
Расширенные примеры использования
Мониторинг загрузки CPU в реальном времени
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%
Анализ дисбаланса загрузки ядер
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%
Использование в контексте асинхронного приложения
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
Интеграция в класс для сбора метрик
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}