用 Netdata 搭建中心化服务器监控(Parent-Child 模式)
背景
做深度学习科研经常需要同时用到多台 GPU 服务器跑实验。几台机器各自训练不同的模型,想快速看一眼哪台还有空闲显存、哪台负载已经满了,得分别 SSH 进去敲 nvidia-smi,效率很低。
于是想搭一个 centralized dashboard,能在一个页面看到所有服务器的:
- 实时 GPU 利用率和显存占用(最重要)
- CPU、内存、磁盘、网络基础指标
- 数据保留在自己手里,不强制依赖第三方云服务
- 免费方案,最好开箱即用
Netdata 是个不错的选择,但默认的 Netdata Cloud 方案虽然免费,GPU 监控和一些高级功能需要付费。于是转向自托管的 Parent-Child 架构:一台 Parent 节点集中存储和展示数据,多台 Child 节点只负责采集和推送。
架构
- Parent:接收所有 Child 的数据,提供统一面板,可配置数据保留策略
- Child:采集本机指标,实时推送到 Parent,本地不长期存储
Parent 节点配置
选一台服务器作为中心节点,安装 Netdata:
curl https://get.netdata.cloud/kickstart.sh | sh -s -- --install-type any如果系统包管理器有问题(比如我遇到的 apt hash mismatch),--install-type any 会改用静态二进制安装。
生成 API Key 用于 Child 认证:
cat /proc/sys/kernel/random/uuid# 输出示例:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx配置 Parent 接收数据:
cd /etc/netdatasudo ./edit-config stream.conf写入(把 YOUR_API_KEY 换成上一步生成的 UUID):
[stream] # Parent 不需要向外推送 enabled = no
[YOUR_API_KEY] type = api enabled = yes allow from = * db = dbengine health enabled = yes enable compression = yes enable replication = yes重启生效:
sudo systemctl restart netdata检查端口:
ss -tlnp | grep 19999# 应该显示 0.0.0.0:19999 在监听防火墙放行:
sudo ufw allow 19999/tcp# 或sudo iptables -I INPUT -p tcp --dport 19999 -j ACCEPTChild 节点配置
在每台需要监控的服务器上:
curl https://get.netdata.cloud/kickstart.sh | sh -s -- --install-type any配置推送到 Parent:
cd /etc/netdatasudo ./edit-config stream.conf修改 [stream] 部分(PARENT_IP 和 YOUR_API_KEY 按实际情况填写):
[stream] enabled = yes destination = PARENT_IP:19999 api key = YOUR_API_KEY把 PARENT_IP 换成 Parent 节点的实际 IP,api key 必须与 Parent 配置的一致。
重启:
sudo systemctl restart netdata检查连接:
tail -f /var/log/netdata/error.log | grep STREAM# 应该看到 "established communication - sending metrics"GPU 监控配置
Child 节点如果有 NVIDIA GPU,需要额外启用 nvidia_smi 插件。
先确认驱动已安装:
nvidia-smi创建配置:
cd /etc/netdatasudo ./edit-config go.d/nvidia_smi.conf写入:
jobs: - name: nvidia_smi重启 Netdata:
sudo systemctl restart netdataGPU 图表在 Netdata 面板里的路径是:System → Hardware → GPUs → NVIDIA。
验证
访问 Parent 节点的面板:
http://PARENT_IP:19999首次访问会进入欢迎页面,可以跳过登录和设置步骤(功能会受限,但基础监控不受影响)。进入主页面后,点击上方标签页的 Nodes 就能看到所有 Child 节点的主机名,点击切换查看各服务器的指标。
数据保留
Parent 节点默认的数据保留时间可能只有几天。如需延长,修改 netdata.conf:
cd /etc/netdatasudo ./edit-config netdata.conf找到 [db] 部分调整:
[db] mode = dbengine # 根据磁盘空间调整,单位可以是 day, week, month retention = 30d重启生效。
总结
Parent-Child 模式让 Netdata 在免费的前提下实现了中心化监控,特别适合科研场景下管理多台 GPU 服务器:
- 一眼看清所有实验机器的 GPU 占用,不用反复 SSH
- Parent 负责存储和展示,可自定义数据保留策略
- Child 只负责采集,配置简单,几乎零维护
- GPU 监控无需 Cloud 付费,本地配置即可生效
- 所有数据留在自己的服务器上
对于不想把监控数据上传到第三方、又需要集中查看多服务器指标的科研场景,这个方案足够轻量且可控。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!