Host Monitor · 远程主机运行指标监控
一个跨平台的多主机监控系统:一台监控中心统一查看多台远程主机(Windows / Ubuntu / macOS)的运行指标,支持长期历史曲线与超阈值邮件告警。
- 监控中心(本仓库)运行在 Linux 服务器,内置"本机采集",开箱即用
- 远程主机安装轻量 agent(Python 单进程 / Windows 免装 Python 单 exe),主动出站上报,可穿透 NAT/防火墙,无需开放任何入站端口
- 数据存 SQLite 时序表:原始 2s 保留 1 天 → 1 分钟档 30 天 → 5 分钟档 1 年(自动降采样)
功能特性
| 监控指标 | Linux | Windows |
|---|---|---|
| CPU 使用率 / 每核 / 频率 | ✅ | ✅ |
| CPU 温度 | ✅ coretemp/k10temp | ✅ 原生 WMI (ACPI 热区, 零第三方) |
| 内存 / Swap(页面文件) | ✅ | ✅ |
| 高使用率进程 Top25 | ✅ | ✅ |
| 磁盘分区占用 / 磁盘 IO | ✅ | ✅ |
| 网速多网卡(主网卡识别) | ✅ | ✅ |
| GPU(NVIDIA 使用率/显存/温度) | ✅ | ✅ |
| GPU(AMD) | ✅ 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 Releases:Windows 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):
- 解压 Windows zip,双击
build_win.bat→ 生成dist\host-monitor-agent.exe - exe + agent.ini 放目标机器同一目录,编辑 agent.ini
- 管理员 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 上报必须带统一 token(Authorization: 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/metrics、GET /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.db(SQLite WAL 模式)- 档位:原始 2s(保留 1 天)→ 1m AVG(保留 30 天)→ 5m AVG(保留 1 年)
- 后台每 30s 聚合 + 清理;查询按 window 自动选档 + 长区间抽稀到 4000 点
技术栈
- 服务端:Python 3.8+ / Flask / psutil
- 存储:SQLite(WAL)+ 纯 REST 写入,无外部依赖
- 前端:原生 HTML/JS + ECharts(本地文件,无 CDN)
- 采集端:Python + psutil(Windows 温度走原生 WMI,GPU 走 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.6:2 项功能 —— ①GPU 功率仪表盘:新增「GPU 功率 (W)」曲线块,每个 GPU 一个圆饼电流计式仪表(两排显示、一排最多 4 个,下方标注简洁显卡名),所有仪表统一以各卡最大功率为满刻度,功率上限低于全局最大的卡用红色虚线标出上限,功率变化带汽车码表式平滑滑动动画(agent 新增采集 power.draw/power.limit);②「更多」展开区无缝拼接:展开时原卡底部圆角取消与展开部分对齐(展开区顶部直角→底部圆角),各 GPU 行左右对齐、间距一致,展开/收起带滚动推拉动画
-
v2.3.5:7 项优化 —— ①「更多」展开后收起按钮移到展开区域底部(不再夹在多卡中间);②安装指引升级为独立选项卡(与主机管理同级);③内存曲线悬停数值带 % 单位;④图表刷新后非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.2:GPU 三张曲线图去掉右坐标轴,只保留左坐标轴——使用率(0-100%)、显存占用(实时 MB 转 GB,轴带 G 单位标签)、温度(0-100°C);后端 series 新增
gpu_mem_mb_<n>每点实时显存占用 -
v2.3.1:GPU 曲线图拆成 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 + 前端口令)。