一、简介:为什么必须“看得见”实时性?
工业视觉、运动控制对延迟<1 ms零容忍,但“能跑”≠“实时”。
客户现场常出现:偶发卡顿→无数据→靠猜→通宵调试。
轻量化监控 = 实时采集延迟/CPU/内存→秒级告警,问题复现率↑90%,定位时间↓80%。
掌握本文方案,即可为瑞芯微平台打造“边缘实时之眼”,让SIL/CE认证审核有数据可追。
二、核心概念:5 个关键词先搞懂
| 关键词 | 一句话 | 瑞芯微场景 |
|---|---|---|
| PREEMPT_RT | Linux 实时补丁,将中断、自旋锁可抢占化 | RK3568 官方 SDK 已合入 |
| cyclictest | 测量“ timer → 线程唤醒”延迟的黄金工具 | 用于验证监控数据准确性 |
| kmon | 轻量级内核日志守护,支持阈值告警 | 替代 rsyslog,资源 <1 MB |
| sysfs | 内核导出指标接口,如/sys/kernel/debug/rt_latency | 零开销采集 |
| MQTT | 轻量消息队列,边缘→云端上报 | 4G/以太网均适用 |
三、环境准备:10 分钟搭好实验台
1. 硬件
RK3568 开发板(2 GB RAM)(RK3588 同理)
SD 卡 ≥16 GB,千兆网线,TTL 串口线
2. 软件
| 组件 | 版本 | 获取方式 |
|---|---|---|
| 瑞芯微Linux SDK | v1.2.0a | 官方 Gitee |
| 实时内核 | linux-5.10-rt | SDK 已集成 |
主机交叉编译器:
aarch64-linux-gnu-gcc 9.3一键装依赖(Ubuntu 20.04 主机):
sudo apt install gcc-aarch64-linux-gnu build-essential \ git cmake ninja-build3. 烧录 & 启动
# SDK 自带脚本 ./build.sh kernel && ./build.sh firmware sudo upgrade_tool ul MiniLoaderAll.bin sudo upgrade_tool di -k rt-boot.img串口出现PREEMPT_RT字样即成功。
四、应用场景(300 字):边缘视觉质检机
某饮料厂产线 600 瓶/分钟,每瓶拍摄 3 张图,AI 推理要求总延迟 ≤ 200 ms。
硬件:RK3568 + USB3.0 相机 + 4G 模块
软件:PREEMPT_RT + OpenCV + Tengine
痛点:偶发拍照重影,怀疑 AI 延迟合格但图像触发信号延迟抖动。
方案:本文监控体系实时采集:
GPIO 触发→用户态时间戳差(<1 ms 为 OK)
cyclictest 后台采样,每 1 s 上报 Max 延迟
延迟 > 800 μs 触发 MQTT 告警,云端推送到手机
上线 1 周即定位到USB 驱动在 82 ℃ 时 rt_latency 突增 3 ms,通过降频+散热解决,重影率从 0.3% 降至 0.01%。
五、实际案例与步骤:30 分钟搭完“边缘实时之眼”
所有脚本放
~/rt-monitor,路径统一,可复制即用。
5.1 步骤 1 - 采集层:cyclictest 常驻服务
# 创建服务文件 sudo tee /etc/systemd/system/rt-latency.service <<'EOF' [Unit] Description=RT latency logger After=network.target [Service] ExecStart=/usr/bin/cyclictest -p95 -m -Sp90 -i200 -d0s \ -l /var/log/rt-latency.log Restart=always CPUAffinity=3 # 绑定大核 [Install] WantedBy=multi-user.target EOF sudo systemctl enable --now rt-latency.service验证:
tail /var/log/rt-latency.log # T: 0 ( 1234) P:95 I:200 C: 10000 Min: 8 Act: 14 Avg: 16 Max: 385.2 步骤 2 - 系统指标:sysfs + awk 零开销
# cpu_usage.sh #!/bin/sh while true; do grep -w cpu /proc/stat | awk '{printf "%.1f\n", ($2+$3+$4)/($2+$3+$4+$5)*100}' \ >> /var/log/cpu.log sleep 1 done后台运行:
chmod +x cpu_usage.sh nohup ./cpu_usage.sh &5.3 步骤 3 - 内核日志阈值告警:kmon
# 交叉编译 kmon (ARM64) git clone https://github.com/rgoliveira/kmon.git cd kmon && cargo build --release --target aarch64-unknown-linux-gnu # 拷贝到板子 scp target/aarch64-unknown-linux-gnu/release/kmon root@192.168.1.10:/usr/bin/配置阈值:
sudo kmon set-threshold "sched:.*latency.*>1000" # 单位 μs sudo kmon start --mqtt-broker tcp://mqtt.example.com:18835.4 步骤 4 - MQTT 上报(本地→云端)
# mqtt_upload.py import paho.mqtt.client as mqtt import json, time client = mqtt.Client() client.username_pw_set("user", "pass") client.connect("mqtt.example.com", 1883, 60) while True: lat = int(open('/var/log/rt-latency.log').readlines()[-1].split()[-1]) cpu = float(open('/var/log/cpu.log').readlines()[-1]) msg = json.dumps({"lat_us": lat, "cpu": cpu}) client.publish("rk3568/monitor", msg) time.sleep(1)后台运行:
python3 mqtt_upload.py &5.5 步骤 5 - Grafana 快速可视化
云侧 Docker 一键启动:
docker run -d -p 3000:3000 \ -e GF_SECURITY_ADMIN_PASSWORD=admin \ grafana/grafana添加 MQTT 数据源(插件:MQTT-datasource)
导入仪表盘 JSON(文末仓库提供),5 分钟出图。
六、常见问题与解答(FAQ)
| 问题 | 现象 | 解决 |
|---|---|---|
| cyclictest Max > 1 ms | 未关 CPU 变频 | BIOS 关闭turbo;内核加intel_pstate=disable |
| kmon 报 “No such file or directory” | 缺少/dev/kmsg权限 | chmod 444 /dev/kmsg或加 udev 规则 |
| MQTT 断线后数据丢失 | 网络抖动 | 在 Python 脚本加on_disconnect重连 + 本地环形缓存 |
| 串口大量日志影响实时 | 延迟突刺 | 关闭console=ttyS0,115200或提高loglevel=4 |
| 监控自身占用 CPU > 5% | 采集太频繁 | 降低采样周期至 2 s;使用 sysfs 接口替代/proc解析 |
七、实践建议与最佳实践
大核绑采集
CPU3 专门跑 cyclictest & mqtt,不与业务抢占。环形缓存 + 压缩
本地日志logrotate按小时切割,gzip 压缩,保留 7 天。阈值分级告警
Max > 200 μs:INFO(记录)
500 μs:WARN(短信)
1000 μs:CRITICAL(停机检查)
监控也要“安全”
MQTT 使用 TLS + 证书,防止被注入假数据。版本化配置
把 systemd 服务、Python 脚本、Grafana JSON 全部 Git 管理,Tag 随软件一起发布。
八、总结:一张脑图带走全部要点
瑞芯微实时监控体系 ├─ 采集:cyclictest + sysfs + kmon ├─ 传输:MQTT + TLS ├─ 展示:Grafana + 手机告警 ├─ 告警:分级阈值 + 环形缓存 └─ 管理:Git 版本 + systemd 服务实时监控不是“锦上添花”,而是实时 Linux 的“生命线”。
当你把本文脚本推送到 RK3568 板子,看到 Grafana 曲线稳稳趴在 50 μs 以下时,你会由衷感叹——“实时性,原来真的可以看得见!”