Host Monitor · 远程主机运行指标监控

一个跨平台的多主机监控系统:一台监控中心统一查看多台远程主机Windows / Ubuntu / macOS)的运行指标,支持长期历史曲线与超阈值邮件告警。

  • 监控中心(本仓库)运行在 Linux 服务器,内置"本机采集",开箱即用
  • 远程主机安装轻量 agentPython 单进程 / Windows 免装 Python 单 exe),主动出站上报,可穿透 NAT/防火墙,无需开放任何入站端口
  • 数据存 SQLite 时序表:原始 2s 保留 1 天 → 1 分钟档 30 天 → 5 分钟档 1 年(自动降采样)

版本 语言


功能特性

监控指标 Linux Windows
CPU 使用率 / 每核 / 频率
CPU 温度 coretemp/k10temp 原生 WMI (ACPI 热区, 零第三方)
内存 / Swap(页面文件)
高使用率进程 Top25
磁盘分区占用 / 磁盘 IO
网速多网卡(主网卡识别)
GPUNVIDIA 使用率/显存/温度)
GPUAMD rocm-smi ⚠️ N/A
负载 loadavg ⚠️ N/A
  • 多主机切换:顶部下拉一键切换(本机★ + 远程主机),离线主机置灰
  • 长期历史:区间可选 1 分钟 ~ 1 年,按区间自动选档位 + 抽稀,长区间流畅不卡
  • 超阈值告警:CPU / 内存 / 磁盘超阈值 → 邮件通知(30 分钟冷却防轰炸,每主机可覆盖阈值,SMTP 可在管理页配置与测试)
  • 动态快照:进程 Top25 / 磁盘分区 / 网卡列表 / 系统信息,每 10s2.5min 随上报更新
  • 硬件信息:顶部只显示简要信息(主机名/系统/CPU核数/内存/GPU总显存/运行时长),点「更多硬件信息」弹窗查看 CPU 型号、内核、GPU 详单、主网卡等

架构

┌─────────────────────────┐          ┌──────────────────────────────┐
│  远程主机 (Win/Ubuntu)   │          │  监控中心 (Linux 服务器)       │
│                         │  HTTP+   │                              │
│  ┌─────────────────┐    │  Token   │  ┌──────────────────────┐    │
│  │  Host Agent     │ ───┼─────────▶│  │  POST /api/v1/ingest │    │
│  │ · psutil 采集    │    │  批量上报 │  └──────────┬───────────┘    │
│  │ · 本地缓冲+重试   │    │          │             ▼                │
│  │ · systemd/NSSM  │    │          │  ┌──────────────────────┐    │
│  └─────────────────┘    │          │  │  SQLite 时序存储      │    │
│                         │          │  │  (原始/1m/5m 降采样)  │    │
└─────────────────────────┘          │  └──────────┬───────────┘    │
                                     │             ▼                │
                                     │  Query API → 监控前端(多主机) │
                                     └──────────────────────────────┘

快速开始

1. 启动监控中心

cd works/host-monitor
./start.sh          # 默认 16094 端口 (PID 文件管理)
./start.sh stop     # 停止
  • 监控页:http://<IP>:16094/
  • 管理页:http://<IP>:16094/manage(主机管理 / 告警设置 / Token / 安装指引 / 告警记录)
  • 首次启动自动注册本机为 hosts 一行(builtin),无需任何配置即可看本机监控

2. 部署远程主机 agent

管理页 → 主机列表 → 点该主机「📦 安装指引」→ 弹窗内提供:

  • 部署包下载链接Gitea ReleasesWindows zip / Linux tar.gz
  • 现成的 agent.ini(已填 server_url / host_name / 统一 token
  • 分系统安装命令

Ubuntu

sudo apt install -y python3-pip && sudo pip3 install psutil
sudo mkdir -p /opt/host-monitor-agent
# 放入 agent.py / collector.py / agent.ini(填好配置)
sudo cp host-monitor-agent.service /etc/systemd/system/
sudo systemctl daemon-reload && sudo systemctl enable --now host-monitor-agent

Windows(免装 Python):

  1. 解压 Windows zip,双击 build_win.bat → 生成 dist\host-monitor-agent.exe
  2. exe + agent.ini 放目标机器同一目录,编辑 agent.ini
  3. 管理员 CMD
    nssm install HostMonitorAgent "C:\host-monitor\host-monitor-agent.exe"
    nssm set HostMonitorAgent AppDirectory "C:\host-monitor"
    nssm start HostMonitorAgent
    

3. 查看效果

监控页顶部下拉选择远程主机即可查看其全部指标与历史曲线。离线主机置灰黄标,曲线保留历史但停止更新。

管理页功能

  • 🖥️ 主机管理:主机列表(在线状态 / OS / 当前指标 / GPU),删除主机,每主机告警阈值覆盖,一键生成安装指引
  • 🔔 告警设置:启用开关、全局阈值(CPU/内存/磁盘%)、通知冷却分钟、SMTP(服务器/端口/SSL/账号/口令/发件人/收件人)+ 测试邮件
  • 🔑 Token:统一认证 token(所有 agent 共用),查看 / 复制 / 轮换
  • 📋 告警记录:最近 100 条触发与恢复记录

安全:管理页默认内网免认证;如暴露公网,建议在告警设置前于服务端设置 admin_password(设置后管理 API 需口令)。agent 上报必须带统一 tokenAuthorization: Bearer <token>)。

API 一览

POST /api/v1/ingest                    agent 上报 (Bearer 统一 token)
GET  /api/v1/hosts                     主机列表 (在线/摘要/阈值覆盖)
GET  /api/v1/hosts/<name>/metrics      时序数据 (window 自动选档 + 抽稀)
GET  /api/v1/hosts/<name>/snapshot     当前动态快照
DELETE /api/v1/hosts/<name>            删除主机
GET/POST /api/v1/settings              管理设置 (SMTP/阈值/开关)
POST /api/v1/rotate-token              轮换统一 token
POST /api/v1/test-email                测试邮件
GET  /api/v1/alerts                    告警记录
GET  /api/v1/agent-config/<name>       生成 agent.ini + 安装指引 + 下载链接

兼容保留:GET /api/metricsGET /api/config(旧单机接口,前端已统一走 v1)。

上报协议(agent → server

POST /api/v1/ingest
Authorization: Bearer <统一token>
{
  "host": "web-server-01",
  "os": "linux",
  "agent_version": "1.0.0",
  "points": [
    { "ts": 1736000000.0, "cpu_percent": 12.3, "per_cpu": [11,13.5],
      "cpu_temp": 42.0, "mem_percent": 45.6, "swap_percent": 1.2,
      "load": [0.2,0.1,0.1], "net": {"eth0": {"rx":1048576,"tx":51200}},
      "disk_io": {"read_bps":102400,"write_bps":20480}, "gpu": [...] }
  ],
  "snapshot": { "processes": [...], "disks": [...], "net_interfaces": [...], "system": {...} }
}
  • 默认 2s 采样 / 10s 批量(agent.ini 可改 interval/batch
  • 上报失败:缓冲保留 + 指数退避重试 + 本地暂存 data/pending.json
  • 上报即心跳,超过 30s 未上报自动标记离线

数据与降采样

  • data/monitor.dbSQLite WAL 模式)
  • 档位:原始 2s(保留 1 天)→ 1m AVG(保留 30 天)→ 5m AVG(保留 1 年)
  • 后台每 30s 聚合 + 清理;查询按 window 自动选档 + 长区间抽稀到 4000 点

技术栈

  • 服务端:Python 3.8+ / Flask / psutil
  • 存储:SQLiteWAL)+ 纯 REST 写入,无外部依赖
  • 前端:原生 HTML/JS + ECharts(本地文件,无 CDN
  • 采集端:Python + psutilWindows 温度走原生 WMIGPU 走 nvidia-smi/rocm-smi

项目结构

host-monitor/
├── app.py                  # 监控中心主应用 (API + 后台线程)
├── store.py                # SQLite 时序存储 + 降采样 + 查询
├── alerting.py             # 超阈值告警邮件
├── templates/
│   ├── index.html          # 监控页 (顶部主机下拉切换)
│   └── manage.html         # 管理页
├── static/echarts.min.js
├── agent/                  # 远程主机 agent
│   ├── agent.py            # 采样→批量上报主程序
│   ├── collector.py        # 跨平台采集库 (Linux/Win 分支)
│   ├── agent.ini           # 配置模板
│   ├── build_win.bat       # Windows 打包 (GBK 编码, 免 Python exe)
│   ├── host-monitor-agent.service  # Ubuntu systemd 服务
│   └── README.md           # agent 部署文档
├── release/                # 发布部署包 (win zip + linux tar.gz)
└── docs/remote-monitoring-plan.md  # 设计方案

版本历史

  • v2.4.2:①「更多」回退为卡片内展开(v2.4.0 方案,不再用悬浮面板):所有 GPU 按行正常排布,默认只显前 2 行,点「▼ 更多」直接在卡内展开剩余行(卡片变高推下内容,不遮挡/不盖住下方曲线图),按钮在 2 行/展开区底部切换;②GPU 行新增显存占用率列(绿色,已用/总量×100%):修复「使用率 100%(计算利用率)被误读为显存占用率」的困惑,V100 显存 92% 现在直接显示 92%(如 V100 0% 92% 35°C,黄=使用率 绿=显存占用率),悬停提示同步补充显存占用率

  • v2.3.62 项功能 —— ①GPU 功率仪表盘:新增「GPU 功率 (W)」曲线块,每个 GPU 一个圆饼电流计式仪表(两排显示、一排最多 4 个,下方标注简洁显卡名),所有仪表统一以各卡最大功率为满刻度,功率上限低于全局最大的卡用红色虚线标出上限,功率变化带汽车码表式平滑滑动动画(agent 新增采集 power.draw/power.limit);②「更多」展开区无缝拼接:展开时原卡底部圆角取消与展开部分对齐(展开区顶部直角→底部圆角),各 GPU 行左右对齐、间距一致,展开/收起带滚动推拉动画

  • v2.3.57 项优化 —— ①「更多」展开后收起按钮移到展开区域底部(不再夹在多卡中间);②安装指引升级为独立选项卡(与主机管理同级);③内存曲线悬停数值带 % 单位;④图表刷新后非GPU曲线按硬件块顺序、GPU 三块在其后另起一行(grid-sep 强制换行);⑤「更多」浮层改回绝对定位(展开不撑高其他硬件块、不把下面曲线图往下挤);⑥修复网络/磁盘卡大数字单位重复xx MB KB/s → 数值+动态单位 MB/s);⑦数据推送模式切换:agent 支持实时推送(默认 2s 一次)/ 累积批量(10s 一批),管理页可切换,运行中 agent 通过 ingest 响应自动生效,安装指引 ini 同步

  • v2.3.4:5 项优化 —— ①GPU 显存图悬停数值自适应单位<1G 显示 MB,≥1G 显示 GB,如 15 MB / 2.35 GB),使用率/温度图悬停也补 % / °C;②刷新后图表块自动按上方硬件小块顺序排列(CPU→内存→GPU三块→网络→磁盘IO),磁盘 IO 曲线默认隐藏;③「更多」浮层改为卡片内顺势展开(不再绝对定位浮层,避免遮挡其他硬件块/图表,align-items:start 保证其他 4 块不被撑高),修复打开更多后顶部硬件块"不刷新"观感;④告警新增推送模式开关(管理页可切换:⏱️冷却防轰炸默认 / 📨实时推送每次超阈值即发);⑤安装指引移到管理页上部Windows / Linux / 其他系统·纯 Python 三页签,host_name 占位符适配新主机),主机列表行内不再放安装指引

  • v2.3.3:① GPU 显存占用图 Y 轴固定区间 0 ~ 各卡中最大显存总量(GB)(不再随数据自适应伸缩);② 修复打开 GPU 卡「更多」浮层后顶部硬件小块停止实时更新的问题——根因是 GPU 卡每 2s 用 innerHTML 重建整个卡体(含浮层),重建会打断悬停/点击、数据观感卡死;改为结构只在卡数变化时重建,数值就地更新,「更多」按钮只切浮层显隐不重建 DOM

  • v2.3.2GPU 三张曲线图去掉右坐标轴,只保留左坐标轴——使用率(0-100%)、显存占用(实时 MB 转 GB,轴带 G 单位标签)、温度(0-100°C);后端 series 新增 gpu_mem_mb_<n> 每点实时显存占用

  • v2.3.1GPU 曲线图拆成 3 个独立图表块(GPU 使用率 / GPU 显存占用 / GPU 温度),每个块可单独拖动排序、单独隐藏/显示、单独最大化,不再挤在一个图里或竖直堆叠;老用户 localStroage 配置自动迁移(gpu 一块原位展开成三块),GPU 卡按钮一键联动显隐三块

  • v2.3.0:4 项优化 —— ①GPU 曲线图拆成 3 张独立图(使用率% / 显存占用% / 温度°C),不再一张图塞三种指标(单/多 GPU 都拆);②GPU 硬件卡每行去掉 GPU0 序号前缀,直接显示显卡型号数字;③顶部硬件小块全部实时刷新:GPU 卡/网络卡的数值改用 series 最新值(原来读快照约 30s~2.5min 才更新一次),顶部新增「🔄 最后更新 HH:MM:SS」标记;④曲线 X 轴改为数据实际范围(min/max=首末数据点),曲线从头到尾撑满整个横坐标,长窗口/部分数据主机自动适应

  • v2.2.0:4 项体验优化 —— ①进度条悬停提示改自定义气泡(悬停整条轨道即显示,含 CPU/内存/GPU 使用率·温度·显存详情);②GPU 多卡卡内默认只显示 2 行,多于 2 卡时底部「▼ 更多」浮层展开剩余(不撑大上方 5 个硬件小块),每行格式=显卡型号数字在前+进度条+使用率+温度,型号自动提取(RTX 3090→3090 / A100→A100 / T4→T4);③曲线图 X 轴改为按时间窗对齐(之前用固定 2s 补空点导致长区间/慢采样主机曲线从中间显示),时间跨度始终对齐完整窗口;④修复部分 Linux 主机刷新被顶到页面顶部(手动滚动位置恢复)

  • v2.1.2:磁盘 IO 图默认隐藏;横轴标签防重叠;进度条 title;多 GPU 一行一卡 + 三图拆分

  • v2.1.1:告警开关样式;时间轴 1970 bug;GPU 图默认显示;标题改名

  • v2.1.0:安装指引加下载链接;顶部硬件信息精简 + 「更多硬件信息」弹窗;顶部/底部 Gitea 图标链接;项目 README;修复 token 复制、Windows bat 编码、远程主机进程/磁盘数据串台

  • v2.0.1:修复 PyInstaller 单文件模式 agent.ini 路径;Release 发布

  • v2.0.0:多主机远程监控(agent 上报 + SQLite 时序 + 降采样 + 告警 + 统一 token + 前端下拉切换)

License

个人/内部使用免费。商业部署请自行评估安全加固(HTTPS + 前端口令)。

S
Description
No description provided
Readme
1.1 MiB
0 Stars 1 Watchers 0 Forks
2026-09-08 17:18:29 +08:00
Languages
HTML 52.5%
Python 46.1%
Batchfile 1%
Shell 0.4%