资源监控记录

你列的监控项非常多,从 CPU 分核频率、GPU 显存温度到进程级面积图,没有一个单一的 Docker 镜像能“开箱即用”全部覆盖。最接近你需求的是 Netdata,它开箱即用、资源占用低,能覆盖绝大部分系统指标;但 GPU 部分需要额外配置,且“前 10 进程面积图”这类自定义可视化不如 Grafana 灵活。

结合你那台 945 MB 内存的机器,推荐优先考虑 Netdata 的单容器方案;如果对 GPU 和图表定制有硬性要求,再考虑 Prometheus + Grafana 的组合。

方案一:Netdata(最省事,资源友好)

Netdata 是一个开箱即用的实时监控 Agent,自带 Web 仪表盘,默认监听 19999 端口。

它能覆盖你列的大部分需求:

  • CPU / 内存 / Swap / 负载:自动采集,分核使用率、频率、内存各项指标都有。
  • 硬盘:容量、读写速度、读写总量。
  • 网络:各网卡的上传/下载速度和总量。
  • 进程:有进程维度的 CPU 和内存展示,但“前 10 进程面积图”这种特定图表形式,Netdata 自带面板不一定完全吻合,需要看它的进程模块展示效果。
  • Docker 容器:挂载 docker.sock 后可监控各容器资源占用。

GPU 是短板: Netdata 对 NVIDIA GPU 的原生支持有限,频率、显存、温度这些指标通常需要依赖 nvidia-smi 的采集插件或额外配置,不如专门的 exporter 直接。

资源占用: 官方宣称在同等负载下,Netdata 比 Prometheus 少用 35% CPU、49% 内存。对你 1G 内存的机器来说,这是很重要的优势。

启动命令参考(需要挂载宿主机 /proc、/sys 等目录):

docker run -d --name=netdata \
  -p 19999:19999 \
  -v netdataconfig:/etc/netdata \
  -v netdatalib:/var/lib/netdata \
  -v netdatacache:/var/cache/netdata \
  -v /:/host/root:ro,rslave \
  -v /etc/passwd:/host/etc/passwd:ro \
  -v /etc/group:/host/etc/group:ro \
  -v /etc/localtime:/etc/localtime:ro \
  -v /proc:/host/proc:ro \
  -v /sys:/host/sys:ro \
  -v /etc/os-release:/host/etc/os-release:ro \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  --restart unless-stopped \
  --security-opt apparmor=unconfined \
  netdata/netdata

方案二:Prometheus + Grafana + 各 Exporter(最灵活,但重)

如果你对 GPU 监控有硬性要求,且必须要有可定制的面积图,这套组合是标准答案,但对你的机器负担更大。

组件分工:

  • node_exporter:采集 CPU、内存、磁盘、网络、负载等系统指标。
  • NVIDIA GPU Exporter:采集 GPU 频率、显存、温度、利用率。推荐 utkuozdemir/nvidia_gpu_exporter,支持 NVML 后端,有官方 Grafana 仪表盘(ID 14574/25547)。
  • cAdvisor(可选):采集容器级指标。
  • Prometheus:存储指标数据。
  • Grafana:可视化,可以导入社区仪表盘(如 Node Exporter Full,ID 1860)快速获得系统监控面板,也能自己画进程面积图。

代价: 这套组合至少需要跑 3-4 个容器(node_exporter、GPU exporter、Prometheus、Grafana),内存占用会显著高于 Netdata。在你 945 MB 的机器上,需要谨慎评估。

给你的建议

先试 Netdata。 它一个容器就能解决你 80% 的需求,资源占用相对友好,部署也简单。GPU 监控先看它自带的 nvidia-smi 相关插件能否满足基本需求(频率、显存、温度通常有),如果不够再考虑单独加一个 GPU exporter 并接入 Netdata 或另建 Grafana。

如果 Netdata 的进程面积图或 GPU 精度无法接受,再上 Prometheus + Grafana 组合,但要做好内存紧张的准备,可能需要停掉一些非必要的容器来腾空间。考虑到你机器之前已经因为 dnf 和镜像拉取触发过 swap 风暴,新增监控组件前最好先确认当前 available 内存有足够余量。

可以,但 Netdata 没有开箱即用的“企业微信”原生通知选项。你需要通过它的自定义告警脚本(Custom Sender) 功能,自己写一小段脚本来调用企业微信的 Webhook 或应用 API 来发送告警。

为什么不能直接选“企业微信”

Netdata 官方的 Agent 通知文档中,列出了支持邮箱、Slack、OpsGenie 等多种服务,但并没有直接提供企业微信的配置项。虽然有第三方文章提到 Netdata 支持企业微信推送,但这通常指的是通过自定义脚本实现的通用能力,而非官方内置的快捷配置。

具体怎么做

你需要利用 Netdata 的 custom_sender() 函数。这个函数允许你定义一个 shell 命令,当告警触发时,Netdata 会把告警变量(如主机名、告警状态、图表名)传进去,你可以在里面用 curl 去调用企业微信的接口。

思路大概是:

  1. 在企业微信侧准备入口:你可以选择创建一个群机器人,拿到它的 Webhook 地址;或者创建一个自建应用,拿到 corp_id、agent_id 和 secret。群机器人配置最简单,适合快速验证。
  2. 编辑 Netdata 配置:运行 sudo ./edit-config health_alarm_notify.conf,找到 custom_sender() 函数。
  3. 写入 curl 命令:在里面填入调用企业微信 API 的 curl 命令。Netdata 官方示例展示了如何用 curl 向任意 HTTPS 端点发送 POST 请求,并检查返回的 HTTP 状态码来判断是否成功。你需要把企业微信要求的数据格式(通常是 JSON)构造好。

提醒

因为你机器内存很紧张,在编辑配置和测试告警时,尽量别同时运行其他吃内存的任务(比如 dnf 或拉取大镜像),避免再次触发 swap 风暴。配置完成后,可以用 Netdata 提供的测试命令 /usr/libexec/netdata/plugins.d/alarm-notify.sh test 来验证是否能正常收到消息。

 

装在大资源服务器上,之前的顾虑就不存在了。Netdata 同样没有内置“企业微信”选项,核心方案不变:通过自定义通知脚本(custom_sender)调用企业微信的 Webhook API 来发送告警。在大机器上操作,可以更从容地测试和调试。

配置路径

在 Netdata 所在机器上,编辑告警通知配置文件:

cd /etc/netdata
sudo ./edit-config health_alarm_notify.conf

核心配置:启用自定义发送

找到并修改以下配置项,启用自定义通知,并指定接收方标识(这个标识会传给脚本,供你内部使用):

SEND_CUSTOM="YES"
DEFAULT_RECIPIENT_CUSTOM="wecom"

编写 custom_sender() 函数

这是关键步骤。你需要把企业微信的 Webhook 调用逻辑写进这个函数里。Netdata 在触发告警时会自动调用它,并把告警变量(如 ${name}、${status}、${host}、${chart})填充好传进来。

一个面向企业微信群机器人的示例思路如下(请根据你实际的企业微信接口格式调整 JSON 结构):

custom_sender() {
    local msg="**主机**: ${host}\n**告警**: ${name}\n**状态**: ${status}\n**图表**: ${chart}\n**详情**: ${info}"
    local webhook_url="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的KEY"
    
    httpcode=$(curl -s -o /dev/null -w "%{http_code}" \
        -H "Content-Type: application/json" \
        -d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"${msg}\"}}" \
        "${webhook_url}")
    
    if [ "${httpcode}" = "200" ]; then
        info "sent custom notification to wecom"
    else
        error "failed to send to wecom with HTTP ${httpcode}"
    fi
}

注意:企业微信 Webhook 要求严格 JSON 格式,${msg} 里的换行符 \n 在 JSON 字符串中可能需要转义处理(上面示例依赖 curl 对 \n 的传递,实际测试时请用真实告警验证格式是否正确)。更稳妥的做法是像 Netdata 官方示例那样,用 urlencode 或 jq 构造合法的 JSON。

测试与生效

配置保存后无需重启 Netdata,下一次告警就会使用新配置。你可以手动触发测试:

sudo su -s /bin/bash netdata
export NETDATA_ALARM_NOTIFY_DEBUG=1
/usr/libexec/netdata/plugins.d/alarm-notify.sh test

观察终端输出,确认 custom_sender 是否被调用以及 curl 返回码是否为 200。

既然机器资源充足,建议先在测试环境或非关键告警上验证企业微信的 JSON 格式是否正确,确认收到消息后再放开给生产告警。