第九天 - 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;
}
 
八、扩展练习建议
-  
增加磁盘监控模块
- 显示各分区的使用情况
 - 添加磁盘空间预警功能
 
 -  
实现进程管理功能
- 显示占用资源最多的前5个进程
 - 添加进程终止按钮(谨慎实现)
 
 -  
添加报警通知
- 当CPU持续超过80%时发送邮件通知
 - 内存使用超过90%时触发桌面通知
 
 
九、常见问题解答
Q1: psutil需要管理员权限吗?
 A: 普通监控功能不需要,但某些高级功能(如获取完整进程列表)可能需要。
Q2: 数据刷新频率设置多少合适?
 A: 建议1-5秒,过高的频率会影响系统性能。
Q3: 如何部署到生产环境?
 A: 可以使用:
uvicorn main:app --host 0.0.0.0 --port 80 --workers 4
 
十、总结与资源推荐
通过本教程,我们完成了:
- 使用psutil采集系统数据
 - 利用FastAPI构建RESTful API
 - 开发动态更新的Web仪表盘
 - 实现数据可视化展示
 
扩展学习资源:
- psutil官方文档
 - FastAPI最佳实践
 - Chart.js数据可视化
 
