Control UI 协议负载¶
使用 pnpm build 构建。Linux 基准测试会创建私有的 Gateway 状态、合成的已签名设备/凭据、回环监听器以及一个 mock 提供程序。提供启用了 CPU 记账的委派 cgroup-v2 父组;在该子树内运行控制器,以便允许 Gateway 迁移。基准测试拥有一个唯一的子 cgroup 并验证清理。使用隔离的运行器,绝不要使用活动的服务 cgroup。
taskset --cpu-list 4-31 node scripts/bench-gateway-concurrency.ts \
--control-ui-clients 50 --active-clients 25 --drivers 4 \
--duration-ms 60000 --timeout-ms 180000 --runs 1 --warmup 0 \
--gateway-runtime /path/to/node --gateway-cpus 0,1,2,3 \
--resource-cgroup /sys/fs/cgroup/benchmark-parent \
--transpiler-cache /benchmark-cache/node \
--output /benchmark-results/node-50-25.json
对于 100/50,更改两个客户端计数。选择另一个 Gateway 运行时,保持 Node 驱动不变。记录每次测试活动的可执行文件哈希、源代码/构建/lockfile 标识、主机拓扑、内核以及观察到的亲和性。
工作负载契约¶
驱动按轮询方式分配客户端。每个已签名的 Control UI webchat 连接都订阅 inventory 及其自身会话,并启用默认的观察者 HUD。非活动客户端选择不同的空闲会话,因此它们不会围观活动客户端。这固定了事件扇出拓扑。每个活动客户端完成一次不计分的预热,然后保持一个未完成的请求,直到共同的单调时钟截止时间。已提交的请求会在其超时时间内排空。这衡量的是线路协议,不包括浏览器渲染和外部网络。
ACK 表示受理。排队的请求可能会发出一个空的 custody final 和一个可见的后续回复,两者带有不同的运行 ID,且出现顺序不定。唯一的回显 mock token 和会话身份用于关联回复。空事件/状态事件不是首增量;重复的 final 无法推进循环。日志按流身份保留部分观察结果和未匹配的首增量,而不臆造请求关联。
结果¶
requests 包含相对于开始时间的 send、ACK、first-delta 和 visible-final 时间。延迟减去 send 时间;p50/p95 使用最近秩,并包含较晚排空的请求。缺失的观测值保持为 null。streamObservations 保留未绑定的 first-delta 身份。失败、缺失回复/增量或丢失客户端会使一次试验无效;保留失败的试验,而不是静默替换它们。
summary.replies 和吞吐量只统计固定窗口内的完成数;drainedReplies 统计之后完成的请求。windowCpu 将固定窗口的 cgroup CPU 除以窗口内的回复数,并保留实际的边界时间和偏差。cpu 则以受理到排空为区间,并除以所有完成数。两者都包含已退出的 Gateway 后代进程,并排除驱动/provider;保持分母相互独立。
50 ms 采样器区分生命周期/负载窗口下的 RSS 和线程峰值,并记录线程亲和性以及 PID/TID 的诞生 tick。RSS 求和可能会重复计算共享页面并遗漏短暂的峰值;它不等同于 cgroup 的 memory.peak。观测值界定线程的生命周期。针对每种运行时,分别验证 Gateway JavaScript-worker 的事件覆盖。没有单独退出通知的 worker 只有记录的进程退出上界;请单独报告它们,而不要臆造完整的生命周期。Worker 的 atNs 具有运行时本地的时间原点。使用 epochMs 与驱动的 startEpochMs 来对负载窗口事件进行分类;原始 Node/Bun hrtime 的时间原点不同。
缓存策略与验证¶
保持用户状态新鲜。为每个不可变的 Bun 构建使用单独的 --transpiler-cache 目录;用一次完整的不计分工作负载预热每种形态(shape),在计分试验期间保留该缓存,并记录 inventory。空缓存试验构成一个单独的测试活动。独立记录 OS 页面、transpiler 缓存、产品自有的 Node 编译缓存策略以及 JIT 预热情况。针对每个发布版本/形态,比较两个 Node/Bun/Bun/Node 块的逐试验摘要,包括离散度。使用精确的构建 ID 和丢失样本计数单独进行性能分析;单个请求不是独立的运行时试验。
运行 node --import ./scripts/tsx.mjs scripts/bench-gateway-control-ui-proof.ts /path/to/runtime /delegated/cgroup 以进行可选的 Linux 进程/协议验证,覆盖已退出子进程的 CPU、worker、强制清理、回复顺序、断开连接、超时、延迟错误和取消。这不在每个 PR 的单元 CI 范围内。在计分之前,另行验证一个小型真实 Gateway 工作负载的签名受理和订阅。驱动在协调的 finish/close 握手期间始终处于监控之下,并保留可用的失败证据。Gateway 拆除会使用现有的已确认 IPC 停止和共享的服务停止预算,然后才进行强制清理,从而在排空期间保留已受理的后代工作。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw