Skip to content

feat(cluster): 扩展节点显示 CPU / 内存 / 容器内存;修本机 CPU 上限 10% - #603

Merged
dofastted merged 1 commit into
dofastted:mainfrom
Niutopia:feat/cluster-node-host-stats
Oct 19, 2026
Merged

dofastted merged 1 commit into
dofastted:mainfrom
Niutopia:feat/cluster-node-host-stats

Conversation

@Niutopia

Copy link
Copy Markdown
Contributor

摘要

集群页「本机」卡片有 CPU / 内存 / 进程,「扩展节点」表格没有任何宿主负载,看不出哪台节点吃紧。另外本机宿主列的 CPU 最高只能显示 10%。

变更

  • 新增 src/lib/cluster/node-host.mjs:一条 sh -c 读 nproc、/proc/loadavg、/proc/meminfo(MemTotal / MemAvailable),以及 cgroup v2 下每个 Docker 容器的 memory.current − inactive_file(system.slice/docker-*.scope 与 docker/* 两种驱动目录)。口径与本机宿主列一致:CPU = load1 / 核数,内存 = MemTotal − MemAvailable。远端没有控制面进程,第三项换成「容器内存合计」(同 docker stats 扣缓存的算法)。
  • ClusterManager._checkHealth:每 30 秒的健康检查里,与 Docker /info 并行执行上述命令(5 秒超时,失败或读不到为 null,不影响链路状态),结果写入 health.host。
  • 面板 remote-list.tsx:扩展节点表格加 CPU / 内存 / 容器三列,≥85% 标黄,悬停显示核数与 load、已用 / 总内存;链路未就绪或读不到时显示「—」。链路列加 whitespace-nowrap 并放宽最小宽度,窄窗口下「已连接」不再逐字竖排。
  • panel-api.mjs hostStats():Math.round(Math.min(100, (load1 / n) * 1000) / 10) 的上限写在乘 1000 之后,结果最多 10%;改为 Math.round(Math.min(1000, …)) / 10。
  • CHANGELOG「未发布」补一行。

自检

  • biome format、web format:check、tsc -b、eslint 通过;web vitest run 全过;新增 test/unit/cluster-node-host.test.mjs(解析、CPU 封顶、缺字段返回 null;Linux 上真实执行一次命令并解析)。
  • 在本地 Docker 的 Linux 容器(挂宿主 cgroup)里执行 NODE_HOST_COMMAND,输出可解析,能读到其它容器的内存。
  • test/unit 全量:本分支与 main 失败的 13 个文件、失败用例完全相同(macOS 本地环境),集群相关 65 项全过。
  • 本地无头 Chrome 渲染扩展节点表格(正常 / 高负载 / 读不到 / 断开四种节点,1100px 与 1600px 宽),对齐正常。

未做

  • cgroup v1 节点不统计容器内存(显示「—」),CPU / 内存不受影响。
  • 没有历史曲线,只显示最近一次健康检查的值。

@dofastted
dofastted merged commit b80329b into dofastted:main Oct 19, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants