当前位置: 首页 > news >正文

第九天 - psutil系统监控库 - 资源监控仪表盘 - 练习:实时CPU/Memory监控

使用Python打造实时资源监控仪表盘(psutil+FastAPI)

一、为什么要学习系统监控?

在软件开发中,系统资源监控是每个开发者都需要掌握的重要技能。无论是排查性能瓶颈、优化程序效率,还是确保服务稳定性,实时掌握CPU、内存、磁盘等关键指标都至关重要。

本教程将带您从零开始,使用Python生态中的两个强力工具:

  • psutil:跨平台系统信息监控库
  • FastAPI:现代高性能Web框架

最终实现一个具备以下功能的实时监控仪表盘:
✅ 实时CPU使用率监控
✅ 内存使用量可视化
✅ 历史数据趋势图表
✅ 动态刷新的Web界面


二、环境准备与工具安装

2.1 安装必要库

pip install psutil fastapi uvicorn jinja2 python-multipart

2.2 创建项目结构

monitor_dashboard/
├── main.py         # FastAPI主程序
├── templates/      # 前端模板
│   └── index.html
└── static/         # 静态资源├── style.css└── chart.js

三、psutil核心功能解析

3.1 基本使用示例

import psutil# 获取CPU信息
print(f"CPU核心数: {psutil.cpu_count(logical=False)}")
print(f"当前CPU使用率: {psutil.cpu_percent(interval=1)}%")# 获取内存信息
mem = psutil.virtual_memory()
print(f"内存总量: {mem.total / 1024**3:.2f}GB")
print(f"已用内存: {mem.used / 1024**3:.2f}GB")# 获取磁盘信息
disk = psutil.disk_usage('/')
print(f"磁盘总空间: {disk.total / 1024**3:.2f}GB")

3.2 关键API说明

功能API返回示例
CPU使用率cpu_percent(interval=1)15.6
内存信息virtual_memory()svmem(total=17064538112, …)
磁盘使用disk_usage(‘/’)sdiskusage(total=256GB, …)
网络流量net_io_counters()snetio(bytes_sent=1024MB…)

四、构建监控后端服务

4.1 FastAPI基础框架

from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templatesapp = FastAPI()
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")@app.get("/")
async def dashboard(request: Request):return templates.TemplateResponse("index.html", {"request": request})@app.get("/api/system_status")
async def get_system_status():return {"cpu_percent": psutil.cpu_percent(),"mem_used": psutil.virtual_memory().used,"mem_total": psutil.virtual_memory().total}

4.2 启动服务

uvicorn main:app --reload --port 8000

五、前端仪表盘开发

5.1 HTML基础结构

<!DOCTYPE html>
<html>
<head><title>系统监控仪表盘</title><link rel="stylesheet" href="/static/style.css">
</head>
<body><div class="container"><div class="card"><h2>CPU使用率</h2><div id="cpuChart" class="chart"></div><div id="cpuPercent" class="percent">0%</div></div><div class="card"><h2>内存使用</h2><div id="memChart" class="chart"></div><div class="mem-info"><span id="memUsed">0 GB</span> / <span id="memTotal">0 GB</span></div></div></div><script src="/static/chart.js"></script><script src="/static/app.js"></script>
</body>
</html>

5.2 实时数据更新逻辑

let cpuChart;  // 存储Chart实例async function updateData() {const response = await fetch('/api/system_status');const data = await response.json();// 更新CPUdocument.getElementById('cpuPercent').innerHTML = `${data.cpu_percent.toFixed(1)}%`;updateCpuChart(data.cpu_percent);// 更新内存const memUsed = (data.mem_used / 1024**3).toFixed(1);const memTotal = (data.mem_total / 1024**3).toFixed(1);document.getElementById('memUsed').textContent = `${memUsed}GB`;document.getElementById('memTotal').textContent = `${memTotal}GB`;updateMemChart(memUsed, memTotal);
}// 每2秒刷新一次
setInterval(updateData, 2000);

六、可视化图表实现

6.1 使用Chart.js绘制折线图

// 初始化CPU图表
function initCpuChart() {const ctx = document.getElementById('cpuChart').getContext('2d');cpuChart = new Chart(ctx, {type: 'line',data: {labels: [],datasets: [{label: 'CPU使用率',data: [],borderColor: '#4CAF50',tension: 0.1}]},options: {responsive: true,scales: {y: {min: 0,max: 100}}}});
}// 更新图表数据
function updateCpuChart(value) {const chart = cpuChart.data;chart.labels.push(new Date().toLocaleTimeString());chart.datasets[0].data.push(value);if (chart.labels.length > 20) {chart.labels.shift();chart.datasets[0].data.shift();}cpuChart.update();
}

七、完整项目优化

7.1 后端优化:添加历史数据缓存

from collections import deque# 存储最近60个数据点
history = {"cpu": deque(maxlen=60),"mem": deque(maxlen=60),"timestamps": deque(maxlen=60)
}@app.get("/api/history")
async def get_history():return {"timestamps": list(history["timestamps"]),"cpu": list(history["cpu"]),"mem": list(history["mem"])}

7.2 前端优化:响应式布局

.container {display: grid;grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));gap: 20px;padding: 20px;
}.card {background: #fff;border-radius: 10px;padding: 20px;box-shadow: 0 2px 15px rgba(0,0,0,0.1);
}.chart {height: 200px;margin: 15px 0;
}

八、扩展练习建议

  1. 增加磁盘监控模块

    • 显示各分区的使用情况
    • 添加磁盘空间预警功能
  2. 实现进程管理功能

    • 显示占用资源最多的前5个进程
    • 添加进程终止按钮(谨慎实现)
  3. 添加报警通知

    • 当CPU持续超过80%时发送邮件通知
    • 内存使用超过90%时触发桌面通知

九、常见问题解答

Q1: psutil需要管理员权限吗?
A: 普通监控功能不需要,但某些高级功能(如获取完整进程列表)可能需要。

Q2: 数据刷新频率设置多少合适?
A: 建议1-5秒,过高的频率会影响系统性能。

Q3: 如何部署到生产环境?
A: 可以使用:

uvicorn main:app --host 0.0.0.0 --port 80 --workers 4

十、总结与资源推荐

通过本教程,我们完成了:

  1. 使用psutil采集系统数据
  2. 利用FastAPI构建RESTful API
  3. 开发动态更新的Web仪表盘
  4. 实现数据可视化展示

扩展学习资源:

  • psutil官方文档
  • FastAPI最佳实践
  • Chart.js数据可视化
http://www.dtcms.com/a/564842.html

相关文章:

  • CentOS/AlmaLinux 9 中 SSH 服务启动失败:OpenSSL 版本不匹配解决
  • MAC-SQL 论文翻译
  • 海宁最火高端网站设计推荐crack wordpress
  • Kanass零基础学习,如何进行任务管理
  • 3 个诊断 Linux 服务器的脚本
  • Spring Boot Bean 生命周期注解深度解析:@PostConstruct 与 @PreDestroy 面试高频考点 + 实战案例
  • 深入浅出 Java 虚拟机之实战部分
  • 营销型网站建设的认识wordpress支持python吗
  • iOS 26 CPU 使用率监控策略 多工具协同构建性能探索体系
  • iOS 文件管理与导出实战,多工具协同打造高效数据访问与调试体系
  • 文件上传(vue3+element-plus+php)
  • Unity与iOS原生交互开发入门篇 - 打开iOS设置
  • Python循环continue与break
  • 网站开发 外包空心哪家网站设计比较好
  • Python scikit-learn详解:从入门到实战,机器学习的“瑞士军刀”
  • [论文阅读] AI+ | 从 “刚性科层” 到 “智能协同”:一文读懂 AI 应对国家安全风险的核心逻辑
  • 西安网站托管商家成都比较好的室内设计公司有哪些
  • Spark 中数据读取方式详解:SparkSQL(DataFrame)与 SparkCore(RDD)方法对比及实践
  • gta5线下买房网站建设公司logo是什么意思
  • Java面试场景题及答案总结(2025版持续更新)
  • Spring 异常处理机制:@ExceptionHandler、@ControllerAdvice
  • iTOP-RK3568OpenHarmony系统南向驱动开发手册
  • k8s-部署springboot容器化应用
  • Adobe Camera Raw 2026 全面解析:AI污点清除、雪景蒙版与变量调整深度评测
  • 网站制作平台能赚钱吗男女做羞羞的事视频网站
  • Intro.js 和 Driver.js
  • 水印攻击中(鲁棒性攻击、表达攻击、解释攻击)的区别,详细解释清楚
  • 14-循环神经网络(RNN):分析RNN在序列数据中的表现和特点
  • 深入浅出 Java 虚拟机之垃圾回收
  • 沧州市东光建设局 网站网站描述是什么