在Python开发中,我们经常需要监控系统硬件状态——无论是检查服务器负载、调试程序资源占用,还是开发硬件监控工具,获取CPU、内存、GPU等信息都是基础需求。今天介绍两个超实用的Python库:psutil(系统全方位监控)和gpustat(GPU状态专属工具),只需一行pip install psutil gpustat即可安装,轻松实现硬件信息的获取与分析。

一、为什么选择psutil和gpustat?

在没有这些库之前,我们可能需要:

  • 调用系统命令(如top/free/nvidia-smi)再解析输出,代码繁琐且跨平台兼容性差;

  • 面对不同硬件(如CPU核心数、GPU型号)编写适配逻辑,开发效率低。

psutilgpustat的优势在于:

  • 跨平台: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监控结束")

五、实战案例:简易系统监控工具

结合psutilgpustat,编写一个实时监控系统状态的脚本,每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监控已停止")

运行脚本后,会周期性输出系统状态,适合快速排查服务器负载问题。

六、总结与扩展

psutilgpustat的组合为Python开发者提供了便捷的硬件监控能力:

  • psutil覆盖CPU、内存、磁盘、网络等系统级监控,适合跨平台场景;

  • gpustat专注NVIDIA GPU监控,轻量且信息直观,适合AI训练、图形渲染等场景。

扩展方向:

  • 结合matplotlib绘制资源趋势图表;

  • 开发告警机制(如CPU使用率超80%时发送邮件);

  • 集成到Web框架(如Flask/Django),构建可视化监控面板。

只需一行pip install psutil gpustat,就能让你的Python程序拥有“感知”硬件的能力,无论是日常开发调试还是系统监控工具开发,它们都是不可或缺的利器。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐