Python基础教程(七十六)常见第三方模块之psutil:Python系统监控神器,深度解析psutil模块及其实战应用

一行代码监控CPU,三行脚本追踪进程,Python运维自动化的秘密武器

一、psutil:系统监控的瑞士军刀

psutil(Process and System Utilities)是一个跨平台库,支持Linux、Windows、macOS等主流操作系统。它通过统一的API接口封装了系统底层资源数据,解决了开发者需要调用多平台命令行工具(如pstopnetstat)的碎片化问题。其核心优势在于:

  • 跨平台一致性:同一代码在Windows和Linux获取CPU使用率无需适配
  • 高性能低开销:C语言核心实现,资源占用远低于启动子进程执行命令
  • 进程级细粒度控制:支持进程创建、终止、资源追踪等全生命周期管理

安装仅需一行命令:

pip install psutil

二、核心功能深度解析

1. CPU监控:从宏观到微观
  • 逻辑与物理核心识别
    cpu_count(logical=False)返回物理核心数,logical=True则包含超线程虚拟核心:
import psutil
print(f"物理核心: {psutil.cpu_count(logical=False)}")  # 输出:物理核心: 8
  • 多维度时间统计
    cpu_times()返回命名元组,区分用户态(user)、内核态(system)、空闲(idle)等状态耗时:
times = psutil.cpu_times()
print(f"用户态耗时占比: {times.user / sum(times) * 100:.1f}%")
  • 实时使用率采样
    通过interval参数避免瞬时抖动,percpu可细分每个核心状态:
# 每1秒采样,输出各核心使用率列表
print(psutil.cpu_percent(interval=1, percpu=True)) 
# 示例输出:[12.3, 8.4, 15.1, 5.6]
2. 内存管理:突破物理限制
  • 虚拟内存精细化分析
    virtual_memory()返回结构包含缓冲(buffers)、缓存(cached)等常被忽视的指标:
mem = psutil.virtual_memory()
print(f"可用内存(含缓冲): {mem.available / 1024**3:.2f}GB")
  • Swap分区预警机制
    swap_memory().percent > 30%时需警惕内存瓶颈:
swap = psutil.swap_memory()
if swap.percent > 30:
    print("警告:交换空间过度使用!")
3. 磁盘与网络:I/O瓶颈定位
  • 分区使用率与IO关联分析
    结合disk_usage()disk_io_counters()定位高负载磁盘:
usage = psutil.disk_usage('/')
io = psutil.disk_io_counters(perdisk=True)['sda1']
print(f"sda1 写压力:{io.write_time / io.write_count:.2f} ms/次")
  • 网络异常包检测
    通过net_io_counters()捕获丢包与错误:
net = psutil.net_io_counters()
if net.errin > 0:
    print(f"网络入错包数:{net.errin}")
4. 进程控制:从监控到治理
  • 进程树资源追踪
    递归获取子进程资源总和:
def get_child_mem(pid):
    p = psutil.Process(pid)
    total_mem = p.memory_info().rss
    for child in p.children(recursive=True):
        total_mem += child.memory_info().rss
    return total_mem
  • 进程状态机操作
    支持挂起(suspend)、恢复(resume)、终止(terminate)等操作:
p = psutil.Process(1234)
if p.cpu_percent() > 90:
    p.terminate()  # CPU占用超90%时强制终止

三、实战场景:从监控到自动化

1. 实时系统仪表盘(终端版)
import psutil, time

while True:
    # 清屏并输出关键指标
    print("\033c", end="")  # Linux/Mac清屏
    print(f"CPU: {psutil.cpu_percent()}% | MEM: {psutil.virtual_memory().percent}%")
    print(f"DISK: {psutil.disk_usage('/').percent}% | NET: {psutil.net_io_counters().bytes_recv/1024:.1f}KB")
    time.sleep(1)
2. 进程资源记录器(CSV持久化)

监控指定进程并保存时序数据:

import sys, psutil, time

pid = int(sys.argv[1])
p = psutil.Process(pid)
with open(f"proc_{pid}.csv", "w") as f:
    f.write("time,cpu%,mem%\n")
    while True:
        t = time.strftime("%H:%M:%S")
        cpu = p.cpu_percent(interval=1)
        mem = p.memory_percent()
        f.write(f"{t},{cpu},{mem}\n")
3. 异常进程自动治理服务

当进程资源超阈值时自动重启:

def watchdog(pid, max_cpu=80, max_mem=20):
    p = psutil.Process(pid)
    while True:
        if p.cpu_percent() > max_cpu or p.memory_percent() > max_mem:
            p.terminate()
            new_proc = psutil.Popen(["python", "app.py"])  # 重启服务
            print(f"进程{pid}已重启,新PID: {new_proc.pid}")
        time.sleep(5)

四、高阶应用:集成生态

  1. Web可视化:集成Flask+ECharts,将psutil数据转为实时图表
  2. 告警系统:结合SMTP库在内存超限时邮件通知
  3. 容器监控:适配Docker环境获取容器内资源数据(需挂载/proc
  4. Grafana对接:通过Prometheus客户端上报指标

最佳实践提示:生产环境中建议设置interval≥1秒的采样间隔,避免高频调用导致性能损耗。

psutil以不到5MB的内存占用,实现了数十个命令行工具的功能聚合。其设计哲学印证了Python之禅:”简洁胜于复杂“—— 当一行代码能替代三行Shell脚本时,系统监控的终极形态已然显现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值