From 4f4241f7d4e6428042294a6692b7aea4b1255f28 Mon Sep 17 00:00:00 2001 From: stqfdyr <89149493+stqfdyr@users.noreply.github.com> Date: Wed, 7 Oct 2026 04:37:22 +0800 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20=E6=80=A7=E8=83=BD=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E6=8C=89=20hub=20v1.4.0=20=E5=9C=A8=E6=96=B0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=9C=BA=E4=B8=8A=E9=87=8D=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Home.tsx | 4 +-- src/content/guide/philosophy.mdx | 10 +++--- src/content/reference/performance.mdx | 50 +++++++++++++++------------ src/entry-server.tsx | 2 +- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/Home.tsx b/src/Home.tsx index 2059ecb..6754b2e 100644 --- a/src/Home.tsx +++ b/src/Home.tsx @@ -8,7 +8,7 @@ import { REPO, THEMES } from "@/site" import HeroInstall from "@/hero-install.mdx" const SIZES = [ - { who: "Hub", bin: "6.7 MiB", rss: "7.0 MiB" }, + { who: "Hub", bin: "6.8 MiB", rss: "7.0 MiB" }, { who: "Agent", bin: "1.8 MiB", rss: "2.0 MiB" }, ] @@ -23,7 +23,7 @@ const SECURITY = [ const FEATURES = [ { t: "Rust,没有 GC,也没有语言运行时", - d: "单个静态二进制,不依赖解释器、虚拟机或运行时库。内存不随负载起伏:空转 7.0 MiB,200 个节点同时在线 8.4 MiB,占一颗核的 2.5%。", + d: "单个静态二进制,不依赖解释器、虚拟机或运行时库。内存只随节点数缓慢增长:空转 7.0 MiB,200 个节点同时在线 11.0 MiB,占一颗核的 1.2%。", }, { t: "功能已经收束到极致", diff --git a/src/content/guide/philosophy.mdx b/src/content/guide/philosophy.mdx index ea51ba0..5e7b6e0 100644 --- a/src/content/guide/philosophy.mdx +++ b/src/content/guide/philosophy.mdx @@ -85,11 +85,11 @@ hub 只有四个运行参数:`--listen`、`--db`、`--themes`、`--site`,外 | | | |---|---| -| 可执行文件 | 6.7 MiB | -| 冷启动到能响应请求 | 16 ms | +| 可执行文件 | 6.8 MiB | +| 冷启动到能响应请求 | 6.4 ms | | 空转内存 | 7.0 MiB | -| 200 个节点在线,每 2 秒上报 | 8.4 MiB,一颗核的 2.5% | -| 每秒 1000 次上报 | 8.6 MiB | +| 200 个节点在线,每 2 秒上报 | 11.0 MiB,一颗核的 1.2% | +| 1000 个节点在线,每秒上报 | 29.3 MiB,一颗核的 8% | -Rust 没有 GC,也没有语言运行时,负载上去内存基本不动。换语言只带来体积和内存上的优势,响应速度 +Rust 没有 GC,也没有语言运行时,内存只随在线节点数缓慢增长,每台约 23 KiB。换语言只带来体积和内存上的优势,响应速度 靠的是几处具体的调优,记在同一页。 diff --git a/src/content/reference/performance.mdx b/src/content/reference/performance.mdx index 7cd0e43..6bd71bb 100644 --- a/src/content/reference/performance.mdx +++ b/src/content/reference/performance.mdx @@ -1,15 +1,15 @@ -测试机是 3 核 3.8 GiB 的 Xeon E5-2699 v4,Debian 12,release 构建 -(LTO + `opt-level=z` + strip)。负载来自一个模拟 agent 程序。体积、历史数据、空转内存、冷启动与 -密码登录按 hub v1.3.2、agent v1.1.0 的发布版二进制实测(musl 静态链接,与 Docker 镜像里的是同一个)。 +测试机是 4 核 20 GiB 的 AMD EPYC 9275F,Debian 13。全部数字按 hub v1.4.0、agent v1.2.0 的发布版二进制实测 +(release 构建:LTO + `opt-level=z` + strip,musl 静态链接,与 Docker 镜像里的是同一个)。负载来自一个模拟 +agent 程序,与 hub 跑在同一台机器上,按真实 agent 的格式上报。 ## 装机体积 | | | |---|---:| -| hub 可执行文件 | **6.7 MiB** | +| hub 可执行文件 | **6.8 MiB** | | agent 可执行文件 | **1.8 MiB** | -| hub 冷启动到能响应请求(8 个节点、7 天历史的库) | **16 ms** | -| 30 天历史数据(7 个节点,每台 4 个延迟监控) | **6.8 MiB** | +| hub 冷启动到能响应请求(8 个节点、7 天历史的库) | **6.4 ms** | +| 30 天历史数据(7 个节点,每台 4 个延迟监控) | **9.2 MiB** | 一个二进制加一个 `.db` 文件就是全部,没有配置文件,也没有额外目录。 @@ -18,13 +18,13 @@ | 场景 | RSS | |---|---:| | hub 空转 | **7.0 MiB** | -| hub,200 个节点在线,每 2 秒上报一次 | **8.4 MiB** | -| hub,每秒 1000 次上报 | **8.6 MiB** | -| hub,每秒 1000 次上报 + 8 个人同时刷状态页 | **18.2 MiB** | +| hub,200 个节点在线,每 2 秒上报一次 | **11.0 MiB** | +| hub,1000 个节点在线,每秒上报一次 | **29.3 MiB** | +| hub,1000 个节点每秒上报 + 8 个人同时刷状态页 | **32.9 MiB** | | agent,线上实例常驻 | **2.0 MiB** | -每秒 1000 次上报大约等于 1000 个节点按默认的 1 秒间隔在报。负载上去基本不涨,Rust 没有 GC, -也没有语言运行时。 +内存随在线节点数缓慢增长,每台约 23 KiB,是各自那条连接的收发缓冲。Rust 没有 GC,也没有语言运行时, +上报再频繁也不会攒出待回收的垃圾。 ### 密码登录 @@ -34,11 +34,11 @@ | | RSS | |---|---:| | 登录前 | 7.0 MiB | -| 串行密码登录 20 次,过程中的峰值 | 26.1 MiB | +| 串行密码登录 20 次,过程中的峰值 | 25.8 MiB | | 登录完 | **7.1 MiB** | 并发登录由闸门挡住:同一时刻只算一次 argon2,其余请求直接返回 429,不排队。8 个请求同时登录, -峰值是 25.9 MiB。首次启动生成应急密码也要算一次,所以刚装好的 hub 峰值就已经在 25 MiB 左右。 +峰值是 25.8 MiB。首次启动生成应急密码也要算一次,所以刚装好的 hub 峰值就已经在 25 MiB 左右。 自己用 glibc 目标构建(`cargo build --release` 的默认目标)不一样:glibc 不把这块内存还给系统, 每次密码登录常驻内存涨一截,串行登录 50 次后停在约 350 MiB,超过单元文件给的 `MemoryMax=256M`。 @@ -50,27 +50,31 @@ | 场景 | | |---|---:| -| 200 节点每 2 秒上报,跑 90 秒 | **2.3 秒** | -| 每秒 1000 次上报,跑 60 秒 | **16.1 秒** | -| 上报 + 刷状态页混合,跑 90 秒 | **33.0 秒** | +| 200 节点每 2 秒上报,跑 90 秒 | **1.1 秒** | +| 1000 节点每秒上报,跑 60 秒 | **4.9 秒** | +| 上报 + 刷状态页混合,跑 90 秒 | **183.7 秒** | -换算一下,200 个节点在线时占一颗核的 2.5%。 +换算一下,200 个节点在线时占一颗核的 1.2%,1000 个节点占 8%。混合那一行几乎全花在压缩状态页的回复上, +见下一节。 ## 状态页响应速度 -在每秒 1000 次上报的同时,8 个并发不停地刷状态页: +在 1000 个节点每秒上报的同时,8 个并发不停地刷状态页,和浏览器一样要 gzip: | | | |---|---:| -| 每秒处理的请求数 | **723** | -| 中位延迟 | **9.4 ms** | -| p99 延迟 | **33 ms** | +| 每秒处理的请求数 | **308** | +| 中位延迟 | **24.4 ms** | +| p99 延迟 | **78 ms** | -723 这个数打到了压测客户端自己的上限,真实上限更高。 +1000 个节点的节点列表是 1.04 MiB 的 JSON,压缩后约 37 KiB,每个请求各压一次。不要 gzip 时同样的负载是 +每秒 1443 次、中位 5.1 ms,CPU 只用 39.0 秒:时间差不多都花在压缩上。状态页正常打开只取一次节点列表, +之后走实时推送,推送的压缩结果每 2 秒只算一次,与开着的页面数无关。 ## 这些数字是调出来的 -光换语言只拿得到体积和内存的优势。同样的混合负载,调优前后: +光换语言只拿得到体积和内存的优势。下表是那一轮调优时在另一台 3 核机器上、200 个节点每 200 ms 上报 +的混合负载下量的,与上文不是同一台机器、同一组负载: | | 调优前 | 调优后 | | |---|---:|---:|---| diff --git a/src/entry-server.tsx b/src/entry-server.tsx index 9505d3c..52e68e9 100644 --- a/src/entry-server.tsx +++ b/src/entry-server.tsx @@ -11,7 +11,7 @@ export const routes = [ { path: "/", title: "monitor — 服务器探针文档", - desc: "用 Rust 写的服务器探针:hub 单二进制 6.7 MiB,agent 1.8 MiB,默认只监听回环。安全、极简、高效。", + desc: "用 Rust 写的服务器探针:hub 单二进制 6.8 MiB,agent 1.8 MiB,默认只监听回环。安全、极简、高效。", }, ...docs.map((d) => ({ path: d.path, title: `${d.label} — monitor 文档`, desc: d.desc })), ] From de8eca5424aa6a7bb543199aa9d821b0e371f551 Mon Sep 17 00:00:00 2001 From: stqfdyr <89149493+stqfdyr@users.noreply.github.com> Date: Fri, 9 Oct 2026 14:17:28 +0800 Subject: [PATCH 2/3] =?UTF-8?q?docs:=20=E6=80=A7=E8=83=BD=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E6=8C=89=E5=85=AC=E5=BC=80=E8=8A=82=E7=82=B9=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=A4=8D=E7=94=A8=E5=8E=8B=E7=BC=A9=E5=B8=A7=E5=90=8E?= =?UTF-8?q?=E7=9A=84=E6=9E=84=E5=BB=BA=E9=87=8D=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Home.tsx | 2 +- src/content/guide/philosophy.mdx | 6 +++--- src/content/reference/performance.mdx | 31 +++++++++++++-------------- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/Home.tsx b/src/Home.tsx index 6754b2e..b68975a 100644 --- a/src/Home.tsx +++ b/src/Home.tsx @@ -23,7 +23,7 @@ const SECURITY = [ const FEATURES = [ { t: "Rust,没有 GC,也没有语言运行时", - d: "单个静态二进制,不依赖解释器、虚拟机或运行时库。内存只随节点数缓慢增长:空转 7.0 MiB,200 个节点同时在线 11.0 MiB,占一颗核的 1.2%。", + d: "单个静态二进制,不依赖解释器、虚拟机或运行时库。内存只随节点数缓慢增长:空转 7.0 MiB,200 个节点同时在线 10.8 MiB,占一颗核的 1%。", }, { t: "功能已经收束到极致", diff --git a/src/content/guide/philosophy.mdx b/src/content/guide/philosophy.mdx index 5e7b6e0..96155a4 100644 --- a/src/content/guide/philosophy.mdx +++ b/src/content/guide/philosophy.mdx @@ -86,10 +86,10 @@ hub 只有四个运行参数:`--listen`、`--db`、`--themes`、`--site`,外 | | | |---|---| | 可执行文件 | 6.8 MiB | -| 冷启动到能响应请求 | 6.4 ms | +| 冷启动到能响应请求 | 4.6 ms | | 空转内存 | 7.0 MiB | -| 200 个节点在线,每 2 秒上报 | 11.0 MiB,一颗核的 1.2% | -| 1000 个节点在线,每秒上报 | 29.3 MiB,一颗核的 8% | +| 200 个节点在线,每 2 秒上报 | 10.8 MiB,一颗核的 1% | +| 1000 个节点在线,每秒上报 | 29.5 MiB,一颗核的 6% | Rust 没有 GC,也没有语言运行时,内存只随在线节点数缓慢增长,每台约 23 KiB。换语言只带来体积和内存上的优势,响应速度 靠的是几处具体的调优,记在同一页。 diff --git a/src/content/reference/performance.mdx b/src/content/reference/performance.mdx index 6bd71bb..009a816 100644 --- a/src/content/reference/performance.mdx +++ b/src/content/reference/performance.mdx @@ -1,4 +1,4 @@ -测试机是 4 核 20 GiB 的 AMD EPYC 9275F,Debian 13。全部数字按 hub v1.4.0、agent v1.2.0 的发布版二进制实测 +测试机是 4 核 20 GiB 的 AMD EPYC 9275F,Debian 13。全部数字按 hub v1.4.1、agent v1.2.0 的发布版二进制实测 (release 构建:LTO + `opt-level=z` + strip,musl 静态链接,与 Docker 镜像里的是同一个)。负载来自一个模拟 agent 程序,与 hub 跑在同一台机器上,按真实 agent 的格式上报。 @@ -8,7 +8,7 @@ agent 程序,与 hub 跑在同一台机器上,按真实 agent 的格式上 |---|---:| | hub 可执行文件 | **6.8 MiB** | | agent 可执行文件 | **1.8 MiB** | -| hub 冷启动到能响应请求(8 个节点、7 天历史的库) | **6.4 ms** | +| hub 冷启动到能响应请求(8 个节点、7 天历史的库) | **4.6 ms** | | 30 天历史数据(7 个节点,每台 4 个延迟监控) | **9.2 MiB** | 一个二进制加一个 `.db` 文件就是全部,没有配置文件,也没有额外目录。 @@ -18,9 +18,9 @@ agent 程序,与 hub 跑在同一台机器上,按真实 agent 的格式上 | 场景 | RSS | |---|---:| | hub 空转 | **7.0 MiB** | -| hub,200 个节点在线,每 2 秒上报一次 | **11.0 MiB** | -| hub,1000 个节点在线,每秒上报一次 | **29.3 MiB** | -| hub,1000 个节点每秒上报 + 8 个人同时刷状态页 | **32.9 MiB** | +| hub,200 个节点在线,每 2 秒上报一次 | **10.8 MiB** | +| hub,1000 个节点在线,每秒上报一次 | **29.5 MiB** | +| hub,1000 个节点每秒上报 + 8 个人同时刷状态页 | **34.6 MiB** | | agent,线上实例常驻 | **2.0 MiB** | 内存随在线节点数缓慢增长,每台约 23 KiB,是各自那条连接的收发缓冲。Rust 没有 GC,也没有语言运行时, @@ -50,12 +50,11 @@ agent 程序,与 hub 跑在同一台机器上,按真实 agent 的格式上 | 场景 | | |---|---:| -| 200 节点每 2 秒上报,跑 90 秒 | **1.1 秒** | -| 1000 节点每秒上报,跑 60 秒 | **4.9 秒** | -| 上报 + 刷状态页混合,跑 90 秒 | **183.7 秒** | +| 200 节点每 2 秒上报,跑 90 秒 | **0.9 秒** | +| 1000 节点每秒上报,跑 60 秒 | **3.6 秒** | +| 上报 + 刷状态页混合,跑 90 秒 | **12.9 秒** | -换算一下,200 个节点在线时占一颗核的 1.2%,1000 个节点占 8%。混合那一行几乎全花在压缩状态页的回复上, -见下一节。 +换算一下,200 个节点在线时占一颗核的 1%,1000 个节点占 6%,再加 8 个人不停刷状态页是 14%。 ## 状态页响应速度 @@ -63,13 +62,13 @@ agent 程序,与 hub 跑在同一台机器上,按真实 agent 的格式上 | | | |---|---:| -| 每秒处理的请求数 | **308** | -| 中位延迟 | **24.4 ms** | -| p99 延迟 | **78 ms** | +| 每秒处理的请求数 | **1065** | +| 中位延迟 | **7.6 ms** | +| p99 延迟 | **15 ms** | -1000 个节点的节点列表是 1.04 MiB 的 JSON,压缩后约 37 KiB,每个请求各压一次。不要 gzip 时同样的负载是 -每秒 1443 次、中位 5.1 ms,CPU 只用 39.0 秒:时间差不多都花在压缩上。状态页正常打开只取一次节点列表, -之后走实时推送,推送的压缩结果每 2 秒只算一次,与开着的页面数无关。 +1065 这个数打到了压测客户端自己的上限(解开每个回复),hub 只用了一颗核的 14%,真实上限更高。 +1000 个节点的节点列表是 1.04 MiB 的 JSON,压缩后约 34 KiB。压缩结果与实时推送共用,每 2 秒只算一次, +与请求数、开着的页面数都无关。不要 gzip 时 hub 反而更忙:同样的负载 CPU 用 38.9 秒,花在发送 1 MiB 的明文上。 ## 这些数字是调出来的 From 1425733cc12fe8f71879cdb6bdf538f46ec9a197 Mon Sep 17 00:00:00 2001 From: stqfdyr <89149493+stqfdyr@users.noreply.github.com> Date: Sun, 11 Oct 2026 00:24:06 +0800 Subject: [PATCH 3/3] =?UTF-8?q?docs:=20=E6=80=A7=E8=83=BD=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E6=8C=89=E5=8F=91=E5=B8=83=E7=89=88=20hub=20v1.4.1?= =?UTF-8?q?=E3=80=81agent=20v1.2.1=20=E9=87=8D=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Home.tsx | 2 +- src/content/guide/philosophy.mdx | 6 +++--- src/content/reference/performance.mdx | 22 +++++++++++----------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Home.tsx b/src/Home.tsx index b68975a..5e7a25a 100644 --- a/src/Home.tsx +++ b/src/Home.tsx @@ -23,7 +23,7 @@ const SECURITY = [ const FEATURES = [ { t: "Rust,没有 GC,也没有语言运行时", - d: "单个静态二进制,不依赖解释器、虚拟机或运行时库。内存只随节点数缓慢增长:空转 7.0 MiB,200 个节点同时在线 10.8 MiB,占一颗核的 1%。", + d: "单个静态二进制,不依赖解释器、虚拟机或运行时库。内存只随节点数缓慢增长:空转 7.0 MiB,200 个节点同时在线 10.8 MiB,占一颗核的 2%。", }, { t: "功能已经收束到极致", diff --git a/src/content/guide/philosophy.mdx b/src/content/guide/philosophy.mdx index 96155a4..3261a53 100644 --- a/src/content/guide/philosophy.mdx +++ b/src/content/guide/philosophy.mdx @@ -86,10 +86,10 @@ hub 只有四个运行参数:`--listen`、`--db`、`--themes`、`--site`,外 | | | |---|---| | 可执行文件 | 6.8 MiB | -| 冷启动到能响应请求 | 4.6 ms | +| 冷启动到能响应请求 | 6.5 ms | | 空转内存 | 7.0 MiB | -| 200 个节点在线,每 2 秒上报 | 10.8 MiB,一颗核的 1% | -| 1000 个节点在线,每秒上报 | 29.5 MiB,一颗核的 6% | +| 200 个节点在线,每 2 秒上报 | 10.8 MiB,一颗核的 2% | +| 1000 个节点在线,每秒上报 | 29.5 MiB,一颗核的 9% | Rust 没有 GC,也没有语言运行时,内存只随在线节点数缓慢增长,每台约 23 KiB。换语言只带来体积和内存上的优势,响应速度 靠的是几处具体的调优,记在同一页。 diff --git a/src/content/reference/performance.mdx b/src/content/reference/performance.mdx index 009a816..98d0a92 100644 --- a/src/content/reference/performance.mdx +++ b/src/content/reference/performance.mdx @@ -1,4 +1,4 @@ -测试机是 4 核 20 GiB 的 AMD EPYC 9275F,Debian 13。全部数字按 hub v1.4.1、agent v1.2.0 的发布版二进制实测 +测试机是 4 核 20 GiB 的 AMD EPYC 9275F,Debian 13。全部数字按 hub v1.4.1、agent v1.2.1 的发布版二进制实测 (release 构建:LTO + `opt-level=z` + strip,musl 静态链接,与 Docker 镜像里的是同一个)。负载来自一个模拟 agent 程序,与 hub 跑在同一台机器上,按真实 agent 的格式上报。 @@ -8,7 +8,7 @@ agent 程序,与 hub 跑在同一台机器上,按真实 agent 的格式上 |---|---:| | hub 可执行文件 | **6.8 MiB** | | agent 可执行文件 | **1.8 MiB** | -| hub 冷启动到能响应请求(8 个节点、7 天历史的库) | **4.6 ms** | +| hub 冷启动到能响应请求(8 个节点、7 天历史的库) | **6.5 ms** | | 30 天历史数据(7 个节点,每台 4 个延迟监控) | **9.2 MiB** | 一个二进制加一个 `.db` 文件就是全部,没有配置文件,也没有额外目录。 @@ -50,11 +50,11 @@ agent 程序,与 hub 跑在同一台机器上,按真实 agent 的格式上 | 场景 | | |---|---:| -| 200 节点每 2 秒上报,跑 90 秒 | **0.9 秒** | -| 1000 节点每秒上报,跑 60 秒 | **3.6 秒** | -| 上报 + 刷状态页混合,跑 90 秒 | **12.9 秒** | +| 200 节点每 2 秒上报,跑 90 秒 | **1.7 秒** | +| 1000 节点每秒上报,跑 60 秒 | **5.5 秒** | +| 上报 + 刷状态页混合,跑 90 秒 | **16.8 秒** | -换算一下,200 个节点在线时占一颗核的 1%,1000 个节点占 6%,再加 8 个人不停刷状态页是 14%。 +换算一下,200 个节点在线时占一颗核的 2%,1000 个节点占 9%,再加 8 个人不停刷状态页是 19%。 ## 状态页响应速度 @@ -62,13 +62,13 @@ agent 程序,与 hub 跑在同一台机器上,按真实 agent 的格式上 | | | |---|---:| -| 每秒处理的请求数 | **1065** | -| 中位延迟 | **7.6 ms** | -| p99 延迟 | **15 ms** | +| 每秒处理的请求数 | **820** | +| 中位延迟 | **9.5 ms** | +| p99 延迟 | **21 ms** | -1065 这个数打到了压测客户端自己的上限(解开每个回复),hub 只用了一颗核的 14%,真实上限更高。 +820 这个数打到了压测客户端自己的上限(解开每个回复),hub 只用了一颗核的 19%,真实上限更高。 1000 个节点的节点列表是 1.04 MiB 的 JSON,压缩后约 34 KiB。压缩结果与实时推送共用,每 2 秒只算一次, -与请求数、开着的页面数都无关。不要 gzip 时 hub 反而更忙:同样的负载 CPU 用 38.9 秒,花在发送 1 MiB 的明文上。 +与请求数、开着的页面数都无关。不要 gzip 时 hub 反而更忙:同样的负载 CPU 用 43.0 秒,花在发送 1 MiB 的明文上。 ## 这些数字是调出来的