Python系统监控与运维指南:使用psutil模块

简介

psutil (process and system utilities) 是一个跨平台的轻量级高性能Python库,专门用于获取硬件、系统内核、进程的全方位信息,替代了传统需调用多个系统底层工具(如Linux的top/free、Windows的任务管理器、macOS的Activity Monitor)的复杂脚本。

它覆盖了CPU、内存、磁盘、网络、电池、进程、用户会话等10+类场景,且对Linux/Windows/macOS/FreeBSD/OpenBSD等主流系统的兼容性几乎做到了95%以上,是系统运维工程师、Python后端开发者(尤其是需要监控自身服务的)的必备工具。


安装

使用pip一行命令即可安装稳定版:

pip install psutil

如果是Linux/macOS遇到权限受限(比如安装到全局site-packages),可以加上sudo

sudo pip install psutil

核心功能速览

下面按运维/开发的高频需求,分模块展示核心代码:

1. CPU监控

静态/准静态信息

import psutil

# 逻辑CPU数量(超线程核心也算)
print(f"逻辑CPU数: {psutil.cpu_count()}")

# 物理核心数量
print(f"物理CPU核: {psutil.cpu_count(logical=False)}")

# CPU各状态的累计耗时(用户态/内核态/空闲等)
print(f"CPU累计时间统计: {psutil.cpu_times()}")

实时使用率

类似top的实时采样,可设置间隔和是否分核心:

# 连续5次采样(间隔1秒)
for i in range(5):
    # 分核心使用率
    core_percents = psutil.cpu_percent(interval=1, percpu=True)
    print(f"第{i+1}次 | 各核心: {[f'{p}%' for p in core_percents]}")
    
    # 总体使用率
    total_percent = psutil.cpu_percent(interval=1)
    print(f"       |  总体: {total_percent}%\n")

2. 内存监控

支持物理内存和交换区(Swap)的详细统计,所有数值默认以字节为单位:

# 物理内存
mem = psutil.virtual_memory()
print("=== 物理内存 ===")
print(f"总量: {mem.total / (1024**3):.2f} GB")  # 转GB
print(f"可用: {mem.available / (1024**3):.2f} GB")
print(f"使用率: {mem.percent}%")

# 交换区
swap = psutil.swap_memory()
print("\n=== 交换区 ===")
print(f"总量: {swap.total / (1024**3):.2f} GB")
print(f"使用率: {swap.percent}%")

3. 磁盘监控

分区与挂载点

print("=== 磁盘分区 ===")
for part in psutil.disk_partitions():
    # 过滤掉部分特殊文件系统(Windows/macOS的)
    if not part.fstype or part.mountpoint.startswith("/sys"):
        continue
    print(f"设备: {part.device}")
    print(f"挂载点: {part.mountpoint}")
    print(f"文件系统: {part.fstype}")

    # 分区使用情况
    usage = psutil.disk_usage(part.mountpoint)
    print(f"已用/总量: {usage.used / (1024**3):.2f}/{usage.total / (1024**3):.2f} GB")
    print(f"使用率: {usage.percent}%\n" + "-" * 40)

磁盘IO

disk_io = psutil.disk_io_counters()
print("=== 全局磁盘IO ===")
print(f"读取次数: {disk_io.read_count}")
print(f"写入次数: {disk_io.write_count}")
print(f"读取总量: {disk_io.read_bytes / (1024**3):.2f} GB")  # 大文件场景可用GB

4. 网络监控

全局IO与接口状态

# 全局网络IO
net_io = psutil.net_io_counters()
print("=== 全局网络IO ===")
print(f"发送: {net_io.bytes_sent / (1024**2):.2f} MB")
print(f"接收: {net_io.bytes_recv / (1024**2):.2f} MB\n")

# 所有网络接口
print("=== 网络接口 ===")
for name, stats in psutil.net_if_stats().items():
    # 过滤掉虚拟接口(如docker0)
    if not stats.isup or name.startswith("lo"):
        continue
    print(f"接口名: {name}")
    print(f"状态: {'启用' if stats.isup else '禁用'}")
    print(f"MTU: {stats.mtu}")
    print("-" * 30)

5. 进程管理

# 系统当前进程总数
print(f"系统进程数: {len(psutil.pids())}")

# 获取当前Python进程的信息
current_proc = psutil.Process()
print("\n=== 当前Python进程 ===")
print(f"PID: {current_proc.pid}")
print(f"进程名: {current_proc.name()}")
print(f"启动时间: {current_proc.create_time()}")

# 封装进程信息查询函数(带异常处理)
def get_safe_proc_info(pid):
    try:
        p = psutil.Process(pid)
        return {
            "pid": pid,
            "name": p.name(),
            "status": p.status(),
            "cpu_pct": p.cpu_percent(interval=0.1),  # 快速采样
            "mem_pct": p.memory_percent()
        }
    except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
        return None

# 打印前5个CPU占用最高的进程
print("\n=== 前5个CPU占用最高进程 ===")
top_procs = sorted(
    [get_safe_proc_info(pid) for pid in psutil.pids() if get_safe_proc_info(pid)],
    key=lambda x: x["cpu_pct"],
    reverse=True
)[:5]
for proc in top_procs:
    print(f"{proc['pid']}\t{proc['name']}\tCPU: {proc['cpu_pct']:.1f}%\tMem: {proc['mem_pct']:.1f}%")

实用技巧与注意事项

实用技巧

  1. 批量处理进程:优先用psutil.process_iter(),它的性能比遍历pids()再创建Process实例高30%以上
  2. 跨平台兼容:用hasattr(psutil, "xxx")先判断功能是否存在(比如笔记本的sensors_battery、Linux特有的sensors_temperatures
  3. 时间戳转人类可读格式:配合datetime.fromtimestamp()使用

注意事项

  1. 权限问题:某些功能(如查看其他用户的进程、获取所有网络连接)需要root/管理员权限
  2. 性能开销interval参数设置过小(<0.1秒)会增加CPU占用,长期监控建议用1-5秒的间隔
  3. 异常处理:必须覆盖NoSuchProcess(进程已退出)、AccessDenied(权限不足)、ZombieProcess(Linux僵尸进程)三类异常

总结

psutil通过简洁统一的API,解决了跨平台系统监控的痛点,是Python生态中系统工具类的“天花板”之一。无论是做临时的系统排查脚本,还是集成到后端服务的监控模块,它都能快速满足需求。

更多高级功能(如进程终止、网络连接详情、硬件传感器数据),可以参考psutil官方文档