Beszel 干的事很窄:一分钟记一次 CPU / 内存 / 磁盘 / 显卡占用,摊成历史曲线,指标越线就往自己的地址推一条。手边几台机器跑着定时脚本和小服务,出问题往往第二天才知道。之前看负载靠 glances 手动跑一遍,看完就关了,历史一点没留。这套东西分两半,面板管界面,采集端读硬件,数据落在本地 SQLite 里。

两个 exe,没有一个安装程序

发布页上 Windows 版给了两个 zip,一个是面板,一个是采集端。面板 13,374,188 字节,解压只有一个 beszel.exe,34,170,880 字节;采集端 6,286,962 字节,解开是 beszel-agent.exe,14,544,896 字节。没有 setup.exe,也不用先装 Go 或者数据库,前端文件编译进了二进制。

beszel_windows_amd64.zip          13,374,188 字节
  └─ beszel.exe                   34,170,880 字节
beszel-agent_windows_amd64.zip     6,286,962 字节
  └─ beszel-agent.exe             14,544,896 字节
两个 exe 合计                     48,715,776 字节
运行库依赖                         无

好处是搬到别的机器上只需要复制目录,两个 exe 加起来 48,715,776 字节。坏处是两个都得分别起,面板本身不采集数据,它只负责收和画。

面板 1.58 秒起来,账号在页面上建

起服务的命令很短,端口和数据目录都能指定,不带参数时默认监听 127.0.0.1:8090。从进程启动到首页返回 200,计时 1.58 秒。

beszel.exe serve --http 127.0.0.1:8090 --dir data
进程到首页 200                    1.58 秒
首页 HTML                          1,214 字节
/api/health 十次                   1.24 ~ 1.51 毫秒
data 目录首次生成                  914,659 字节

第一次打开是一张创建管理员的表单,邮箱 / 密码 / 确认密码三格,填完点按钮,0.35 秒进到仪表盘。仪表盘此时是空的,一行写着 No systems found。

有一步容易走岔。它基于 PocketBase,命令行里有 superuser upsert,0.394 秒就能建一个账号并提示 Successfully saved。建出来的是数据库管理员,不是面板用户,回到网页照样让你创建管理员账号。真要重置面板密码,得走 users 集合,不是这条命令。

加机器这一步,坑在一串 token 上

仪表盘右上角 Add System,弹窗里切到 Binary,会直接给你公钥和一条安装命令。系统记录建好之后,采集端要在被监控的机器上跑起来,命令长这样:

beszel-agent.exe -key "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP39r046..." \
                 -token "ddd7246a-b0d2-4270-bb26-d278d36f2c51" \
                 -listen 45876

采集端不是 HTTP 服务,日志里写的是 Starting SSH server addr=:45876,它开一个 SSH 端口,由面板主动连过来拉数据。端口要通,面板那边记录的地址和端口也要对。

踩坑就在 token。弹窗里 Token 那一格显示的是一串 3e939361-e677-4f13-...,照着填进去,采集端进程正常,45876 也在监听,面板上那个圆点一直是灰的,状态 down,等了三分钟没动静。翻 data\data.db 的 fingerprints 表才发现,这个系统真正的令牌是另一串 ddd7246a-b0d2-4270-bb26-d278d36f2c51。换成它,六秒内变绿。

这种失败没有任何报错提示,采集端不打印错误,面板也不说为什么连不上,只是把状态标成 down。静默失败最难查,45876 被防火墙拦掉是第一怀疑对象,实际不是。

字符串来源等待秒数面板状态说明
弹窗 Token 格180down进程在跑,端口在听
data.db 的 fingerprints 表6up采集数据正常

第二处坑在改地址。系统建好之后如果改了 host 或者 port(换个端口),面板不会自动重连,得把 hub 停掉再起。改完不重启,界面上还是 down 状态,很容易误判成采集端的问题。

面板上的指标比预想的多

这台测试机是 i5-12400F,6 核 12 线程,31.86 GB 内存,C 盘 329.43 GB 用了 87.78%。接上之后它给出的图表有 CPU 使用率 / 内存 / 根分区 / 磁盘吞吐 / 带宽 / 负载 / 温度,另外还有显卡。

CPU 总占用        15.52%(每核 12 个值:24/11/28/12/21/9/18/10/15/9/15/13)
负载均值          0.01 / 0.04 / 0.02
采集间隔          60 秒一个点
指标读数
内存已用 GB24.09
内存总量 GB31.86
内存占用 %75.61
根分区已用 GB289.16
根分区总量 GB329.43
根分区占用 %87.78
显存已用 MB2713.87
显卡占用 %16.73
显卡功耗 W31.5
显卡温度 °C40
磁盘读 B/s14404
磁盘写 B/s477055
网卡收 B/s199077
网卡发 B/s149139

显卡那几项是没料到的。它读到 nvidia-smi 给的数据,占用 16.73%、显存 2713.87 MB、功耗 31.5 W 三个都在,温度 40°C 也一起进来。跑本地模型或者做转码的机器,看这个比翻任务管理器省事。

时间范围在右上角切换,最短 1 minute,最长 30 days。默认 1 hour,数据点一分钟一个,切到 30 days 时它把老点聚合成更粗的粒度再画。

告警能真的推到自己的地址

通知走的是 Shoutrrr,所以填一条 URL 就够,不用在界面里一个个配服务商。在本地起个接收端,把 generic+http://127.0.0.1:8899/hook 填进 Notifications 的 Webhook 那一行,点 Test URL,三秒内收到一条:

Test Alert

This is a notification from Beszel.

http://localhost:8090

把 CPU 告警阈值设成 1%,一分钟后触发,收到的正文是这样:

shiceku-win CPU above threshold

CPU averaged 19.51% for the previous 1 minute.

http://localhost:8090/system/9hn5nd6gpuj6gdz

它报的是上一分钟的平均值,不是瞬时值。这一点比抓瞬时峰值靠谱,不会因为一次编译把手机吵醒。告警历史里留下一条记录,系统名 / 指标 / 触发时间 / 持续时长四列,状态 Active。

设置里还有 Quiet Hours,可以划一段免打扰时间,比如从 2 点到 6 点这 4 个小时。这段时间照样采集,只是不发通知,省得半夜重启机器被自己的告警吵醒。

占多少内存,长多快

两个进程同时跑,面板 37.5 MB 工作集,采集端 30.8 MB,加起来 68.3 MB。私有内存分别是 59 MB 和 58.5 MB,比工作集大一些,那部分含共享映射,实际吃掉多少看工作集更接近。

beszel.exe         工作集 37.5 MB   私有 59.0 MB
beszel-agent.exe   工作集 30.8 MB   私有 58.5 MB
两个加起来         工作集 68.3 MB
data.db            466,944 字节(含表结构与历史点)
辅助库             4,096 字节
面板私钥           id_ed25519,387 字节
一天数据点         1,440 个(一分钟一个)
进程工作集 MB私有 MB
beszel.exe37.559.0
beszel-agent.exe30.858.5

数据库是一个文件,加一个 auxiliary.db 存日志,再加一个 id_ed25519 是面板连采集端用的私钥。备份就是把 data 目录整个复制走,换机器拷回去接着用。一分钟一个点,一天 1,440 个点,按这个量级一块盘能存很久。

几处不太顺手的地方

温度这一栏在这台机器上只有显卡的数据。图上标着 Temperature,里面只有一个 40°C,来源是 RTX 3060。它不支持读 Windows 下的 CPU 温度,12 个逻辑核对应的传感器一个都没出现,要拿这个数得另接一层驱动才行。

容器那部分要有 Docker 或 Podman 才显示,机器上没装,Containers 这一栏就不出现,也不会报错。

SMART 磁盘健康和 ZFS 池在 Windows 上基本看不到,这两项得在 Linux 上才有完整数据。

监控第二台机器要在那台上单独跑一份采集端,面板这边再点一次 Add System,两台机器就是两次配置、两把公钥。端口 8090 和 45876 写死在 bat 里,撞上了要自己改,改完还得重启面板才会重连,这一点做不到自动发现。

没测的部分交代清楚,5 项:HTTPS 与反向代理 / OAuth 登录 / 多用户权限分配 / SMTP 邮件告警 / 手机上看面板,都没跑。要放到公网,至少先把 TLS 和访问控制配好再开,别裸着把 8090 挂出去。