1. 项目概述为什么我们需要一个资源监控器最近在排查一个线上服务间歇性卡顿的问题时我又一次体会到了“监控”的重要性。当时的情况是用户偶尔反馈页面加载慢但登录服务器查看CPU和内存的使用率似乎都在正常范围内。这种“薛定谔的卡顿”最让人头疼因为你没有持续的数据来证明问题确实存在更无法定位到具体是哪个时间点、哪个进程导致了资源飙升。最终我不得不写了一个简单的脚本每隔几秒记录一次系统资源使用情况才抓到了某个后台定时任务在特定时刻内存泄漏的“现行”。这件事让我意识到无论是个人开发机、测试服务器还是小型的生产环境一个轻量级、可定制、能远程查看的资源监控工具都极其有用。它就像汽车的仪表盘让你不用每次都打开引擎盖登录服务器就能实时了解系统的“健康状况”。今天要分享的就是我用Python和ThingSpeak搭建的这样一个“计算机资源监控仪表盘”。这个方案的核心思路非常清晰用 Python 脚本周期性采集本机的 CPU 和内存使用率数据然后通过 HTTP POST 请求将这些数据发送到 ThingSpeak 这个免费的物联网数据平台进行存储和可视化。它特别适合以下几种场景一是个人开发者想监控自己电脑或树莓派等设备的资源消耗看看跑某个模型或脚本时到底吃了多少资源二是中小项目在初期没有搭建完整监控系统如 Prometheus Grafana时需要一个快速上线的临时监控方案三是作为教学案例因为它完美串联了 Python 系统监控、网络请求和数据可视化这几个实用技能点。整个项目代码量不大但涉及的知识点很扎实接下来我们就一步步拆解。2. 核心工具选型与原理剖析2.1 为什么是 Python选择 Python 作为实现语言几乎是顺理成章的。首先在系统监控和数据采集方面Python 的标准库psutil提供了跨平台的、统一的接口来获取 CPU、内存、磁盘、网络等详细信息几行代码就能搞定避免了直接调用系统命令解析输出的繁琐和平台差异。其次对于网络通信Python 的requests库让发送 HTTP POST 请求变得极其简单优雅远比用原生urllib省心。最后Python 脚本的轻量性和快速原型能力使得我们可以快速迭代和测试这个监控代理。这里需要强调一个关键点监控代理的自身资源消耗必须足够低。你不能让一个监控程序本身吃掉太多 CPU 和内存否则数据就失真了。Python 脚本在正常运行时资源占用极低尤其是在设置了合理的采集间隔比如每15-30秒一次后其影响可以忽略不计。这正是它适合作为轻量级监控客户端的原因。2.2 ThingSpeak免费的物联网数据枢纽ThingSpeak 是 MathWorks 公司推出的一个物联网数据分析平台。你可以把它理解为一个专门为时序数据设计的、带可视化功能的“云端数据库”。对于我们这个项目它提供了几个无法拒绝的优点完全免费每个免费账户可以创建多个通道Channel每个通道最多能容纳8个字段Field这对于监控 CPU、内存等几个核心指标绰绰有余。零服务器运维我们不需要自己购买服务器、部署数据库和前端图表服务。ThingSpeak 帮我们搞定了一切后端存储和前端展示的工作。开箱即用的可视化创建通道后每个字段会自动生成一个实时图表。我们发送数据后几乎立刻就能在网页上看到曲线图非常直观。简单的 API通过一个包含 API Key 的 HTTP POST 请求就能写入数据通过 GET 请求就能读取数据接口设计极其简洁。它的工作原理也很直观你在 ThingSpeak 上创建一个“通道”这个通道就像一张数据表有预定义的字段比如 field1 记录 CPUfield2 记录内存。每个字段随时间变化的值就是我们要绘制的曲线。写入数据需要唯一的“写 API Key”而读取数据和图表则可以通过公开的通道 ID 访问或者设置“读 API Key”进行保护。2.3 数据流架构设计整个系统的数据流非常清晰是一个典型的“采集-发送-展示”管道[本地计算机] --(Python脚本周期性采集)-- [资源数据] --(HTTP POST)-- [ThingSpeak平台] --(自动绘图)-- [Web图表]这个架构的轻量性体现在除了本地的 Python 脚本你不需要维护任何其他组件。所有数据的聚合、存储和可视化都托管在 ThingSpeak 云端。这种设计也带来了一个明显的优势你可以从任何能运行 Python 脚本并能访问互联网的设备上向同一个 ThingSpeak 通道发送数据。这意味着你可以用同一个仪表盘同时监控多台设备只需在脚本中稍作区分例如使用不同的字段或标签即可。3. 实战搭建从零开始一步步实现3.1 第一步准备 ThingSpeak 通道首先我们需要在云端建立一个“数据接收站”。注册与登录访问 ThingSpeak 官网用邮箱注册一个免费账户并登录。创建新通道点击 “Channels” - “My Channels” - “New Channel”。配置通道信息Name: 起一个名字比如 “My Computer Resource Monitor”。Description: 简单描述如 “Monitoring CPU and Memory usage”。字段Fields这是我们存储数据的关键。至少启用两个字段Field 1: 命名为 “CPU Usage (%)”用于记录 CPU 使用率百分比。Field 2: 命名为 “Memory Usage (%)”用于记录内存使用率百分比。可选你可以增加 Field 3 记录 CPU 温度Field 4 记录可用磁盘空间等。保存通道点击 “Save Channel” 完成创建。创建成功后进入通道页面你会看到两个空白的图表。最关键的一步来了点击 “API Keys” 标签页这里你会看到两串重要的密钥Write API Key这是用来向通道写入数据的“密码”必须妥善保管不能泄露。我们的 Python 脚本将使用它。Channel ID你的通道唯一标识用于公开读取数据和图表。注意Write API Key是私密的相当于你家的门禁密码。千万不要把它提交到公开的代码仓库如 GitHub。我们稍后会通过环境变量来安全地管理它。3.2 第二步编写 Python 监控脚本现在我们来编写核心的采集与发送脚本。确保你的 Python 环境已经安装了必要的库pip install psutil requests。import psutil import requests import time from datetime import datetime import os # 配置参数 THINGSPEAK_API_URL https://api.thingspeak.com/update # 重要从环境变量读取API Key避免硬编码在代码中 THINGSPEAK_WRITE_API_KEY os.environ.get(THINGSPEAK_API_KEY) CHANNEL_ID YOUR_CHANNEL_ID # 你的通道ID可从ThingSpeak页面获取 # 检查API Key是否设置 if not THINGSPEAK_WRITE_API_KEY: print(错误未设置环境变量 THINGSPEAK_API_KEY。) print(请执行export THINGSPEAK_API_KEY你的写API密钥 (Linux/macOS)) print(或set THINGSPEAK_API_KEY你的写API密钥 (Windows)) exit(1) def get_system_stats(): 获取当前系统CPU和内存使用率 # CPU使用率interval参数表示采样间隔秒percpuFalse表示获取整体使用率 cpu_percent psutil.cpu_percent(interval1, percpuFalse) # 内存使用率virtual_memory()返回一个对象.percent属性即使用率百分比 memory_info psutil.virtual_memory() memory_percent memory_info.percent # 可选获取更详细的信息如内存总量、已用量字节可以转换为MB/GB便于阅读 # memory_total_gb round(memory_info.total / (1024**3), 2) # memory_used_gb round(memory_info.used / (1024**3), 2) return cpu_percent, memory_percent def send_to_thingspeak(cpu, mem): 将数据发送到ThingSpeak # 构建POST请求的载荷payload payload { api_key: THINGSPEAK_WRITE_API_KEY, field1: cpu, field2: mem } try: response requests.post(THINGSPEAK_API_URL, datapayload, timeout10) if response.status_code 200: # ThingSpeak成功接收数据后会返回一个entry_id print(f[{datetime.now().strftime(%Y-%m-%d %H:%M:%S)}] 数据发送成功。CPU: {cpu}%, Mem: {mem}%) else: print(f发送失败状态码{response.status_code}, 响应{response.text}) except requests.exceptions.RequestException as e: print(f网络请求异常{e}) def main(interval_seconds30): 主循环每隔指定时间采集并发送一次数据 print(f开始监控系统资源每 {interval_seconds} 秒上报一次...) print(fThingSpeak 通道ID: {CHANNEL_ID}) print(按 CtrlC 终止程序。) try: while True: cpu_usage, mem_usage get_system_stats() send_to_thingspeak(cpu_usage, mem_usage) # 等待下一个采集周期 time.sleep(interval_seconds) except KeyboardInterrupt: print(\n监控程序已停止。) if __name__ __main__: # 设置上报间隔为30秒。对于资源监控这个频率足够且不会对ThingSpeak免费账户造成请求压力。 main(interval_seconds30)代码关键点解析psutil.cpu_percent(interval1)这里的interval1非常重要。psutil计算 CPU 百分比是基于一个时间间隔内的利用率。如果interval0或忽略它返回的是自上次调用以来的瞬时利用率这在系统空闲时可能不准确。设置interval1让psutil阻塞1秒来采样得到的结果更能代表过去1秒内的平均负载数据更平滑。环境变量管理 API Key这是安全编码的基本实践。我们通过os.environ.get(THINGSPEAK_API_KEY)来获取密钥。你需要在运行脚本前在终端中设置这个环境变量。错误处理与日志脚本包含了网络请求的异常捕获try-except和状态码检查。每次成功发送后会在控制台打印一条带时间戳的记录方便你确认脚本在正常工作。间隔时间选择interval_seconds30是一个平衡的选择。ThingSpeak 免费账户对更新频率有限制每个通道每15秒才能更新一次。设置30秒既能满足监控的实时性要求又留出了安全余量避免因请求过快被限制。3.3 第三步运行脚本并查看数据设置环境变量并运行在 Linux/macOS 的终端中export THINGSPEAK_API_KEY你的写API密钥 python3 resource_monitor.py在 Windows 的命令提示符或 PowerShell 中set THINGSPEAK_API_KEY你的写API密钥 python resource_monitor.py更永久的设置方法是把环境变量添加到系统或用户配置中。观察控制台输出如果一切正常你会看到类似[2023-10-27 14:30:00] 数据发送成功。CPU: 12.5%, Mem: 67.2%的信息每隔30秒出现一次。查看 ThingSpeak 图表打开你的 ThingSpeak 通道页面稍等片刻最多1-2个上报周期你就会看到Field 1和Field 2的图表上开始出现数据点并连成线。你可以清晰地看到 CPU 和内存使用率随时间变化的曲线。4. 功能增强与个性化定制基础版本已经能工作但一个健壮的监控工具还需要更多功能。下面是一些实用的增强方向。4.1 监控更多指标psutil库非常强大可以轻松获取更多信息。我们可以在get_system_stats函数中增加采集逻辑并在send_to_thingspeak的payload中增加对应的字段如field3,field4。def get_detailed_stats(): 获取更详细的系统统计信息 stats {} # 1. CPU stats[cpu_percent] psutil.cpu_percent(interval1) # 获取每个逻辑CPU核心的使用率列表 stats[cpu_percent_per_core] psutil.cpu_percent(interval1, percpuTrue) # 2. 内存 mem psutil.virtual_memory() stats[mem_percent] mem.percent stats[mem_used_gb] round(mem.used / (1024**3), 2) stats[mem_total_gb] round(mem.total / (1024**3), 2) # 3. 交换空间Swap swap psutil.swap_memory() stats[swap_percent] swap.percent # 4. 磁盘使用率默认监控根分区 / disk psutil.disk_usage(/) stats[disk_percent] disk.percent stats[disk_free_gb] round(disk.free / (1024**3), 2) # 5. 网络I/O自系统启动以来的累计值可计算差值得到速率 net_io psutil.net_io_counters() stats[net_bytes_sent] net_io.bytes_sent stats[net_bytes_recv] net_io.bytes_recv return stats要发送这些数据你需要先在 ThingSpeak 通道设置中启用更多的字段Field 3, Field 4...并相应修改send_to_thingspeak函数。注意免费账户最多8个字段。4.2 实现异常报警机制单纯的记录还不够我们希望在资源使用超过阈值时能收到通知。ThingSpeak 本身支持通过 “React” 应用发送邮件或触发 Webhook但配置稍复杂。一个更简单直接的方法是在 Python 脚本中实现报警逻辑。我们可以修改主循环在采集数据后立即判断def check_and_alert(cpu, mem, cpu_threshold80, mem_threshold90): 检查资源使用是否超过阈值并触发本地报警 alerts [] if cpu cpu_threshold: alerts.append(fCPU使用率过高: {cpu}% (阈值: {cpu_threshold}%)) if mem mem_threshold: alerts.append(f内存使用率过高: {mem}% (阈值: {mem_threshold}%)) if alerts: # 这里可以实现多种报警方式 # 1. 打印到控制台并高亮显示 print(f\033[91m【警告】{datetime.now()} - {; .join(alerts)}\033[0m) # 2. 写入本地日志文件 with open(monitor_alert.log, a) as f: f.write(f{datetime.now()} - {; .join(alerts)}\n) # 3. 高级调用发送邮件的函数或发送消息到即时通讯工具如 Slack/钉钉 # send_email_alert(alerts) # send_slack_alert(alerts)然后在main函数的循环中调用check_and_alert(cpu_usage, mem_usage)。这样当资源吃紧时你会在运行脚本的终端看到红色的警告信息同时警告会被记录到本地文件便于追溯。4.3 让脚本在后台持续运行我们不可能一直开着终端窗口。在 Linux/macOS 系统上可以使用nohup或systemd服务让脚本在后台运行。在 Windows 上可以将其设置为计划任务或使用pythonw.exe。Linux/macOS 使用 nohup (最简单)nohup python3 resource_monitor.py monitor.log 21 这条命令会让脚本在后台运行并将所有输出包括打印信息和错误重定向到monitor.log文件。你可以用tail -f monitor.log来实时查看日志。更优雅的方式创建 systemd 服务 (Linux)创建一个服务文件如/etc/systemd/system/resource-monitor.service[Unit] DescriptionThingSpeak Resource Monitor Afternetwork.target [Service] Typesimple Useryour_username EnvironmentTHINGSPEAK_API_KEY你的写API密钥 WorkingDirectory/path/to/your/script ExecStart/usr/bin/python3 /path/to/your/script/resource_monitor.py Restarton-failure RestartSec10 [Install] WantedBymulti-user.target然后运行sudo systemctl daemon-reload sudo systemctl start resource-monitor sudo systemctl enable resource-monitor # 开机自启使用systemctl status resource-monitor查看运行状态。这种方式管理起来更专业支持开机启动、自动重启。5. 常见问题与故障排除实录在实际部署和运行过程中你可能会遇到以下问题。这里记录了我踩过的坑和解决方案。5.1 数据发送失败或延迟问题现象脚本控制台提示发送失败或者 ThingSpeak 图表上数据点更新不及时出现长时间空白。排查思路与解决网络连接问题这是最常见的原因。脚本中的requests.post设置了timeout10如果网络不通或 ThingSpeak API 服务暂时不可用会抛出异常并被捕获打印。首先检查你的设备是否能正常访问https://api.thingspeak.com。API Key 错误仔细核对THINGSPEAK_WRITE_API_KEY是否与通道的 “Write API Key” 完全一致包括大小写。确保环境变量已正确设置可以通过在脚本开头打印其值部分掩码来调试print(fUsing API Key: {THINGSPEAK_WRITE_API_KEY[:5]}...)。ThingSpeak 免费账户限制这是最容易忽略的一点。ThingSpeak 免费账户限制每个通道每15秒才能更新一次数据。如果你的脚本上报间隔interval_seconds小于15秒后续的请求会被忽略导致数据丢失。务必确保你的脚本循环间隔 16秒建议设为20或30秒以留出余量。字段不匹配确保send_to_thingspeak函数中payload里的field1、field2与你在 ThingSpeak 通道里创建和命名的字段顺序对应。如果通道里 Field 1 是内存Field 2 是 CPU而你的脚本却把 CPU 数据发给了field1那图表显示就全乱了。5.2 监控数据不准或异常问题现象CPU 使用率始终显示为 0% 或 100%内存数据看起来不合理。排查思路与解决CPU 使用率为 0%这通常是因为第一次调用psutil.cpu_percent()时没有设置interval参数或设置为0。psutil需要在两次调用之间有一个时间间隔来计算百分比。务必在首次调用时设置interval参数如cpu_percent psutil.cpu_percent(interval1)。这个调用会阻塞1秒但能获得准确的初始值。后续在循环中调用时如果不希望再次阻塞可以使用psutil.cpu_percent(intervalNone)它会计算自上次调用以来的利用率。内存计算的理解差异psutil.virtual_memory().percent计算的是已用内存占总内存的百分比。这里的“已用内存”通常不包括 buffers 和 cached 内存因为后者在系统需要时可以快速释放。所以即使你的任务管理器显示内存用了很多但percent可能不高因为大部分可能是缓存。这是正常的Linux/Unix 系统的内存管理策略就是尽可能利用内存做缓存。如果你想监控“包括缓存”的内存压力可以计算(total - available) / total * 100其中available是psutil.virtual_memory().available。脚本自身资源消耗虽然很小但也要注意。如果你的采集间隔太短比如1秒脚本频繁调用psutil和发起网络请求可能会轻微拉高 CPU 和网络使用率。对于长期监控30秒或1分钟的间隔是更合理的选择。5.3 如何长期运行与维护问题脚本运行几天或几周后可能会因为各种原因停止如何保证其持续运行经验与建议使用进程守护工具如前所述在 Linux 上使用systemd是首选。它提供了强大的进程管理能力崩溃自动重启、日志管理、开机自启等。在 Windows 上可以将其包装为 “Windows Service”或者使用更轻量的第三方工具如NSSM。加入心跳和自检可以在脚本中增加一个简单的“心跳”机制。例如每成功发送100次数据后就在日志里记录一条“服务运行正常”的信息。或者定期检查自身进程是否健康。日志轮转如果使用nohup并将输出重定向到文件日志文件会无限增长。需要配置日志轮转log rotation。对于systemd服务可以使用journalctl来查看和管理日志它自带轮转功能。如果自己写文件可以考虑使用 Python 的logging.handlers.RotatingFileHandler。监控脚本的监控器有点“套娃”但可以考虑写一个更简单的“看门狗”脚本定期检查主监控脚本的进程是否存在如果不存在就拉起它。或者利用 ThingSpeak 本身让监控脚本定期向一个特定的字段如field8发送一个固定值如1作为心跳信号。你可以在 ThingSpeak 上设置一个 React如果这个心跳信号超过一定时间比如10分钟没有更新就触发报警通知你监控脚本可能挂了。这个基于 Python 和 ThingSpeak 的资源监控方案从构思到实现再到优化和排错整个过程就像搭积木一样把几个简单可靠的组件组合起来解决了一个实际的需求。它可能没有企业级监控系统那么功能强大但其轻量、快速、零成本的优势对于个人开发者、学生或小团队来说往往正是最需要的。当你看到自己服务器资源波动的曲线第一次清晰地展现在网页上时那种对系统“了如指掌”的感觉就是技术带来的最直接的成就感。
Python+ThingSpeak搭建轻量级系统资源监控仪表盘
发布时间:2026/6/24 21:51:48
1. 项目概述为什么我们需要一个资源监控器最近在排查一个线上服务间歇性卡顿的问题时我又一次体会到了“监控”的重要性。当时的情况是用户偶尔反馈页面加载慢但登录服务器查看CPU和内存的使用率似乎都在正常范围内。这种“薛定谔的卡顿”最让人头疼因为你没有持续的数据来证明问题确实存在更无法定位到具体是哪个时间点、哪个进程导致了资源飙升。最终我不得不写了一个简单的脚本每隔几秒记录一次系统资源使用情况才抓到了某个后台定时任务在特定时刻内存泄漏的“现行”。这件事让我意识到无论是个人开发机、测试服务器还是小型的生产环境一个轻量级、可定制、能远程查看的资源监控工具都极其有用。它就像汽车的仪表盘让你不用每次都打开引擎盖登录服务器就能实时了解系统的“健康状况”。今天要分享的就是我用Python和ThingSpeak搭建的这样一个“计算机资源监控仪表盘”。这个方案的核心思路非常清晰用 Python 脚本周期性采集本机的 CPU 和内存使用率数据然后通过 HTTP POST 请求将这些数据发送到 ThingSpeak 这个免费的物联网数据平台进行存储和可视化。它特别适合以下几种场景一是个人开发者想监控自己电脑或树莓派等设备的资源消耗看看跑某个模型或脚本时到底吃了多少资源二是中小项目在初期没有搭建完整监控系统如 Prometheus Grafana时需要一个快速上线的临时监控方案三是作为教学案例因为它完美串联了 Python 系统监控、网络请求和数据可视化这几个实用技能点。整个项目代码量不大但涉及的知识点很扎实接下来我们就一步步拆解。2. 核心工具选型与原理剖析2.1 为什么是 Python选择 Python 作为实现语言几乎是顺理成章的。首先在系统监控和数据采集方面Python 的标准库psutil提供了跨平台的、统一的接口来获取 CPU、内存、磁盘、网络等详细信息几行代码就能搞定避免了直接调用系统命令解析输出的繁琐和平台差异。其次对于网络通信Python 的requests库让发送 HTTP POST 请求变得极其简单优雅远比用原生urllib省心。最后Python 脚本的轻量性和快速原型能力使得我们可以快速迭代和测试这个监控代理。这里需要强调一个关键点监控代理的自身资源消耗必须足够低。你不能让一个监控程序本身吃掉太多 CPU 和内存否则数据就失真了。Python 脚本在正常运行时资源占用极低尤其是在设置了合理的采集间隔比如每15-30秒一次后其影响可以忽略不计。这正是它适合作为轻量级监控客户端的原因。2.2 ThingSpeak免费的物联网数据枢纽ThingSpeak 是 MathWorks 公司推出的一个物联网数据分析平台。你可以把它理解为一个专门为时序数据设计的、带可视化功能的“云端数据库”。对于我们这个项目它提供了几个无法拒绝的优点完全免费每个免费账户可以创建多个通道Channel每个通道最多能容纳8个字段Field这对于监控 CPU、内存等几个核心指标绰绰有余。零服务器运维我们不需要自己购买服务器、部署数据库和前端图表服务。ThingSpeak 帮我们搞定了一切后端存储和前端展示的工作。开箱即用的可视化创建通道后每个字段会自动生成一个实时图表。我们发送数据后几乎立刻就能在网页上看到曲线图非常直观。简单的 API通过一个包含 API Key 的 HTTP POST 请求就能写入数据通过 GET 请求就能读取数据接口设计极其简洁。它的工作原理也很直观你在 ThingSpeak 上创建一个“通道”这个通道就像一张数据表有预定义的字段比如 field1 记录 CPUfield2 记录内存。每个字段随时间变化的值就是我们要绘制的曲线。写入数据需要唯一的“写 API Key”而读取数据和图表则可以通过公开的通道 ID 访问或者设置“读 API Key”进行保护。2.3 数据流架构设计整个系统的数据流非常清晰是一个典型的“采集-发送-展示”管道[本地计算机] --(Python脚本周期性采集)-- [资源数据] --(HTTP POST)-- [ThingSpeak平台] --(自动绘图)-- [Web图表]这个架构的轻量性体现在除了本地的 Python 脚本你不需要维护任何其他组件。所有数据的聚合、存储和可视化都托管在 ThingSpeak 云端。这种设计也带来了一个明显的优势你可以从任何能运行 Python 脚本并能访问互联网的设备上向同一个 ThingSpeak 通道发送数据。这意味着你可以用同一个仪表盘同时监控多台设备只需在脚本中稍作区分例如使用不同的字段或标签即可。3. 实战搭建从零开始一步步实现3.1 第一步准备 ThingSpeak 通道首先我们需要在云端建立一个“数据接收站”。注册与登录访问 ThingSpeak 官网用邮箱注册一个免费账户并登录。创建新通道点击 “Channels” - “My Channels” - “New Channel”。配置通道信息Name: 起一个名字比如 “My Computer Resource Monitor”。Description: 简单描述如 “Monitoring CPU and Memory usage”。字段Fields这是我们存储数据的关键。至少启用两个字段Field 1: 命名为 “CPU Usage (%)”用于记录 CPU 使用率百分比。Field 2: 命名为 “Memory Usage (%)”用于记录内存使用率百分比。可选你可以增加 Field 3 记录 CPU 温度Field 4 记录可用磁盘空间等。保存通道点击 “Save Channel” 完成创建。创建成功后进入通道页面你会看到两个空白的图表。最关键的一步来了点击 “API Keys” 标签页这里你会看到两串重要的密钥Write API Key这是用来向通道写入数据的“密码”必须妥善保管不能泄露。我们的 Python 脚本将使用它。Channel ID你的通道唯一标识用于公开读取数据和图表。注意Write API Key是私密的相当于你家的门禁密码。千万不要把它提交到公开的代码仓库如 GitHub。我们稍后会通过环境变量来安全地管理它。3.2 第二步编写 Python 监控脚本现在我们来编写核心的采集与发送脚本。确保你的 Python 环境已经安装了必要的库pip install psutil requests。import psutil import requests import time from datetime import datetime import os # 配置参数 THINGSPEAK_API_URL https://api.thingspeak.com/update # 重要从环境变量读取API Key避免硬编码在代码中 THINGSPEAK_WRITE_API_KEY os.environ.get(THINGSPEAK_API_KEY) CHANNEL_ID YOUR_CHANNEL_ID # 你的通道ID可从ThingSpeak页面获取 # 检查API Key是否设置 if not THINGSPEAK_WRITE_API_KEY: print(错误未设置环境变量 THINGSPEAK_API_KEY。) print(请执行export THINGSPEAK_API_KEY你的写API密钥 (Linux/macOS)) print(或set THINGSPEAK_API_KEY你的写API密钥 (Windows)) exit(1) def get_system_stats(): 获取当前系统CPU和内存使用率 # CPU使用率interval参数表示采样间隔秒percpuFalse表示获取整体使用率 cpu_percent psutil.cpu_percent(interval1, percpuFalse) # 内存使用率virtual_memory()返回一个对象.percent属性即使用率百分比 memory_info psutil.virtual_memory() memory_percent memory_info.percent # 可选获取更详细的信息如内存总量、已用量字节可以转换为MB/GB便于阅读 # memory_total_gb round(memory_info.total / (1024**3), 2) # memory_used_gb round(memory_info.used / (1024**3), 2) return cpu_percent, memory_percent def send_to_thingspeak(cpu, mem): 将数据发送到ThingSpeak # 构建POST请求的载荷payload payload { api_key: THINGSPEAK_WRITE_API_KEY, field1: cpu, field2: mem } try: response requests.post(THINGSPEAK_API_URL, datapayload, timeout10) if response.status_code 200: # ThingSpeak成功接收数据后会返回一个entry_id print(f[{datetime.now().strftime(%Y-%m-%d %H:%M:%S)}] 数据发送成功。CPU: {cpu}%, Mem: {mem}%) else: print(f发送失败状态码{response.status_code}, 响应{response.text}) except requests.exceptions.RequestException as e: print(f网络请求异常{e}) def main(interval_seconds30): 主循环每隔指定时间采集并发送一次数据 print(f开始监控系统资源每 {interval_seconds} 秒上报一次...) print(fThingSpeak 通道ID: {CHANNEL_ID}) print(按 CtrlC 终止程序。) try: while True: cpu_usage, mem_usage get_system_stats() send_to_thingspeak(cpu_usage, mem_usage) # 等待下一个采集周期 time.sleep(interval_seconds) except KeyboardInterrupt: print(\n监控程序已停止。) if __name__ __main__: # 设置上报间隔为30秒。对于资源监控这个频率足够且不会对ThingSpeak免费账户造成请求压力。 main(interval_seconds30)代码关键点解析psutil.cpu_percent(interval1)这里的interval1非常重要。psutil计算 CPU 百分比是基于一个时间间隔内的利用率。如果interval0或忽略它返回的是自上次调用以来的瞬时利用率这在系统空闲时可能不准确。设置interval1让psutil阻塞1秒来采样得到的结果更能代表过去1秒内的平均负载数据更平滑。环境变量管理 API Key这是安全编码的基本实践。我们通过os.environ.get(THINGSPEAK_API_KEY)来获取密钥。你需要在运行脚本前在终端中设置这个环境变量。错误处理与日志脚本包含了网络请求的异常捕获try-except和状态码检查。每次成功发送后会在控制台打印一条带时间戳的记录方便你确认脚本在正常工作。间隔时间选择interval_seconds30是一个平衡的选择。ThingSpeak 免费账户对更新频率有限制每个通道每15秒才能更新一次。设置30秒既能满足监控的实时性要求又留出了安全余量避免因请求过快被限制。3.3 第三步运行脚本并查看数据设置环境变量并运行在 Linux/macOS 的终端中export THINGSPEAK_API_KEY你的写API密钥 python3 resource_monitor.py在 Windows 的命令提示符或 PowerShell 中set THINGSPEAK_API_KEY你的写API密钥 python resource_monitor.py更永久的设置方法是把环境变量添加到系统或用户配置中。观察控制台输出如果一切正常你会看到类似[2023-10-27 14:30:00] 数据发送成功。CPU: 12.5%, Mem: 67.2%的信息每隔30秒出现一次。查看 ThingSpeak 图表打开你的 ThingSpeak 通道页面稍等片刻最多1-2个上报周期你就会看到Field 1和Field 2的图表上开始出现数据点并连成线。你可以清晰地看到 CPU 和内存使用率随时间变化的曲线。4. 功能增强与个性化定制基础版本已经能工作但一个健壮的监控工具还需要更多功能。下面是一些实用的增强方向。4.1 监控更多指标psutil库非常强大可以轻松获取更多信息。我们可以在get_system_stats函数中增加采集逻辑并在send_to_thingspeak的payload中增加对应的字段如field3,field4。def get_detailed_stats(): 获取更详细的系统统计信息 stats {} # 1. CPU stats[cpu_percent] psutil.cpu_percent(interval1) # 获取每个逻辑CPU核心的使用率列表 stats[cpu_percent_per_core] psutil.cpu_percent(interval1, percpuTrue) # 2. 内存 mem psutil.virtual_memory() stats[mem_percent] mem.percent stats[mem_used_gb] round(mem.used / (1024**3), 2) stats[mem_total_gb] round(mem.total / (1024**3), 2) # 3. 交换空间Swap swap psutil.swap_memory() stats[swap_percent] swap.percent # 4. 磁盘使用率默认监控根分区 / disk psutil.disk_usage(/) stats[disk_percent] disk.percent stats[disk_free_gb] round(disk.free / (1024**3), 2) # 5. 网络I/O自系统启动以来的累计值可计算差值得到速率 net_io psutil.net_io_counters() stats[net_bytes_sent] net_io.bytes_sent stats[net_bytes_recv] net_io.bytes_recv return stats要发送这些数据你需要先在 ThingSpeak 通道设置中启用更多的字段Field 3, Field 4...并相应修改send_to_thingspeak函数。注意免费账户最多8个字段。4.2 实现异常报警机制单纯的记录还不够我们希望在资源使用超过阈值时能收到通知。ThingSpeak 本身支持通过 “React” 应用发送邮件或触发 Webhook但配置稍复杂。一个更简单直接的方法是在 Python 脚本中实现报警逻辑。我们可以修改主循环在采集数据后立即判断def check_and_alert(cpu, mem, cpu_threshold80, mem_threshold90): 检查资源使用是否超过阈值并触发本地报警 alerts [] if cpu cpu_threshold: alerts.append(fCPU使用率过高: {cpu}% (阈值: {cpu_threshold}%)) if mem mem_threshold: alerts.append(f内存使用率过高: {mem}% (阈值: {mem_threshold}%)) if alerts: # 这里可以实现多种报警方式 # 1. 打印到控制台并高亮显示 print(f\033[91m【警告】{datetime.now()} - {; .join(alerts)}\033[0m) # 2. 写入本地日志文件 with open(monitor_alert.log, a) as f: f.write(f{datetime.now()} - {; .join(alerts)}\n) # 3. 高级调用发送邮件的函数或发送消息到即时通讯工具如 Slack/钉钉 # send_email_alert(alerts) # send_slack_alert(alerts)然后在main函数的循环中调用check_and_alert(cpu_usage, mem_usage)。这样当资源吃紧时你会在运行脚本的终端看到红色的警告信息同时警告会被记录到本地文件便于追溯。4.3 让脚本在后台持续运行我们不可能一直开着终端窗口。在 Linux/macOS 系统上可以使用nohup或systemd服务让脚本在后台运行。在 Windows 上可以将其设置为计划任务或使用pythonw.exe。Linux/macOS 使用 nohup (最简单)nohup python3 resource_monitor.py monitor.log 21 这条命令会让脚本在后台运行并将所有输出包括打印信息和错误重定向到monitor.log文件。你可以用tail -f monitor.log来实时查看日志。更优雅的方式创建 systemd 服务 (Linux)创建一个服务文件如/etc/systemd/system/resource-monitor.service[Unit] DescriptionThingSpeak Resource Monitor Afternetwork.target [Service] Typesimple Useryour_username EnvironmentTHINGSPEAK_API_KEY你的写API密钥 WorkingDirectory/path/to/your/script ExecStart/usr/bin/python3 /path/to/your/script/resource_monitor.py Restarton-failure RestartSec10 [Install] WantedBymulti-user.target然后运行sudo systemctl daemon-reload sudo systemctl start resource-monitor sudo systemctl enable resource-monitor # 开机自启使用systemctl status resource-monitor查看运行状态。这种方式管理起来更专业支持开机启动、自动重启。5. 常见问题与故障排除实录在实际部署和运行过程中你可能会遇到以下问题。这里记录了我踩过的坑和解决方案。5.1 数据发送失败或延迟问题现象脚本控制台提示发送失败或者 ThingSpeak 图表上数据点更新不及时出现长时间空白。排查思路与解决网络连接问题这是最常见的原因。脚本中的requests.post设置了timeout10如果网络不通或 ThingSpeak API 服务暂时不可用会抛出异常并被捕获打印。首先检查你的设备是否能正常访问https://api.thingspeak.com。API Key 错误仔细核对THINGSPEAK_WRITE_API_KEY是否与通道的 “Write API Key” 完全一致包括大小写。确保环境变量已正确设置可以通过在脚本开头打印其值部分掩码来调试print(fUsing API Key: {THINGSPEAK_WRITE_API_KEY[:5]}...)。ThingSpeak 免费账户限制这是最容易忽略的一点。ThingSpeak 免费账户限制每个通道每15秒才能更新一次数据。如果你的脚本上报间隔interval_seconds小于15秒后续的请求会被忽略导致数据丢失。务必确保你的脚本循环间隔 16秒建议设为20或30秒以留出余量。字段不匹配确保send_to_thingspeak函数中payload里的field1、field2与你在 ThingSpeak 通道里创建和命名的字段顺序对应。如果通道里 Field 1 是内存Field 2 是 CPU而你的脚本却把 CPU 数据发给了field1那图表显示就全乱了。5.2 监控数据不准或异常问题现象CPU 使用率始终显示为 0% 或 100%内存数据看起来不合理。排查思路与解决CPU 使用率为 0%这通常是因为第一次调用psutil.cpu_percent()时没有设置interval参数或设置为0。psutil需要在两次调用之间有一个时间间隔来计算百分比。务必在首次调用时设置interval参数如cpu_percent psutil.cpu_percent(interval1)。这个调用会阻塞1秒但能获得准确的初始值。后续在循环中调用时如果不希望再次阻塞可以使用psutil.cpu_percent(intervalNone)它会计算自上次调用以来的利用率。内存计算的理解差异psutil.virtual_memory().percent计算的是已用内存占总内存的百分比。这里的“已用内存”通常不包括 buffers 和 cached 内存因为后者在系统需要时可以快速释放。所以即使你的任务管理器显示内存用了很多但percent可能不高因为大部分可能是缓存。这是正常的Linux/Unix 系统的内存管理策略就是尽可能利用内存做缓存。如果你想监控“包括缓存”的内存压力可以计算(total - available) / total * 100其中available是psutil.virtual_memory().available。脚本自身资源消耗虽然很小但也要注意。如果你的采集间隔太短比如1秒脚本频繁调用psutil和发起网络请求可能会轻微拉高 CPU 和网络使用率。对于长期监控30秒或1分钟的间隔是更合理的选择。5.3 如何长期运行与维护问题脚本运行几天或几周后可能会因为各种原因停止如何保证其持续运行经验与建议使用进程守护工具如前所述在 Linux 上使用systemd是首选。它提供了强大的进程管理能力崩溃自动重启、日志管理、开机自启等。在 Windows 上可以将其包装为 “Windows Service”或者使用更轻量的第三方工具如NSSM。加入心跳和自检可以在脚本中增加一个简单的“心跳”机制。例如每成功发送100次数据后就在日志里记录一条“服务运行正常”的信息。或者定期检查自身进程是否健康。日志轮转如果使用nohup并将输出重定向到文件日志文件会无限增长。需要配置日志轮转log rotation。对于systemd服务可以使用journalctl来查看和管理日志它自带轮转功能。如果自己写文件可以考虑使用 Python 的logging.handlers.RotatingFileHandler。监控脚本的监控器有点“套娃”但可以考虑写一个更简单的“看门狗”脚本定期检查主监控脚本的进程是否存在如果不存在就拉起它。或者利用 ThingSpeak 本身让监控脚本定期向一个特定的字段如field8发送一个固定值如1作为心跳信号。你可以在 ThingSpeak 上设置一个 React如果这个心跳信号超过一定时间比如10分钟没有更新就触发报警通知你监控脚本可能挂了。这个基于 Python 和 ThingSpeak 的资源监控方案从构思到实现再到优化和排错整个过程就像搭积木一样把几个简单可靠的组件组合起来解决了一个实际的需求。它可能没有企业级监控系统那么功能强大但其轻量、快速、零成本的优势对于个人开发者、学生或小团队来说往往正是最需要的。当你看到自己服务器资源波动的曲线第一次清晰地展现在网页上时那种对系统“了如指掌”的感觉就是技术带来的最直接的成就感。