用一行命令掌控硬件状态:psutil与gpustat实战指南
psutil和gpustatpsutil覆盖CPU、内存、磁盘、网络等系统级监控,适合跨平台场景;gpustat专注NVIDIA GPU监控,轻量且信息直观,适合AI训练、图形渲染等场景。扩展方向:结合matplotlib绘制资源趋势图表;开发告警机制(如CPU使用率超80%时发送邮件);集成到Web框架(如Flask/Django),构建可视化监控面板。只需一行,就能让你的Python程序拥有“
在Python开发中,我们经常需要监控系统硬件状态——无论是检查服务器负载、调试程序资源占用,还是开发硬件监控工具,获取CPU、内存、GPU等信息都是基础需求。今天介绍两个超实用的Python库:psutil(系统全方位监控)和gpustat(GPU状态专属工具),只需一行pip install psutil gpustat即可安装,轻松实现硬件信息的获取与分析。
一、为什么选择psutil和gpustat?
在没有这些库之前,我们可能需要:
-
调用系统命令(如
top/free/nvidia-smi)再解析输出,代码繁琐且跨平台兼容性差; -
面对不同硬件(如CPU核心数、GPU型号)编写适配逻辑,开发效率低。
而psutil和gpustat的优势在于:
-
跨平台:psutil支持Windows/Linux/macOS,无需修改代码即可在不同系统运行;
-
接口简洁:用Python原生语法调用,无需解析命令行输出;
-
信息全面:从CPU使用率到磁盘I/O,从内存占用到GPU负载,覆盖硬件监控全场景;
-
轻量高效:底层基于C实现,资源消耗低,适合长期监控。
二、安装与环境准备
1. 快速安装
直接通过pip安装,支持Python 3.6+:
pip install psutil gpustat
2. 特殊说明
-
psutil:无额外依赖,安装后即可使用; -
gpustat:依赖NVIDIA显卡驱动(需支持nvidia-smi),仅能在NVIDIA GPU环境下运行(AMD/Intel GPU暂不支持)。
三、psutil:系统硬件监控全能工具
psutil(process and system utilities)是系统监控的“瑞士军刀”,能获取CPU、内存、磁盘、网络等几乎所有系统信息。
1. CPU信息监控
(1)基本信息(核心数、型号)
import psutil
# CPU物理核心数(非超线程)
print("物理核心数:", psutil.cpu_count(logical=False)) # 示例:8
# CPU逻辑核心数(含超线程)
print("逻辑核心数:", psutil.cpu_count(logical=True)) # 示例:16
# CPU型号(需管理员权限,部分系统可能不支持)
try:
print("CPU型号:", psutil.cpu_info().brand) # 示例:Intel(R) Core(TM) i7-10700K CPU @ 3.80GHz
except AttributeError:
print("CPU型号:暂不支持当前系统")
(2)实时使用率监控
import time
# 单次获取CPU整体使用率(百分比)
print("CPU整体使用率:", psutil.cpu_percent(interval=1), "%") # interval=1表示等待1秒后获取
# 获取每个逻辑核心的使用率
print("各核心使用率:", psutil.cpu_percent(percpu=True, interval=1), "%") # 示例:[20.0, 15.0, ..., 5.0]
# 连续监控5秒(每1秒输出一次)
print("\n连续监控CPU使用率:")
for _ in range(5):
print(psutil.cpu_percent(interval=1), "%")
(3)CPU负载(平均负载)
反映CPU处理任务的繁忙程度,理想值≈逻辑核心数:
# 获取1分钟、5分钟、15分钟平均负载
print("CPU平均负载(1/5/15分钟):", psutil.getloadavg()) # 示例:(2.1, 1.8, 1.5)
2. 内存信息监控
(1)内存使用概况
# 获取内存完整信息(总容量、已用、可用等)
mem = psutil.virtual_memory()
print(f"总内存:{mem.total / 1024**3:.2f} GB") # 转换为GB
print(f"已用内存:{mem.used / 1024**3:.2f} GB")
print(f"可用内存:{mem.available / 1024**3:.2f} GB")
print(f"内存使用率:{mem.percent}%")
(2)交换内存(Swap)监控
类似Windows的“虚拟内存”,用于缓解物理内存不足:
swap = psutil.swap_memory()
print(f"交换内存总容量:{swap.total / 1024**3:.2f} GB")
print(f"交换内存使用率:{swap.percent}%")
3. 磁盘信息监控
(1)磁盘分区与使用率
# 获取所有磁盘分区
partitions = psutil.disk_partitions()
for part in partitions:
print(f"\n分区:{part.device}")
print(f"挂载点:{part.mountpoint}")
print(f"文件系统:{part.fstype}")
# 获取分区使用率(需排除CD-ROM等无数据的分区)
try:
usage = psutil.disk_usage(part.mountpoint)
print(f"总容量:{usage.total / 1024**3:.2f} GB")
print(f"使用率:{usage.percent}%")
except PermissionError:
print("无权限访问该分区")
(2)磁盘I/O性能
监控读写速度和操作次数:
# 获取磁盘总I/O信息
disk_io = psutil.disk_io_counters()
print(f"累计读次数:{disk_io.read_count}")
print(f"累计写次数:{disk_io.write_count}")
print(f"累计读字节:{disk_io.read_bytes / 1024**2:.2f} MB")
print(f"累计写字节:{disk_io.write_bytes / 1024**2:.2f} MB")
# 监控1秒内的I/O变化(实时速度)
io1 = psutil.disk_io_counters()
time.sleep(1)
io2 = psutil.disk_io_counters()
read_speed = (io2.read_bytes - io1.read_bytes) / 1024**2 # MB/s
write_speed = (io2.write_bytes - io1.write_bytes) / 1024**2
print(f"\n实时读速度:{read_speed:.2f} MB/s")
print(f"实时写速度:{write_speed:.2f} MB/s")
4. 网络信息监控
(1)网络流量统计
# 获取总网络I/O信息
net_io = psutil.net_io_counters()
print(f"累计接收字节:{net_io.bytes_recv / 1024**2:.2f} MB")
print(f"累计发送字节:{net_io.bytes_sent / 1024**2:.2f} MB")
print(f"累计接收包数:{net_io.packets_recv}")
print(f"累计发送包数:{net_io.packets_sent}")
# 监控1秒内的网络速度
net1 = psutil.net_io_counters()
time.sleep(1)
net2 = psutil.net_io_counters()
recv_speed = (net2.bytes_recv - net1.bytes_recv) / 1024**2 # MB/s
send_speed = (net2.bytes_sent - net1.bytes_sent) / 1024**2
print(f"\n实时下载速度:{recv_speed:.2f} MB/s")
print(f"实时上传速度:{send_speed:.2f} MB/s")
(2)网络接口信息
获取网卡IP、MAC等详细信息:
net_if_addrs = psutil.net_if_addrs() # 所有网络接口
net_if_stats = psutil.net_if_stats() # 接口状态(是否启用、速度等)
for iface, addrs in net_if_addrs.items():
# 过滤出物理网卡(排除回环地址)
if iface.startswith(("lo", "docker")):
continue
print(f"\n网卡:{iface}")
# 获取IPv4地址
for addr in addrs:
if addr.family == psutil.AF_LINK: # MAC地址
print(f"MAC地址:{addr.address}")
elif addr.family == psutil.AF_INET: # IPv4地址
print(f"IPv4地址:{addr.address}")
print(f"子网掩码:{addr.netmask}")
# 接口状态
stats = net_if_stats[iface]
print(f"是否启用:{'是' if stats.isup else '否'}")
print(f"速度:{stats.speed} Mbps") # 0表示未知
四、gpustat:GPU状态的轻量监控工具
gpustat是NVIDIA GPU专用监控工具,基于nvidia-smi封装,输出更简洁,且支持Python API调用。
1. 命令行快速查看
安装后可直接在终端运行gpustat命令,实时显示GPU状态:
gpustat # 基本信息
gpustat -cpu # 同时显示CPU使用率
gpustat -i 1 # 每秒刷新一次(监控模式)
输出示例(包含GPU型号、利用率、内存占用、温度等):
localhost Thu Oct 17 10:00:00 2024
[0] NVIDIA GeForce RTX 3080 | 60°C, 80% | 10240 / 10240 MB | user(70%)
2. 在Python中调用gpustat
(1)获取GPU基本信息
from gpustat import GPUStatCollection
# 获取所有GPU状态
gpus = GPUStatCollection.new_query()
for gpu in gpus:
print(f"\nGPU编号:{gpu.index}")
print(f"GPU型号:{gpu.name}")
print(f"利用率:{gpu.utilization}%")
print(f"内存使用:{gpu.memory_used} / {gpu.memory_total} MB")
print(f"温度:{gpu.temperature}°C")
print(f"当前运行进程:{[p['user'] for p in gpu.processes]}") # 占用GPU的用户
(2)实时监控GPU利用率
import time
print("实时监控GPU利用率(每2秒刷新):")
try:
while True:
gpus = GPUStatCollection.new_query()
for gpu in gpus:
print(f"GPU {gpu.index}:{gpu.utilization}%", end=" | ")
print() # 换行
time.sleep(2)
except KeyboardInterrupt:
print("\n监控结束")
五、实战案例:简易系统监控工具
结合psutil和gpustat,编写一个实时监控系统状态的脚本,每5秒输出一次关键指标:
import psutil
import time
from gpustat import GPUStatCollection
def monitor_system(interval=5):
while True:
print("="*50)
print(f"监控时间:{time.strftime('%Y-%m-%d %H:%M:%S')}")
# 1. CPU信息
cpu_percent = psutil.cpu_percent(interval=0.1)
print(f"CPU使用率:{cpu_percent}%")
# 2. 内存信息
mem = psutil.virtual_memory()
print(f"内存使用率:{mem.percent}% (已用:{mem.used/1024**3:.2f}GB)")
# 3. 网络速度
net1 = psutil.net_io_counters()
time.sleep(0.1)
net2 = psutil.net_io_counters()
recv_speed = (net2.bytes_recv - net1.bytes_recv) / 1024**2 * 10 # 转换为MB/s
send_speed = (net2.bytes_sent - net1.bytes_sent) / 1024**2 * 10
print(f"网络:下载 {recv_speed:.2f} MB/s | 上传 {send_speed:.2f} MB/s")
# 4. GPU信息(仅NVIDIA)
try:
gpus = GPUStatCollection.new_query()
for gpu in gpus:
print(f"GPU {gpu.index}:利用率 {gpu.utilization}% | 内存 {gpu.memory_used}/{gpu.memory_total} MB")
except Exception as e:
print(f"GPU监控:{str(e)}(可能非NVIDIA显卡或驱动未安装)")
time.sleep(interval)
if __name__ == "__main__":
try:
monitor_system(interval=5) # 每5秒监控一次
except KeyboardInterrupt:
print("\n监控已停止")
运行脚本后,会周期性输出系统状态,适合快速排查服务器负载问题。
六、总结与扩展
psutil和gpustat的组合为Python开发者提供了便捷的硬件监控能力:
-
psutil覆盖CPU、内存、磁盘、网络等系统级监控,适合跨平台场景; -
gpustat专注NVIDIA GPU监控,轻量且信息直观,适合AI训练、图形渲染等场景。
扩展方向:
-
结合
matplotlib绘制资源趋势图表; -
开发告警机制(如CPU使用率超80%时发送邮件);
-
集成到Web框架(如Flask/Django),构建可视化监控面板。
只需一行pip install psutil gpustat,就能让你的Python程序拥有“感知”硬件的能力,无论是日常开发调试还是系统监控工具开发,它们都是不可或缺的利器。
更多推荐



所有评论(0)