[常用工具] 基于psutil和GPUtil获取系统状态信息
本文主要介绍在Python3中利用psutil库获取系统状态,利用GPUtil获取gpu状态。
psutil (process and system utilities)(进程和系统实用程序)是一个跨平台库,用于在Python中检索有关运行进程和系统利用率(CPU、内存、磁盘、网络、传感器)的信息。它实现了经典UNIX命令行工具提供的许多功能,如ps、top、iotop、lsof、netstat、ifconfig、free等。psutil目前支持windows,linux,macOS等主流系统平台。本文主要介绍psutil中的常用函数。pstuil安装代码如下:
pip install psutil
psutil官方仓库见psutil。
GPUtil是一个Python模块,用于使用nvidia smi从NVIDA GPU获取GPU状态。GPUtil定位计算机上的所有GPU,确定其可用性,并返回可用GPU的有序列表。GPUtil安装代码如下:
pip install gputil
GPUtil官方仓库见gputil。
文章目录
1 psutil的使用
1.1 CPU状态
# 导入库
import psutil
# 返回系统CPU时间。每个属性代表CPU在给定模式下花费的秒数。属性可用性因平台而异。
# percpu表示是否返回单个cpu的花费时间
# 主要返回参数有:
# user:正常进程在用户模式下执行所花费的时间;在 Linux 上,这还包括访客时间
# system:在内核模式下执行的进程所花费的时间
# idle:空闲的时间
psutil.cpu_times(percpu=False)
scputimes(user=7627895.98, nice=4419.62, system=1704625.93, idle=249261020.67, iowait=75386.74, irq=0.0, softirq=36410.5, steal=0.0, guest=0.0, guest_nice=0.0)
# 以百分比返回用户、系统、空闲所使用的cpu时间
psutil.cpu_times_percent(percpu=False)
scputimes(user=0.2, nice=0.0, system=0.0, idle=99.8, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
# 返回表示当前系统CPU利用率百分比的浮点值
# interval=1比较1s内CPU利用率
psutil.cpu_percent(interval=1)
0.5
# 当interval=None(默认为None)表示自上次调用或模块导入以来系统CPU利用率
psutil.cpu_percent(interval=None)
5.1
# 当percpu为True时,返回浮点列表,表示每个CPU的利用率百分比
# psutil.cpu_percent(interval=1, percpu=True)
# 返回逻辑cpu的数量(物理内核数乘以每个cpu内核上可以运行的线程数)
psutil.cpu_count(logical=True)
64
# 返回物理cpu的数量
psutil.cpu_count(logical=False)
16
# 返回CPU 频率,包括当前、最小和最大频率,以Mhz表示。
psutil.cpu_freq()
scpufreq(current=2599.998000000001, min=0.0, max=0.0)
1.2 内存状态
# 返回有关系统内存使用情况的统计信息,以字节表示。主要返回参数有:
# total: 内存总量
# available:可用内存
# used: 已用内存
# free:完全没有使用的内存,在windows系统同等于available
# percent:已用内存比例,计算方式为(total - available) / total * 100
psutil.virtual_memory()
svmem(total=541061697536, available=530528514048, percent=1.9, used=7251107840, free=249252380672, active=28388438016, inactive=247208853504, buffers=7200718848, cached=277357490176, shared=56004608, slab=15238979584)
# 打印内存使用比例
print(psutil.virtual_memory().percent)
1.9
# 通过数值计算指标
mem = psutil.virtual_memory()
# 已使用和可用的总和不一定等于总和,所以计算方式看自己选择。
print(mem.used/mem.total*100)
# 实际psutil计算方式
print(100-mem.available/mem.total*100)
1.3401628452026104
1.94676199331208
# 返回系统交换内存统计信息
psutil.swap_memory()
sswap(total=0, used=0, free=0, percent=0.0, sin=0, sout=0)
1.3 磁盘状态
# 返回磁盘分区情况
# psutil.disk_partitions()
# 返回包含给定路径的分区的磁盘使用率统计信息,以字节表示,主要返回参数有:
# total:总空间
# used:已用空间
# free:可用空间
# percent:使用率百分比,计算方式为used / total * 100
psutil.disk_usage('./')
sdiskusage(total=4363237892096, used=2180849664, free=4141137940480, percent=0.1)
# 返回系统范围的磁盘输入/输出统计信息,主要返回参数有:
# read_count: 读取次数
# write_count: 写入次数
# read_bytes: 读取的字节数
# write_bytes: 写入的字节数
psutil.disk_io_counters()
sdiskio(read_count=19240910, write_count=60524213, read_bytes=3411362631680, write_bytes=7641118547968, read_time=89751300, write_time=1571245636, read_merged_count=15, write_merged_count=44291429, busy_time=73232832)
1.4 网络状态
# 返回网络io统计信息,主要返回参数包括收发字节数、收发包数等。
psutil.net_io_counters()
snetio(bytes_sent=6606245, bytes_recv=7806674, packets_sent=22430, packets_recv=32301, errin=0, errout=0, dropin=0, dropout=0)
# 返回每个网卡接口的网络统计信息
psutil.net_io_counters(pernic=True)
{'lo': snetio(bytes_sent=2535762, bytes_recv=2535762, packets_sent=6513, packets_recv=6513, errin=0, errout=0, dropin=0, dropout=0),
'eth1': snetio(bytes_sent=740299, bytes_recv=1362457, packets_sent=9909, packets_recv=18518, errin=0, errout=0, dropin=0, dropout=0),
'eth0': snetio(bytes_sent=3339973, bytes_recv=3913748, packets_sent=6022, packets_recv=7282, errin=0, errout=0, dropin=0, dropout=0)}
# 返回网络的连接信息
# psutil.net_connections()
# 返回网卡配置信息
# psutil.net_if_addrs()
# 返回网卡的具体信息
psutil.net_if_stats()
{'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536),
'eth1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=10000, mtu=1500),
'eth0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=65535, mtu=1500)}
1.5 传感器状态
# 返回硬件温度,如果没有温度传感器返回空值,有些系统和版本没有该函数
psutil.sensors_temperatures()
{}
# 返回硬件风扇速度,有些系统和版本没有该函数
psutil.sensors_fans()
{}
# 返回电池信息,比如剩余电量
psutil.sensors_battery()
1.6 进程状态
进程状态的函数很多,具体可以看看psutil的官方仓库
# 正在运行进程的pid
psutil.pids()
[1, 8, 9, 34, 70, 71, 91, 6873]
# 返回当前进程信息
# 返回值:进程pid,进程名,进程状态
psutil.Process()
psutil.Process(pid=6873, name='python', status='running', started='19:21:01')
# 查看pid为1的进程信息
psutil.Process(1)
psutil.Process(pid=1, name='sh', status='sleeping', started='18:09:15')
# 进程是否存在
psutil.pid_exists(123)
False
1.7 其他状态
# 返回当前用户信息,包括用户名、登陆终端、host端口,登陆时间
# psutil.users()
# 返回系统启动时间,时间戳形式
# psutil.boot_time()
2 GPUtil的使用
2.1 GPU的ID获取
获取可用GPU的ID列表
deviceIDs = GPUtil.getAvailable(order = ‘first’, limit = 1, maxLoad = 0.5, maxMemory = 0.5, includeNan=False, excludeID=[], excludeUUID=[])
输入参数如下:
- order:确定返回可用GPU设备ID的顺序,可输入参数:first(升序排列),last(降序排列),random(随机选取),load(按负载递增),memory(按显存使用量递增)
- limit:将返回的GPU设备数量限制为指定数量
- maxLoad:负载率大于maxLoad的不会被返回
- maxMemory:显存使用率大于maxMemory的不会被返回
- includeNan:是否包括负载或内存使用为Nan的GPU
- excludeID:不用于排序的GPU的id
- excludeUUID:不用排序的GPU的uuid
返回参数如下:
- deviceIDs: 所有可用GPU设备ID的列表,id号从0开始。
# 导入库
import GPUtil
# 获取一个可用gpu的id
deviceIDs = GPUtil.getAvailable()
deviceIDs
[0]
# 获取最后一个可用gpu的id
deviceIDs = GPUtil.getAvailable(order = 'last')
deviceIDs
[3]
# 随机获取4个可用gpu的id
deviceIDs = GPUtil.getAvailable(order = 'random', limit=4)
deviceIDs
[0, 3, 1, 2]
获取第一个可用的GPU的id
deviceID = GPUtil.getFirstAvailable(order = ‘first’, maxLoad=0.5, maxMemory=0.5, attempts=1, interval=900, verbose=False)
输入参数和GPUtil.getAvailable差不多,其他参数如下:
- attempts:在放弃寻找可用GPU之前,函数应进行的尝试次数
- interval:查找gpu的间隔
- verbose:是否显示详细信息
返回参数如下:
- deviceID: 一个可用GPU设备ID的列表
# 随机获取1个可用gpu的id
deviceID = GPUtil.getFirstAvailable(order = 'random')
deviceID
[1]
打印所有GPU的当前状态
GPUtil.showUtilization(all=False, attrList=None, useOldCode=False)
输入参数如下:
- all:显示GPU所有信息,如果否只显示GPU利用率和GPU显存使用率
- interval:要显示的属性列表列表,这个要看代码
- useOldCode:是否应使用显示GPU利用率的旧代码
该函数在命令行界面输出结果。
# 命令行打印结果
GPUtil.showUtilization(all=False, attrList=None, useOldCode=False)
| ID | GPU | MEM |
------------------
| 0 | 0% | 0% |
| 1 | 0% | 0% |
| 2 | 0% | 0% |
| 3 | 0% | 0% |
2.2 GPU信息读取
获取所有GPU对象的列表
GPUs = GPUtil.getGPUs()
返回参数如下:
- 所用可用GPU列表
import GPUtil
# 获取所有可用GPU列表,id号从0开始
GPUs = GPUtil.getGPUs()
GPUs
[<GPUtil.GPUtil.GPU at 0x7fd3142f08d0>,
<GPUtil.GPUtil.GPU at 0x7fd3142ec390>,
<GPUtil.GPUtil.GPU at 0x7fd3142f0f90>,
<GPUtil.GPUtil.GPU at 0x7fd3142ecfd0>]
筛选可用GPU
GPUavailability = GPUtil.getAvailability(GPUs, maxLoad = 0.5, maxMemory = 0.5, includeNan=False, excludeID=[], excludeUUID=[])
- 输入参数:GPUs为GPU对象列表,其他参数与GPUtil.getAvailable一样
- 返回参数:返回一个与GPUs大小相等的1和0列表,指示哪些对应的GPU可用,1表示可用,0表示不可用
GPUavailability = GPUtil.getAvailability(GPUs)
GPUavailability
[1, 1, 1, 1]
GPU属性获取
返回单个GPU的属性,GPU属性的描述来自于nvidia-smi命令。这些属性分别为:
- id:gpu的id
- uuid:gpu的uuid,全球唯一
- load:gpu的负载率,100%表示满载
- memoryUtil:gpu的显存使用率,100%表示全部使用
- memoryTotal:gpu的总显存
- memoryUsed:gpu已使用显存
- memoryFree:gpu可用显存
- driver:gpu的驱动版本
- name:gpu的正式产品名称
- serial:gpu的序列号,全球唯一
- display_mode:物理显示器是否连接到GPU
- display_active:显示器是否活跃
# 获取所有可用GPU列表,id号从0开始
GPUs = GPUtil.getGPUs()
# 第0个gpu的id
GPUs[0].id
0
# 第0个gpu的负载率
GPUs[0].load
0.0
# 第1个gpu的显存
GPUs[0].memoryTotal
32510.0
# 第1个gpu的驱动版本
GPUs[1].driver
'460.32.03'
# 第2个gpu的产品名称
GPUs[2].name
'Tesla V100-SXM2-32GB'
# 最后一个gpu是否连接物理显示器
GPUs[-1].display_mode
'Enabled'
3 参考
[常用工具] 基于psutil和GPUtil获取系统状态信息的更多相关文章
- eas之获取各模块系统状态信息
public void getSystemStatue() throws EASBizException, BOSException { CompanyOrgUnitInfo co ...
- ThinPHP命名空间,连接数据库是要修改的配置文件,Model数据模型层,跨控制器调用,如何获取系统常量信息,
一.命名空间(主要是为了实现自动加载类) *命名空间(相当于虚拟的目录),为了让类有一个统一的文件夹来管理(可以自动加载'类'),每个文件都要有命名空间*tp如何做命名空间:*TP框架下有一个初始命名 ...
- Linux sysinfo获取系统相关信息
Linux中,可以用sysinfo来获取系统相关信息. #include <stdio.h> #include <stdlib.h> #include <errno.h& ...
- android 获取系统硬件信息
一,首先设置权限访问: <uses-permission android:name="android.permission.READ_PHONE_STATE" /> ...
- ThinkPHP框架 3.2.2 获取系统常量信息 连接数据库 命名空间的理解
获取系统常量信息 随便一个方法里加上这句话都能获取到系统常量信息!! var_dump(get_defined_constants()); <?php namespace Admin\Contr ...
- 获取系统相关信息 (CPU使用率 内存使用率 系统磁盘大小)
引言 在软件开个过程中,对于软件的稳定性和使用率也是我们需要关注的 . 使用sigar来监控,简单方便! 使用说明:下载sigar jar及配合sigar的dll文件来用,需要将dll文件放到JD ...
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等.应用程序/包.服务(Serv ...
- 通过java的Runtime.getRuntime()和System.getProperties()来获取系统的信息
第一种,通过Runtime.getRuntime()来获取系统信息. 通过java来获取系统以下的信息: 主机名: OS 名称: OS 版本: OS 制造商: OS 配置: 独立工作站 ...
- Revit二次开发-根据Element获取系统族信息
Element element = doc.getElement(elementId); Autodesk.Revit.DB.Parameter familyType = element.get_Pa ...
随机推荐
- 从零开始学Graph Database:什么是图
摘要:本文从零开始引导与大家一起学习图知识.希望大家可以通过本教程学习如何使用图数据库与图计算引擎.本篇将以华为云图引擎服务来辅助大家学习如何使用图数据库与图计算引擎. 本文分享自华为云社区<从 ...
- GitHub 供应链安全已支持 Dart 开发者生态
通过 Dart 和 GitHub 团队的共同努力,自 10 月 7 日起,GitHub 的 Advisory Database (安全咨询数据库).Dependency Graph (依赖项关系图) ...
- 【NOI2016】 循环之美 题解
Solution 由数论基础知识 答案即为$$\sum_{i = 1}^n\sum_{j = 1}^m[i \perp j][j \perp k]$$ 莫反套路可化为$$\sum_{d = 1}\mu ...
- 驱动开发:内核枚举PspCidTable句柄表
在上一篇文章<驱动开发:内核枚举DpcTimer定时器>中我们通过枚举特征码的方式找到了DPC定时器基址并输出了内核中存在的定时器列表,本章将学习如何通过特征码定位的方式寻找Windows ...
- Dubbo 03: 直连式 + 接口工程
进一步改正dubbo框架中简单的直连式的不足 需要用到3个相互独立的maven工程,项目1为maven的java工程作为接口工程,项目2,3为maven的web工程 工程1:o3-link-inter ...
- Aspose.Words 操作 Word 画 EChart 图
使用 Aspose.Words 插件在 Word 画 EChart 图 使用此插件可以画出丰富的 EChart 图,API 参考 https://reference.aspose.com/words/ ...
- 齐博x1标签实例:调用多个圈子同时调用贴子
下面讲解,在首页,如何调用圈子的同时也调用他们相关的贴子. 单单调用圈子,就像调用文章一样,很多人都能轻松实现,比如下面的代码 {qb:tag name="xxx" type=&q ...
- 齐博x1再来个抛砖引玉 内容页根据关键词调用相关内容 新功能哦!
昨天升级了一个隐藏的功能,今天就简单的做个说明怎么用,反正也不能浪费不是 那就用内容页面关键词读取相关内容为例吧. 前台是你模型中已经存在keywords字段 关键词支持 空格分割,号分割 那么就开 ...
- 齐博x1前台后台地址跳转的处理
系统有三个入口,分别是 admin.php index.php member.php 所以就不能简单的使用TP默认的 url() 函数 而插件跟频道模块又有所不同,下面先讲解最基本的频道模块当中如何使 ...
- 10.pygame-碰撞检测
添加并监听英雄发射子弹事件 class Hero(GameSprite): def __init__(self): # 调用父类方法,设置image super().__init__('./image ...