Python CPU监控案例如何监控CPU使用率

wen python案例 27

本文目录导读:

Python CPU监控案例如何监控CPU使用率

  1. 目录导读
  2. 引言:为什么需要监控CPU使用率?
  3. 核心原理:Python如何获取CPU使用率数据
  4. 实战一:基础版CPU监控脚本(使用psutil)
  5. 实战二:实时CPU监控与可视化(matplotlib + 循环)
  6. 实战三:多核CPU监控与异常告警(阈值触发 + 日志记录)
  7. 常见问题Q&A(附高频错误解决方案)
  8. 性能优化:如何降低监控脚本自身的CPU开销
  9. 总结与下一步建议

Python CPU监控实战:从零构建系统级CPU使用率监控工具

目录导读

  • 引言:为什么需要监控CPU使用率?
  • 核心原理:Python如何获取CPU使用率数据
  • 基础版CPU监控脚本(使用psutil)
  • 实时CPU监控与可视化(matplotlib + 循环)
  • 多核CPU监控与异常告警(阈值触发 + 日志记录)
  • 常见问题Q&A(附高频错误解决方案)
  • 性能优化:如何降低监控脚本自身的CPU开销
  • 总结与下一步建议

引言:为什么需要监控CPU使用率?

在现代服务器运维和应用程序开发中,CPU使用率是最核心的性能指标之一,高CPU使用率可能导致响应延迟、服务雪崩甚至系统崩溃,Python凭借其丰富的第三方库(如psutilostime),可以低成本实现跨平台的CPU监控,本文将基于官方文档和社区实践,从原理到代码,带你掌握三种不同层级的CPU监控方案。


核心原理:Python如何获取CPU使用率数据

操作系统通过/proc/stat(Linux)或GetSystemTimes(Windows)跟踪CPU时间片,Python的psutil库封装了这些底层调用,能够返回:

  • 整体CPU使用率:单次调用psutil.cpu_percent(interval=1)会阻塞1秒后返回均值
  • 每个CPU核心的使用率psutil.cpu_percent(percpu=True)
  • 时间模式psutil.cpu_times() 返回user、system、idle、iowait等细分数据

关键提醒interval参数若为0,则返回瞬时值(通常不准确);建议设为≥0.5秒以保证精度。


基础版CPU监控脚本(使用psutil)

适用场景:低频监控(如每5分钟记录一次)

import psutil
import time
def get_cpu_usage():
    # 返回0-100的浮点数
    return psutil.cpu_percent(interval=1)
if __name__ == "__main__":
    while True:
        cpu = get_cpu_usage()
        print(f"当前CPU使用率: {cpu}%")
        time.sleep(5)  # 每5秒采集一次

优化说明:实际生产环境建议将数据写入CSV或数据库,而非直接打印,可添加datetime时间戳。


实时CPU监控与可视化(matplotlib + 循环)

适用场景:本地开发调试、性能压测的实时曲线观察

import psutil
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def animate(i):
    cpu = psutil.cpu_percent(interval=0.5)
    data.append(cpu)
    if len(data) > 50:  # 保留最近50个点
        data.pop(0)
    ax.clear()
    ax.plot(data, label='CPU %')
    ax.legend(loc='upper right')
    ax.set_ylim(0, 100)
data = []
fig, ax = plt.subplots()
ani = animation.FuncAnimation(fig, animate, interval=500)
plt.show()

注意:matplotlib的animation模式在Linux终端可能不兼容,建议在Jupyter或带有GUI的环境中运行。


多核CPU监控与异常告警(阈值触发 + 日志记录)

核心需求:实时监控所有CPU核心,当任一核心使用率超过80%时记录日志并发送告警。

import psutil
import logging
import time
logging.basicConfig(filename='cpu_alarm.log', level=logging.WARNING,
                    format='%(asctime)s - %(message)s')
def monitor_all_cores(threshold=80, check_interval=2):
    while True:
        per_core = psutil.cpu_percent(interval=1, percpu=True)
        for idx, usage in enumerate(per_core):
            if usage > threshold:
                msg = f"CPU核心{idx} 使用率: {usage}% 超过阈值{threshold}%"
                logging.warning(msg)
                print(msg)  # 可替换为邮件/短信接口
        time.sleep(check_interval)
if __name__ == "__main__":
    monitor_all_cores()

扩展功能:可结合smtplib发送邮件告警,或调用企业微信/钉钉Webhook。


常见问题Q&A(附高频错误解决方案)

Q1:为什么我的cpu_percent()第一次调用返回0?
A:因为psutil使用差值计算,第一次调用无历史数据,会返回0,建议第一次调用忽略其值,或设置interval参数。

Q2:如何在无网络环境下监控远程服务器的CPU?
A:可以采用两种方案:

  • (方案A)在远程服务器部署上述Python脚本,通过paramikofabric定期拉取数据文件
  • (方案B)使用netmiko通过SSH获取远程命令top的输出,但精度较低

Q3:监控脚本自身占用CPU过高怎么办?
A:将interval参数提高(如从0.5秒改为2秒),并且不要在循环中频繁创建新对象(如文件句柄),使用time.sleep()而非continous poll

Q4:Windows系统下psutil安装失败?
A:请升级pip并安装VC++构建工具:

pip install --upgrade pip setuptools
pip install psutil

若仍失败,下载对应Python版本的预编译wheel包。


性能优化:如何降低监控脚本自身的CPU开销

  1. 调整采样间隔:生产环境建议30秒~1分钟,避免频繁上下文切换
  2. 使用进程级监控:只监控目标进程的CPU(p = psutil.Process(pid); p.cpu_percent(interval=1)
  3. 异步IO写入:将数据写入文件或数据库时使用aiofiles或队列(queue.Queue
  4. 避免重复计算:一次采集后复用cpu_times()cpu_count()等函数

优化后的采集函数:

def efficient_collect():
    cores = psutil.cpu_count()
    usage = psutil.cpu_percent(interval=2, percpu=True)
    return {"cores": cores, "usage": usage}

总结与下一步建议

通过本文的三个实战案例,你已经能实现:

  • 基础单点CPU监控
  • 实时可视化
  • 多核阈值告警

延伸方向

  • 结合sysstat(sar)或者Prometheus + Grafana构建企业级监控平台
  • 使用celery定时任务采集并存储到InfluxDB
  • 增加IO、内存、网络指标的联合监控(psutil.net_io_counters()

完整的监控方案不应仅依赖Python脚本,但在快速原型验证和小型项目中,Python+psutil是最灵活的组合。


注:本文所有代码已在Python 3.8+ / psutil 5.9版本下测试通过,如需部署到生产环境,建议使用supervisorsystemd守护进程。

抱歉,评论功能暂时关闭!