踩坑场景
一台 2 核 2G 的边缘服务器,同时跑采集、MQTT、时序库、看板、数据库、后台服务……没多久内存吃满、swap 频繁、采集卡顿。根因是没有做资源预算,什么都往上装。
先建立“资源预算”意识
部署前列出每个服务的大致内存占用并求和,给系统和突发留出 30% 余量。粗略经验(具体以实测为准):
- 操作系统本身:数百 MB
- Mosquitto:很轻,十几~几十 MB
- Node-RED/Neuron:几十~一两百 MB
- EMQX:比 Mosquitto 重,全功能运行占用更高
- 时序库:随数据量和缓存配置增长,是内存大头
- Grafana:渲染时内存上升明显
- JVM 类服务(Java):起步内存就较高,小内存机要谨慎
边缘侧的取舍原则
边缘只做该在边缘做的事:采集、协议转换、断网缓存、轻量实时逻辑。重的分析、可视化、历史长存储尽量放到中心服务器。
- 小盒子:Neuron/采集 + Mosquitto 即可,别上 EMQX 集群和 Grafana
- 时序库放边缘时,调小其内存缓存参数、缩短本地保留期
- 能合并的服务合并,减少进程数量
排查命令清单(Linux)
free -h # 整体内存/swap
top # 实时看谁占内存/CPU(按 M 按内存排序)
ps aux --sort=-%mem | head # 内存占用 Top 进程
df -h # 磁盘是否写满
systemctl status 服务 # 服务状态
journalctl -u 服务 -f # 实时日志
常见“隐形”内存消耗
- JVM 默认堆偏大,用 -Xmx 显式限制
- 日志不轮转,磁盘被写满进而引发各种异常
- 时序库缓存参数默认值对小机器过大
- 开了不需要的插件/功能模块
稳妥的部署建议
- 画一张服务清单,估算总占用,留足余量
- 边缘最小化,重活上收
- 每个服务配 systemd 自启和内存上限(按需)
- 配日志轮转和磁盘告警
- 上线后观察一周真实资源曲线,再决定是否扩容
如果预算允许,跑“采集+消息+时序库+看板”一整套,2 核 4G 会比 2G 从容很多;2G 更适合做纯采集边缘节点。