Профилирование и мониторинг системных ресурсов в 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 для получения информации о запущенных процессах и использовании системы для ЦП, памяти, дисков, сети, датчиков. Они очень полезны для мониторинга производительности критически важных системных ресурсов.