Профилирование и мониторинг системных ресурсов в Python с помощью psutil и GPUtil

Почему важен мониторинг системных ресурсов?

Если вы не можете его измерить, вы не можете его улучшить - лорд Кельвин

Мониторинг помогает регулярно оценивать производительность критически важных системных ресурсов, таких как

  • Процессор
  • Память - ОЗУ, пространство подкачки и место на жестком диске
  • Использование сети
  • Использование графического процессора

Мониторинг имеет решающее значение для определения процесса, который использует больше всего ресурсов и почему. Это помогает понять, достаточно ли ресурсов текущей системы для запуска или же несанкционированный процесс потребляет слишком много ресурсов.

Наличие ограничивающего порога для системных ресурсов предотвратит дальнейшее обострение проблем и определит соответствующий анализ первопричин для устранения проблемы.

Здесь мы исследуем

Библиотека psutil (процессные и системные утилиты) в Python - это кроссплатформенная библиотека для получения информации о запущенных процессах и использовании системы для таких ресурсов, как ЦП, память, диски и т. д. сеть, датчики.

psutil в настоящее время поддерживает следующие платформы:

  • Linux
  • Окна
  • macOS
  • FreeBSD, OpenBSD, NetBSD
  • Солнце Солярис
  • AIX

GPUtil - это модуль Python для получения статуса графического процессора от графических процессоров NVIDIA с помощью nvidia-smi.

Системный профиль

Профилируйте свою систему, чтобы узнать имя системы, версию ОС, 64-разрядную архитектуру или 32-разрядную архитектуру, количество физических и виртуальных ядер, а также максимальную и минимальную частоту процессора.

Библиотека платформы извлекает данные, идентифицирующие платформу, такие как имя устройства, версия ОС, версия выпуска ОС, узел, процессор и т. Д.

import psutil
import platform
uname = platform.uname()
print(f"System: {uname.system}")  #Windows or Linux
print(f"Node Name: {uname.node}") # System name
print(f"Release: {uname.release}") # OS release version like  10(Windows) or 5.4.0-72-generic(linux)
print(f"Version: {uname.version}")
print(f"Machine: {uname.machine}")  # machine can be AMD64 or x86-64
print(f"Processor: {uname.processor}") #  Intel64 Family 6 or x86_64
print("Physical cores:", psutil.cpu_count(logical=False))
print("Total cores:", psutil.cpu_count(logical=True))
# CPU frequencies
cpufreq = psutil.cpu_freq()
print(f"Max Frequency: {cpufreq.max:.2f}Mhz")
print(f"Min Frequency: {cpufreq.min:.2f}Mhz")
print(f"Current Frequency: {cpufreq.current:.2f}Mhz")

Мониторинг и ограничение ресурсов ЦП

Мониторинг температур различных физических ядер, и если текущая температура любого из физических ядер превышает пороговый предел для ядра, то предупреждение

psutil.sensors_temperatures (fahrenheit = True) предоставляет нам текущие, высокие и критические температуры различных физических ядер. Это не относится к Windows

for i in range(len(psutil.sensors_temperatures(fahrenheit=True)[ 'coretemp'])):
    print(str(psutil.sensors_temperatures(fahrenheit=True)[ 'coretemp'][i].label) + " has a temp of " + str(psutil.sensors_temperatures(fahrenheit=True)[ 'coretemp'][i].current) + "F")
    if psutil.sensors_temperatures(fahrenheit=True)[ 'coretemp'][i].current >psutil.sensors_temperatures(fahrenheit=True)[ 'coretemp'][i].high:
        print("Temp too high")

Мониторинг и ограничение памяти

Виртуальная память - это комбинация ОЗУ и дискового пространства, которое используют все процессы, запущенные на ЦП, а Пространство подкачки - это часть виртуальной памяти на жестком диске, используемая запущенными процессами, когда RAM заполнена.

def get_size(bytes, suffix="B"):
    """
    Scale bytes to its proper format- KB, MB, GB, TB and PB
    """
    factor = 1024
    for unit in ["", "K", "M", "G", "T", "P"]:
        if bytes < factor:
            return f"{bytes:.2f}{unit}{suffix}"
        bytes /= factor
print("Virtual memory")
svmem = psutil.virtual_memory()
print(f"Total: {get_size(svmem.total)}")
print(f"Available: {get_size(svmem.available)}")
print(f"Used: {get_size(svmem.used)}")
print(f"Percentage: {svmem.percent}%")
print("SWAP memory")
# get the swap memory details (if exists)
swap = psutil.swap_memory()
print(f"Total: {get_size(swap.total)}")
print(f"Free: {get_size(swap.free)}")
print(f"Used: {get_size(swap.used)}")
print(f"Percentage: {swap.percent}%")

psutil.virtual_memory (): возвращает статистику использования системной памяти в виде именованного кортежа.

psutil.swap_memory (): предоставляет подробную информацию о статистике памяти подкачки в виде кортежа.

Ограничение порога виртуальной памяти и памяти подкачки

VIRTUAL_MEMEORY_THRESHOLD = 100 * 1024 * 1024  # 100MB
SWAP_MEMEORY_THRESHOLD = 45
if  psutil.virtual_memory().available <= THRESHOLD:
    print("Low Virtual Memory warning")
if psutil.swap_memory().percent>=SWAP_MEMEORY_THRESHOLD:
    print("Low Swap Memory warning")

Мониторинг и ограничение места на жестком диске

psutil.disk_partitions (): возвращает все подключенные разделы диска, включая устройство, точку монтирования и тип файловой системы.

print( "Hard Disk Information")
print("Partitions and Usage:")
# get all disk partitions on the device
partitions = psutil.disk_partitions()
for partition in partitions:
    print("Device:",partition.device)
    print("Partition Mountpoint: ",partition.mountpoint)
    print("Partition File system type",partition.fstype)
    try:
        partition_usage = psutil.disk_usage(partition.mountpoint)
    except PermissionError:
        continue
    print("Total Size: ", get_size(partition_usage.total))
    print("Used Space: ", get_size(partition_usage.used))
    print("Free hard disk Space", get_size(partition_usage.free))
    print("Hard disk Used Percentage: ", partition_usage.percent, "%")
    if(partition_usage.percent >82):
        print("Disk space nearing full")

Мониторинг и ограничение использования сети

Все сетевые протоколы связаны с определенным семейством адресов. Семейство адресов предоставляет такие услуги, как фрагментация и повторная сборка пакетов, маршрутизация, адресация и транспортировка. Семейство адресов обеспечивает межпроцессное взаимодействие между процессами, которые выполняются в одной или разных системах.

Семейство адресов обычно состоит из нескольких протоколов, по одному для каждого типа сокета.

Различные сети обращаются к семействам и их назначению

  • AF_INET: Интернет-протоколы IPv4
  • AF_INET6: Интернет-протоколы IPv6
  • AF_NETLINK: устройство пользовательского интерфейса ядра
  • AF_PACKET: низкоуровневый пакетный интерфейс
print( "Network Information")
# get all network interfaces (virtual and physical)
if_addrs = psutil.net_if_addrs()
for interface_name, interface_addresses in if_addrs.items():
    for address in interface_addresses:
        print(" Interface: ", interface_name)
        if str(address.family) == 'AddressFamily.AF_INET':
            print("  IP Address: ", address.address)
            print("  Netmask: ", address.netmask)
            print("  Broadcast IPv4: ",address.broadcast)
        elif str(address.family) == 'AddressFamily.AF_PACKET':
            print("  MAC Address: {address.address}")
            print("  Netmask: {address.netmask}")
            print("  Broadcast MAC: {address.broadcast}")
        elif str(address.family) == 'AddressFamily.AF_INET6':
            print("  IP Address: ", address.address)
            print("  Netmask: ", address.netmask)
            print("  Broadcast IPv6: ",address.broadcast)

psutil.net_io_counters (): возвращает общесистемную сетевую статистику ввода-вывода, такую ​​как отправленные байты, полученные байты, отброшенные входящие или исходящие пакеты.

net_io = psutil.net_io_counters()
print("Total Bytes Sent: ", get_size(net_io.bytes_sent))
print("Total Bytes Received: ", get_size(net_io.bytes_recv))
print("Total outgoing packets dropped: ", net_io.dropin)
print("Total incoming packets dropped:", net_io.dropout)
print("Total outgoing errors: ", net_io.errout)
print("Total incoming errors:", net_io.errin)

Мониторинг GPU

GPUtil - это библиотека Python для получения статуса графического процессора от графических процессоров NVIDIA. Он отображает все графические процессоры NVIDIA, доступные на устройстве, доступную свободную память, используемую память и температуру графического процессора в градусах Цельсия.

import GPUtil
Gpus = GPUtil.getGPUs()
gpulist=[]
for gpu in Gpus:
        print(gpu.name) 
        print('gpu.id:', gpu.id)
        
        print ( 'total GPU:', gpu.memoryTotal)
        print(f"Memory free {gpu.memoryFree}MB")
        print ( 'GPU usage:', gpu.memoryUsed)
        print ( 'gpu use proportion:', gpu.memoryUtil * 100)
        print(str(gpu.temperature) + " C")
               
        gpulist.append([ gpu.id, gpu.memoryTotal, gpu.memoryUsed,gpu.memoryUtil * 100])

THRESHOLD_GPU=10
for gpu in Gpus:
        print(gpu.name,' gpu.id:', gpu.id)
        if gpu.memoryTotal/gpu.memoryUsed*100>THRESHOLD_GPU:print ( f"gpu memory usgae currently is: {gpu.memoryUtil * 100}% which exceeds the threshold of {THRESHOLD_GPU}%" )

Датчики мониторинга

Чтобы контролировать датчики IoT, мы можем получить информацию о температуре оборудования, скорости вентиляторов и батарее. Определите порог и поднимите ошибку, если порог будет достигнут.

psutil.sensors_temperatures()
psutil.sensors_fans()
psutil.sensors_battery()

Вывод:

GPUtil и psutil - это кроссплатформенные библиотеки Python для получения информации о запущенных процессах и использовании системы для ЦП, памяти, дисков, сети, датчиков. Они очень полезны для мониторинга производительности критически важных системных ресурсов.

Использованная литература:





Https://pypi.org/project/GPUtil/