公司动态
树莓派系统监控实战:InfluxDB+Grafana搭建轻量级可视化预警平台
简介本资源是一套面向树莓派初学者与课程设计/毕业设计实践者的轻量级系统监控方案聚焦CPU温度与内存使用率两大核心指标的实时采集与可视化展示。项目基于Flask框架构建Web服务通过Python脚本读取系统传感器数据结合CanvasJS图表库实现动态HTML页面渲染兼顾功能性与教学可读性。压缩包共16个文件672KB含4个核心Python脚本数据采集与Web服务、4个HTML前端页面、3个JavaScript图表依赖库、1个启动Shell脚本及README说明文档等结构清晰、模块解耦便于理解嵌入式Linux系统监控的完整链路。目前已有153人学习下载读者可直接部署运行获得可扩展的监控原型、完整的前后端代码结构、GPIO无关的纯软件监控思路以及适配Raspberry Pi OS的实测配置经验。1. 项目概述与核心价值最近在折腾我的树莓派4B把它当作家里的轻量级服务器跑着几个docker容器和自建的服务。用了一阵子发现这小家伙在负载高的时候外壳摸起来有点烫手。虽然树莓派设计上挺耐热的但长期高温运行总归会影响芯片寿命和系统稳定性尤其是夏天心里更没底。光靠手摸肯定不行我需要一个能实时、准确掌握系统状态的方法特别是CPU温度和内存使用率这两个核心指标。这不仅仅是看个数字那么简单更重要的是能设置预警在系统“发烧”或者内存快被“吃光”之前主动通知我好及时干预防止服务卡死或者硬件损伤。这个“树莓派系统监控”项目就是来解决这个实际痛点的。它的核心目标很明确在树莓派上搭建一个轻量级、可视化、可预警的系统监控方案重点监控CPU温度和内存使用情况。对于任何把树莓派用作长期运行设备的玩家——无论是做家庭服务器、NAS、智能家居中枢还是跑一些自动化脚本——这套监控都像是给设备装上了“仪表盘”和“警报器”。你不用再担心它默默过热死机或者因为内存泄漏导致服务异常。通过一些简单的脚本和工具组合你就能清晰地看到系统的实时状态和历史趋势真正做到心中有数运维不慌。2. 监控方案设计与工具选型要实现监控首先得确定数据从哪里来、怎么展示、如何告警。树莓派作为Linux系统其硬件和系统状态信息都暴露在特定的文件接口中这是我们获取原始数据的基础。2.1 数据采集层系统接口与命令对于CPU温度树莓派非常贴心地将传感器数据直接放在了/sys/class/thermal/thermal_zone0/temp这个文件里。你只需要用cat命令读取它得到的是一个以毫摄氏度millidegree Celsius为单位的整数除以1000就是摄氏度。这是最直接、最可靠的方法。内存信息则可以通过free命令来获取。我们通常关注的是已用内存占总内存的百分比。通过解析free -m以MB为单位显示的输出可以计算出使用率。另一个更全面的工具是vmstat或top但对于脚本化采集free命令更加简洁。注意有些教程可能会提到使用vcgencmd measure_temp命令来获取温度这个命令确实更直观但它依赖于vcgencmd这个VideoCore GPU相关的工具。在部分精简版系统或容器环境中这个命令可能不可用。而/sys/class/thermal/下的接口是Linux内核标准的thermal子系统提供的通用性更强因此作为首选方案。2.2 可视化与存储层轻量级方案选择拿到数据后我们需要把它存下来并展示成图表。对于树莓派这种资源有限的设备重型监控系统如Zabbix、Prometheus虽然“普罗米修斯部署”是热词但它对资源有一定要求可能有点杀鸡用牛刀。我们需要更轻量的选择。一个经典的组合是InfluxDB Grafana。InfluxDB是专门为时间序列数据设计的数据库写入和查询效率极高非常适合存储每秒采集一次的监控指标。Grafana则是强大的可视化仪表盘工具能从InfluxDB中读取数据并绘制成精美的曲线图、仪表盘。这个组合功能强大但需要在树莓派上安装并运行两个服务对内存有一定占用大约200-300MB。如果你追求极致轻量或者只是想快速验证可以选用更简单的方案纯文本日志 简易脚本绘图用Python脚本将采集到的时间、温度、内存数据追加写入一个CSV文件。然后使用Python的matplotlib库定期比如每天生成一次趋势图。这种方式几乎没有额外开销但实时性和交互性较差。使用rrdtool这是一个非常经典且高效的时间序列数据库和绘图工具很多老牌网络设备都用它。它占用资源极小但配置和绘图语法有一定学习成本。考虑到功能的完整性和学习的普适性本项目将采用InfluxDB Grafana作为核心方案。它虽然比最简方案重一些但能为后续监控其他指标如CPU负载、磁盘空间、网络流量提供强大的扩展能力其告警功能也更为完善。2.3 告警通知层及时触达监控的价值一半在于预警。Grafana自身在新版本中集成了强大的告警引擎可以配置当某个指标如温度连续5分钟超过70度达到阈值时触发告警。告警渠道可以配置成电子邮件、Slack、Webhook等。对于国内用户一个更接地气的选择是集成钉钉DingTalk或企业微信的机器人。通过配置Grafana的Webhook告警通道将告警信息发送到这些机器人的API就能在手机工作群里收到提醒非常方便。如果不想依赖Grafana也可以用Python写一个简单的守护进程读取InfluxDB的数据判断阈值然后直接调用这些机器人的接口发送消息。3. 核心组件部署与配置实操接下来我们一步步把整个系统搭建起来。我的环境是树莓派4B 4GB版系统是 Raspberry Pi OS Lite基于Debian的64位版本。3.1 安装InfluxDB时序数据库InfluxDB 2.x 版本将数据库和Web UI整合在了一起但资源消耗相对1.x版本更大。对于树莓派我推荐安装InfluxDB 1.8这个稳定、轻量的版本它的管理主要通过配置文件和使用HTTP API。首先添加InfluxData的APT仓库并安装# 导入GPG密钥 wget -q https://repos.influxdata.com/influxdb.key sudo apt-key add influxdb.key # 添加仓库 (适用于Debian Buster/Bullseye) echo deb https://repos.influxdata.com/debian $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/influxdb.list # 更新并安装 sudo apt update sudo apt install influxdb安装完成后启动服务并设置为开机自启sudo systemctl unmask influxdb sudo systemctl enable influxdb sudo systemctl start influxdb检查服务状态和版本sudo systemctl status influxdb influx -version默认情况下InfluxDB 1.8 的HTTP API运行在8086端口管理界面如果安装在8083端口。我们需要创建一个数据库来存储监控数据# 连接到InfluxDB命令行 influx # 创建名为 pimon 的数据库 CREATE DATABASE pimon # 查看数据库列表 SHOW DATABASES # 退出 exit3.2 安装Grafana可视化仪表盘Grafana的安装同样通过APT仓库进行# 安装必要的依赖 sudo apt install -y software-properties-common wget # 导入GPG密钥 wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - # 添加稳定版仓库 echo deb https://packages.grafana.com/oss/deb stable main | sudo tee /etc/apt/sources.list.d/grafana.list sudo apt update sudo apt install grafana启动并启用Grafana服务sudo systemctl enable grafana-server sudo systemctl start grafana-serverGrafana默认运行在3000端口。在电脑浏览器上打开http://你的树莓派IP:3000首次登录使用默认账号admin和密码admin会强制要求修改密码。3.3 配置数据采集脚本这是整个系统的“传感器”。我们将编写一个Python脚本定期读取系统状态并写入InfluxDB。首先安装必要的Python库。InfluxDB 1.8 使用一个叫influxdb的客户端库。sudo apt install python3-pip pip3 install influxdb psutil这里引入了psutil库它是一个跨平台的系统信息库能非常优雅地获取内存、CPU等信息比直接解析free命令更可靠。创建采集脚本monitor.py#!/usr/bin/env python3 import time import psutil from influxdb import InfluxDBClient # InfluxDB 连接配置 INFLUXDB_HOST localhost INFLUXDB_PORT 8086 INFLUXDB_DATABASE pimon # 初始化InfluxDB客户端 client InfluxDBClient(hostINFLUXDB_HOST, portINFLUXDB_PORT, databaseINFLUXDB_DATABASE) def get_cpu_temperature(): 从系统文件读取CPU温度摄氏度 try: with open(/sys/class/thermal/thermal_zone0/temp, r) as f: temp int(f.read().strip()) / 1000.0 return temp except Exception as e: print(f读取温度失败: {e}) return None def get_memory_usage(): 使用psutil获取内存使用率百分比 mem psutil.virtual_memory() return mem.percent def collect_and_send(): 收集数据并发送到InfluxDB cpu_temp get_cpu_temperature() mem_usage get_memory_usage() if cpu_temp is None: return # 构建InfluxDB数据点 # measurement 类似于表名tags是索引字段fields是存储的数值字段time是时间戳 json_body [ { measurement: system_status, tags: { host: raspberrypi }, fields: { cpu_temp: cpu_temp, mem_usage: mem_usage } } ] try: client.write_points(json_body) print(f[{time.strftime(%Y-%m-%d %H:%M:%S)}] 数据写入成功: Temp{cpu_temp:.1f}C, Mem{mem_usage:.1f}%) except Exception as e: print(f写入InfluxDB失败: {e}) if __name__ __main__: # 每10秒采集一次数据 while True: collect_and_send() time.sleep(10)给脚本执行权限并测试chmod x monitor.py python3 monitor.py如果看到成功写入的日志说明脚本和InfluxDB连接正常。按CtrlC停止测试。3.4 配置系统服务与自动化我们不可能一直手动运行这个脚本。需要把它配置成系统服务systemd service让它开机自启并在后台稳定运行。创建服务文件/etc/systemd/system/pimon.service[Unit] DescriptionRaspberry Pi System Monitor Daemon Afternetwork.target influxdb.service [Service] Typesimple Userpi ExecStart/usr/bin/python3 /home/pi/monitor.py Restarton-failure RestartSec10 [Install] WantedBymulti-user.target启用并启动服务sudo systemctl daemon-reload sudo systemctl enable pimon.service sudo systemctl start pimon.service sudo systemctl status pimon.service现在数据采集器就在后台默默工作了。你可以通过journalctl -u pimon.service -f命令实时查看它的日志。4. Grafana仪表盘配置与告警设置数据已经源源不断地存入InfluxDB现在是时候用Grafana把它变成直观的图表了。4.1 添加InfluxDB数据源登录Grafanahttp://树莓派IP:3000。点击左侧齿轮图标 -Data Sources-Add data source。选择InfluxDB。配置连接参数HTTP-URL:http://localhost:8086InfluxDB Details-Database:pimonInfluxDB 1.8不需要配置用户名密码除非你额外设置了认证点击Save Test应该显示“Data source is working”的成功提示。4.2 创建监控仪表盘点击左侧加号图标 -Dashboard-Add new panel。在Query选项卡中数据源选择刚添加的InfluxDB。构建查询语句来获取CPU温度在查询编辑器里如果显示的是Flux查询语言点击切换成InfluxQL输入SELECT mean(cpu_temp) FROM system_status WHERE $timeFilter GROUP BY time($__interval) fill(null)这个查询的意思是在选定的时间范围内按Grafana自动计算的时间间隔$__interval分组计算每个时间段内cpu_temp的平均值。在右侧Panel options中给图表起个标题比如CPU Temperature。可以调整图表的样式比如将Visualization改为Graph在Axes里设置单位为Celsius在Legend中设置显示Min、Max、Avg值。点击右上角的Apply保存这个图表到仪表盘。用同样的方法再添加一个面板来显示内存使用率查询语句SELECT mean(mem_usage) FROM system_status WHERE $timeFilter GROUP BY time($__interval) fill(null)标题设为Memory Usage单位设置为percent (0-100)。你还可以添加一些Stat统计值面板显示当前最新的温度和内存值这样一目了然。最终一个包含曲线图和实时数值的监控仪表盘就完成了。别忘了点击仪表盘顶部的Save图标给仪表盘起个名字比如RPi System Monitor。4.3 配置告警规则我们希望当温度持续过高时收到通知。这里以配置一个邮件告警为例前提是你的树莓派已经配置好了邮件发送功能如使用SSMTP或外部SMTP服务。更实用的可能是配置Webhook告警到钉钉。在刚才创建的CPU Temperature图表上点击标题 -Edit。切换到Alert选项卡点击Create alert rule from this panel。设置告警条件Rule name:High CPU TemperatureEvaluate every:1m每分钟评估一次For:5m持续5分钟满足条件才触发在Conditions部分设置WHEN avg() OF query(A, 1m, now) IS ABOVE 70。意思是当查询A即我们的温度查询在最近1分钟内的平均值高于70摄氏度时触发。设置通知渠道首先需要配置通知渠道。点击左侧铃铛图标 -Notification channels-Add channel。选择Email填写你的SMTP服务器设置和收件地址保存。回到告警规则编辑页面在Notifications部分选择你刚创建的邮件通知渠道并填写告警信息。保存告警规则。这样当树莓派CPU温度持续5分钟超过70度Grafana就会自动发送邮件给你。对于内存告警可以类似地设置一个阈值比如当内存使用率持续高于90%时触发。实操心得告警的“Evaluate every”和“For”参数需要根据实际情况调整。评估间隔太短如10秒会给系统带来不必要的查询压力For的时间太短如0会导致指标短暂波动就触发告警产生“狼来了”的效果。对于温度监控设置为1分钟评估持续2-5分钟触发是一个比较合理的起点能有效过滤掉瞬时高负载引起的短暂温升。5. 进阶优化与深度监控基础监控搭建完成后我们可以进一步优化和扩展让监控系统更强大、更省资源。5.1 采集脚本优化与多指标扩展最初的脚本每10秒写入一次数据对于长期运行来说会产生大量的数据点。我们可以做两点优化降低采集频率对于温度和内存30秒甚至1分钟采集一次完全足够。修改脚本中的time.sleep(10)为time.sleep(30)。批量写入influxdb客户端支持批量写入多个数据点能减少HTTP请求开销。我们可以将采集间隔内获取的多个指标一次性发送。同时扩展监控指标也非常简单。利用psutil库我们可以轻松添加CPU使用率psutil.cpu_percent(interval1)磁盘使用率psutil.disk_usage(/).percent监控根分区负载平均值os.getloadavg()[0]1分钟负载网络流量psutil.net_io_counters()可以获取发送/接收的字节数通过计算差值得到速率。修改后的collect_and_send函数示例def collect_and_send(): 收集多项系统数据并发送到InfluxDB json_body [] timestamp int(time.time() * 1e9) # InfluxDB需要纳秒时间戳 # 1. CPU温度 cpu_temp get_cpu_temp() if cpu_temp is not None: json_body.append({ measurement: system_status, tags: {host: raspberrypi, type: temperature}, fields: {value: cpu_temp}, time: timestamp }) # 2. 内存使用率 mem psutil.virtual_memory() json_body.append({ measurement: system_status, tags: {host: raspberrypi, type: memory_usage}, fields: {value: mem.percent}, time: timestamp }) # 3. CPU使用率 cpu_percent psutil.cpu_percent(intervalNone) # intervalNone表示非阻塞获取瞬时值 json_body.append({ measurement: system_status, tags: {host: raspberrypi, type: cpu_usage}, fields: {value: cpu_percent}, time: timestamp }) # 4. 磁盘使用率 (根分区) disk psutil.disk_usage(/) json_body.append({ measurement: system_status, tags: {host: raspberrypi, type: disk_usage}, fields: {value: disk.percent}, time: timestamp }) # 批量写入 if json_body: try: client.write_points(json_body) print(f[{time.strftime(%H:%M:%S)}] 写入 {len(json_body)} 个数据点) except Exception as e: print(f写入失败: {e})这种设计将不同类型的指标都存入system_status这个 measurement但用type这个tag来区分。在Grafana查询时可以使用WHERE type cpu_temp来筛选特定指标非常灵活。5.2 InfluxDB数据保留策略与降采样时间序列数据会无限增长必须管理。InfluxDB使用保留策略Retention Policy, RP来定义数据保存多久。默认的RP是autogen永久保存。我们需要为监控数据设置一个合理的保留策略。连接到InfluxDB命令行influx创建新的保留策略例如保留30天的原始数据-- 在 pimon 数据库创建名为 rp_30days 的策略数据保留30天副本数为1单机部署 CREATE RETENTION POLICY rp_30days ON pimon DURATION 30d REPLICATION 1 DEFAULT这条命令创建了一个新的RPrp_30days并将其设置为数据库pimon的默认策略。之后写入的数据都会遵循这个策略30天前的数据会被自动清理。对于更长期的历史趋势查看比如看过去一年的月度平均温度我们可以使用连续查询Continuous Query, CQ进行降采样。CQ会定期自动执行将高精度的原始数据聚合成低精度的汇总数据并存入另一个measurement或RP中从而节省存储空间。例如创建一个CQ每小时计算一次CPU温度的平均值并存入一个保留1年的RP中-- 首先创建一个保留1年的RP CREATE RETENTION POLICY rp_1year ON pimon DURATION 365d REPLICATION 1 -- 创建连续查询每小时执行一次计算上一小时的平均温度并存入rp_1year策略下的system_status_hourly表中 CREATE CONTINUOUS QUERY cq_temp_hourly ON pimon BEGIN SELECT mean(value) AS mean_value INTO rp_1year.system_status_hourly FROM system_status WHERE type temperature GROUP BY time(1h), * END这样原始数据保留30天供细节排查而过去一年的每小时平均数据则被保留下来供长期趋势分析。5.3 资源占用监控与调优监控系统本身也会消耗资源。我们需要确保它不会成为树莓派的负担。进程监控使用htop或ps aux查看influxd、grafana-server和python3 monitor.py进程的CPU和内存占用。正常情况下三者总占用应在150MB内存以内CPU在空闲时接近0%。InfluxDB调优对于1.8版本可以编辑/etc/influxdb/influxdb.conf。重点关注[data]部分cache-max-memory-size可以设置为“128m”或“256m”避免占用过多内存。[http]部分的max-concurrent-write-limit和max-enqueued-write-limit可以适当调低如20和50以控制并发。Grafana调优Grafana的配置在/etc/grafana/grafana.ini。对于树莓派可以尝试在[server]部分设置min_interval 30s强制Grafana面板查询的最小间隔减少对InfluxDB的查询压力。在[dashboards]部分可以设置min_refresh_interval 30s防止面板刷新过快。采集脚本调优如前所述降低采集频率是减少负载最直接的方法。将采集间隔从10秒改为30秒或60秒数据量会直接减少为原来的1/3或1/6对趋势分析的影响微乎其微。6. 常见问题排查与实战技巧在实际部署和运行中你可能会遇到以下问题。这里记录了我踩过的一些坑和解决方法。6.1 数据写入失败或查询不到问题现象采集脚本日志显示“写入InfluxDB失败”或者Grafana中查询不到数据。检查InfluxDB服务状态sudo systemctl status influxdb。确保状态是active (running)。检查数据库和用户权限确认脚本中指定的数据库pimon已创建SHOW DATABASES。InfluxDB 1.8默认无需认证但如果启用了认证需要在连接客户端时提供用户名密码。检查网络和端口在树莓派上运行curl -v http://localhost:8086/ping应该返回204 No Content。如果失败可能是InfluxDB未启动或端口被占用。查看InfluxDB日志sudo journalctl -u influxdb -f查看是否有错误信息。6.2 Grafana无法连接InfluxDB数据源问题现象在Grafana中添加数据源时Save Test失败。确认URL和数据库名URL必须是http://localhost:8086如果Grafana和InfluxDB在同一台机器。数据库名严格匹配。关闭InfluxDB的HTTPS如果启用对于1.8版本如果配置了HTTPSGrafana的URL需要改为https://...并且可能需要处理证书问题。初期测试建议使用HTTP。检查防火墙树莓派上如果启用了UFW等防火墙确保8086端口对本地localhost是开放的。6.3 监控图表显示“No data”问题现象Grafana面板配置好了但图表一片空白显示“No data”。检查查询时间范围Grafana右上角的时间选择器可能选在了未来或者很久以前。尝试选择“Last 1 hour”。检查查询语句确认InfluxQL语法正确measurement名称、field key、tag key的大小写和拼写完全一致。InfluxDB是区分大小写的。验证是否有数据直接到InfluxDB命令行里查询一下USE pimon; SELECT * FROM system_status LIMIT 10。如果这里也没数据问题出在采集脚本。检查采集脚本是否在运行sudo systemctl status pimon.service查看日志journalctl -u pimon.service --since “5 minutes ago”。6.4 系统资源占用过高问题现象树莓派变卡htop显示监控相关进程占用大量CPU或内存。降低数据精度这是最有效的方法。将采集间隔从10秒调整为30秒或60秒。调整InfluxDB的RP检查是否无意中创建了多个RP或没有设置RP导致数据无限增长。使用SHOW RETENTION POLICIES ON pimon查看并用DROP RETENTION POLICY删除不必要的策略。清理旧数据如果数据已经过多可以手动删除DELETE FROM system_status WHERE time now() - 90d删除90天前的数据谨慎操作。简化Grafana仪表盘减少仪表盘上的面板数量特别是那些查询间隔短、查询范围大的面板。避免使用GROUP BY time(1s)这种高精度聚合。6.5 告警不触发或误触发问题现象温度明明很高了收不到邮件或者频繁收到无关紧要的告警。检查告警规则状态在Grafana左侧菜单进入Alerting-Alert rules查看对应告警规则的状态。绿色是正常黄色是待触发红色是触发中。如果一直是绿色说明条件未满足。检查评估周期和持续时间确认Evaluate every和For的设置符合预期。一个常见的误设是For设置为0导致指标一超过阈值就告警没有缓冲期。检查通知渠道配置测试通知渠道是否正常。在Notification channels里对对应的渠道点击Test看是否能收到测试信息。调整告警阈值告警阈值如70度需要根据你的树莓派型号、散热条件和环境温度来调整。树莓派4B的CPU在80度以下通常被认为是安全的工作温度你可以从75度开始设置告警。内存告警阈值通常可以设在85%-90%。经过以上步骤一个功能完整、运行稳定、可扩展的树莓派系统监控平台就搭建完成了。它不仅让你对设备的健康状况了如指掌更通过预警机制为你主动规避了潜在的风险。这套方法的核心思路——采集、存储、展示、告警——可以应用到任何需要监控的Linux设备上你可以根据实际需求轻松地添加磁盘IO、服务进程状态、网络连接数等更多监控维度打造属于你自己的全能监控看板。本文还有配套的精品资源点击获取