告别SSH人肉排查:用Pulse轻量监控执行机集群

Smart AI Code2026-09-28阅读约 8 分钟

在执行机、构建机或测试机集群中,机器状态不可见是运维的典型痛点。Pulse 是一个由两个 Go 单文件二进制文件构成的轻量级监控方案,它能帮助你在 5 分钟内实现集群状态的实时可见,无需引入重型监控栈。本文将介绍 Pulse 的核心特性、工程细节和部署步骤。

一、执行机集群的“可观测真空”

传统的执行机集群排查依赖 SSH 登录,手动运行 top、free、df -h、iostat 等命令。这种方式存在明显的滞后性、低效性,且难以发现“假死”状态。而常见的监控方案(如 Prometheus + Grafana)虽然功能强大,但对于内网、无外网或机器量大的执行机场景,部署和维护成本往往过高。

Pulse 的思路是:用尽可能小的资源消耗,解决“看得见”这一核心问题。

二、Pulse 的架构:Agent + Server

Pulse 由两个独立的 Go 单文件二进制构成:

  • Agent:运行在每台执行机上,负责采集指标并上报。
  • Server:运行在中心节点,接收上报数据并提供 Dashboard。

数据流是单向的(执行机 → Server),Server 不主动采集,也不反向控制机器。

Agent 特性

  • Go 交叉编译的单文件二进制,体积仅几 MB,无任何运行时依赖。
  • 每 10 秒采集一次指标,通过 HTTP POST 上报。
  • 上报地址由 PULSE_SERVER 环境变量指定。
  • 以 systemd 托管,实现开机自启和崩溃自动重启。

Server 特性

  • 纯 Go 标准库实现,零外部依赖。
  • 内存态维护 hostname:ip 到最近一次指标的映射。
  • 提供四个接口:
    • /:Web 监控面板(Dashboard 通过 go:embed 编入二进制)
    • /report:Agent 上报入口
    • /status:全量状态 JSON(供面板轮询)
    • /health:健康检查

端口说明:Dashboard 默认运行在 8080 端口;安装脚本与 Agent 上报地址的示例中使用 8123 端口。实际部署时请以你自己的配置为准。

三、覆盖全面的指标采集

Pulse 采集的指标覆盖执行机日常巡检的关键维度:

类别指标说明
CPU使用率判断任务是否跑满机器
内存总量 / 已用 / 使用率预防 OOM
Swap总量 / 已用 / 使用率长期偏高说明物理内存不足
磁盘根分区总量 / 已用 / 使用率防止构建产物撑满磁盘
负载1/5/15 分钟 Load关注趋势而非瞬时值
运行时长Uptime骤降可能意味着机器重启过
网络累计流量 + 实时速率发现异常拉包行为
磁盘 I/O累计量 + 实时速率定位磁盘瓶颈
在途 IO未完成的 I/O 请求数磁盘“堵不堵”的直接指标
进程数进程总数异常突增可能是 fork 炸弹

采集的健壮性

任何单个指标采集失败时,Agent 只记录日志并保留零值,其余指标照常上报。这意味着某台机器即使缺少某个数据源(如 /proc/loadavg),也不会导致整台机器“失联”。

对于网络和磁盘 I/O 速率,Agent 保存上一轮采样的累计值和时间戳,通过差值除以间隔计算 bytes/s。首轮采样或计数器归零回绕时,速率记为 0,避免出现负值或异常大的数值。

四、智能告警:只在状态跳变时通知

离线判定

超过 30 秒未收到上报,即标记该主机为 offline。

阈值告警

默认阈值如下,所有阈值均可通过环境变量覆盖:

  • CPU 使用率:90%
  • 内存使用率:90%
  • 磁盘使用率:85%
  • Swap 使用率:50%
  • 进程数:2000

告警去重(状态机)

Pulse 维护一个以「主机 + 告警类型」为键的状态机。只有状态发生跳变时(例如从正常变为异常,或从异常恢复为正常),才会输出 ALERT 或 RECOVER 日志。这避免了传统方案中“超阈值后每轮都刷日志”的噪音问题。

五、关键工程细节

  1. 上报 IP 以 TCP 来源为准:Server 从 r.RemoteAddr 解析真实来源地址,不采信 Agent 自报的 IP。这在网络地址转换(NAT)或容器环境下尤为准确,也更安全。
  2. 失败重试指数退避:上报失败时,Agent 按 1s → 2s → 4s 的间隔重试,最多 3 恡,避免瞬时网络抖动导致数据丢失。
  3. 阈值判定单一实现:/status 查询和告警协程共用同一个阈值判定函数,杜绝“面板显示正常、告警却在疯狂刷”的不一致现象。
  4. 单请求 panic 隔离:Server 的每个 handler 都包装了 recover,单个请求的 panic 不会拖垮整个服务。

六、部署步骤

前置条件

  • Server 端需要安装 Go 语言环境,用于编译 Server 和 Agent。
  • 执行机端无需安装任何运行时,直接使用预编译的二进制文件。

1. 编译并启动 Server

在 Server 所在机器上执行:

bash

安装 Go 环境(如尚未安装)

例如在 Ubuntu 上:sudo apt install golang-go

克隆或下载源码后,编译 Server

go build -ldflags "-s -w" -o pulse-server ./server

编译 Agent(可选,用于交叉编译)

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o pulse-agent ./agent

启动 Server

./pulse-server

Server 默认监听在 8080 端口,提供 Dashboard 和 API。安装脚本与 Agent 上报地址的示例中使用 8123 端口,实际部署时请以你的配置为准。

2. 安装 Agent(每台执行机)

在每台执行机上,使用一行命令即可完成安装、配置和启动:

bash curl -fsSL http://<server-ip>:8123/resources/install-pulse.sh | bash -s -- "http://<server-ip>:8123/report"

该脚本会自动完成以下操作:

  • 下载 Pulse Agent 二进制文件。
  • 写入 systemd 服务文件,设置开机自启和崩溃自动重启(5 秒自愈)。
  • 启动服务并验证运行状态。

安装完成后,Agent 会每 10 秒向 Server 上报一次指标。

3. 访问 Dashboard

在浏览器中打开 http://&lt;server-ip&gt;:8080/,即可看到集群总览面板。面板支持按主机名或 IP 实时搜索、表头排序、分页,点击任意主机可查看详细指标卡片。

七、适用场景与边界

适合的场景

  • 执行机、构建机、测试机集群的日常健康巡检。
  • 内网、无外网,或无法引入重型监控栈的环境。
  • 只需解决机器状态可见性,不想背负监控运维负担的团队。

不适合的场景

  • 需要长期指标存储和复杂查询(Pulse 为内存态,重启即清空)。
  • 需要多租户、RBAC 等权限体系。
  • 需要业务指标(如 QPS、延迟分布、错误率)——Pulse 只管机器,不管业务。

如果你的需求属于上述“不适合”的范畴,Prometheus + Grafana 仍然是更全面的选择。

八、总结

Pulse 用两个 Go 单文件、10 秒上报、智能告警去重和内嵌 Dashboard,为执行机集群提供了一种轻量、零依赖的监控方案。它不追求大而全,而是专注于“机器状态可见”这一核心问题,让运维团队能够从 SSH 人肉排查中解放出来。

你可以通过访问 Dashboard 验证部署是否成功:如果看到所有主机的状态正常上报,即说明系统运行良好。如果遇到问题,可以检查 Agent 的 systemd 日志(journalctl -u pulse-agent)或 Server 的控制台输出。