资讯动态

NemoClaw CI 性能分析实战:用只读分析器定位慢 CLI 测试与基础镜像发布瓶颈

发布时间:2026/9/20 9:42:05 来源:尧图企业网站定制
NemoClaw CI 性能分析实战用只读分析器定位慢 CLI 测试与基础镜像发布瓶颈【免费下载链接】NemoClawRun agents like Hermes, LangChain Deep Agents, and OpenClaw more securely inside NVIDIA OpenShell with managed inference项目地址: https://gitcode.com/gh_mirrors/ne/NemoClaw导读NemoClaw 仓库内置了一套名为nemoclaw-maintainer-analyze-ci-performance的维护者技能Skill通过两个只读分析器脚本对 GitHub Actions 上留存的历史 CI 时序数据进行统计analyze-recent-cli-timings.mts用于给缓慢的 CLI 测试与测试文件排名analyze-base-image-publication-timings.mts用于对比同 commit 发布基础镜像与复用先前发布两条路径的耗时差异。读完本文你将掌握这两个分析器的完整调用方式、全部参数与默认值、底层实现原理可信运行筛选、ZIP 安全检查、分层抽样、分位数与 Bootstrap 置信区间以及如何解读其 JSON 输出并规避常见陷阱。技能概览一次调用、两份只读证据该技能位于 .agents/skills/nemoclaw-maintainer-analyze-ci-performance/SKILL.md它的定位非常明确从一个 NemoClaw checkout 中运行一个只读的独立分析器。两个命令都通过已认证的gh进行读取操作并向 stdout 输出有界bounded的 JSON全程不对 GitHub 做任何写入。这一点从源码中可以直接印证所有脚本均通过 runtime.mts 中的runGithub执行gh子命令且只在成功时返回stdout失败时抛出带脱敏处理的错误。技能注册信息skill frontmatter将其描述为Analyze retained NemoClaw CI timings for slow CLI tests, runner queues, or base-image publication即面向三个典型痛点慢 CLI 测试、runner 队列延迟、基础镜像发布耗时。对应的 Agent 接口定义在 agents/openai.yaml默认提示词是Use ... to identify the largest retained CI timing bottlenecks找出留存 CI 时序中最大的瓶颈。整套技能由以下文件组成文件职责SKILL.md使用说明与边界约束scripts/analyze-recent-cli-timings.mtsCLI 测试耗时分析器入口脚本scripts/analyze-base-image-publication-timings.mts基础镜像发布耗时分析器入口脚本scripts/runtime.mtsgh/shell 执行、诊断脱敏、有界 JSON 读取scripts/statistics.mts分位数、Bootstrap 中位数置信区间、取整分析近期 CLI 测试耗时给稳定慢的测试排名运行命令与参数在 NemoClaw 仓库根目录执行node --no-warnings \ .agents/skills/nemoclaw-maintainer-analyze-ci-performance/scripts/analyze-recent-cli-timings.mts \ --workdir $PWD其数据来源是 CI 工作流保留的cli-vitest-results构建产物artifact该历史输入在 CI 中保留 14 天因此该分析面向的是最近两周内的 main 分支推送记录。默认值刻意保持前身时序工具的契约仓库NVIDIA/NemoClaw、最多 10 份报告、排名前 15 的结果、最小样本比例为 0.7、产物名为cli-vitest-results。可通过以下可选标志覆盖标志默认值源码校验范围见脚本analyzeRecentCliTimings--repoNVIDIA/NemoClaw必须匹配owner/name格式^[A-Za-z0-9_.-]\/[A-Za-z0-9_.-]$--limit10220 的整数请求的报告数量--top15150 的整数输出排名条数--min-sample-ratio0.70.51.0 的有限数值--artifact-namecli-vitest-results1100 个[A-Za-z0-9_.-]字符--workdir当前目录分析器的工作目录参数校验发生在调用gh之前非法输入会立即报错例如--repo invalid会输出repo must be owner/name这一点有测试用例专门覆盖见下文测试验证一节。底层处理链路从 analyze-recent-cli-timings.mts 的源码可以梳理出完整的五阶段流水线① 可信运行筛选。分析器先用gh run list拉取main.yaml工作流、main分支、push事件、success状态的最多min(100, limit*10)个候选运行再用jq过滤出workflowName CI / Main Branch且事件、分支、结论均匹配的运行构建runId → {headSha, createdAt}可信映射。② 产物列举与元数据校验。通过gh api repos/{repo}/actions/artifacts?name...per_page100列举同名产物只保留属于可信运行、未过期、headSha 一致、runId 不重复的条目并要求压缩体积在 025,000,000 字节约 25 MB之间否则记入downloadFailures。收集满limit份即停止。若最终可用报告不足 2 份分析器直接抛错——这是防止以单次运行数据得出统计结论的最低样本门槛。③ 私有临时目录与限流下载。以umask 077创建mktemp临时目录通过gh api .../zip管道下载产物并用dd分块限流bs65536 count381bs1 count30784后再探测 1 字节若流式内容超出 25 MB 即标记为limit并拒绝同时用stat -c %s核对字节数与产物元数据完全一致防止半截下载混入分析。④ ZIP 安全审查与报告抽取。对每个压缩包执行严格的解压前检查依赖 Info-ZIP 的zipinfo/unzipzipinfo -t校验完整性、ZIP 条目数 ≤ 100、展开字节数 ≤ 100,000,000、条目清单文本 ≤ 7,000,000 字节并逐一拒绝 symlink/目录以外的条目类型、不安全或含特殊字符的路径-开头、绝对路径、反斜杠、控制字符、*?[通配符、./../空组件、重复路径。随后只选取其中唯一的vitest-results.json条目再次用dd限流解压到磁盘上限同样为 100,000,000 字节。⑤ 报告解析与统计聚合。解析 JSON 前先做结构性约束testResults套件数组 ≤ 5,000、numTotalTests与断言总数 ≤ 100,000、文件/测试标签 ≤ 2,000 字符。文件路径会做归一化去掉形如/NemoClaw/NemoClaw/的 runner 工作目录前缀源码中的marker逻辑使排名结果可读。随后每个套件取endTime - startTime作为文件级墙钟耗时同一运行内每文件只计一次每个断言取duration作为测试级耗时同一测试/文件在多份报告中累积样本后只有样本数 ≥max(2, ceil(reportsAnalyzed × minSampleRatio))的条目才参与排名默认 10 份报告全部成功时要求 ≥ 7 个样本从源码看这是为了过滤偶发出现、样本不足的噪音项。排名依据 statistics.mts 提供的线性插值分位数慢测试按medianMs降序、慢文件按medianWallMs降序各取前top条。输出结构分析器输出的是可直接喂给下游工具的 JSON顶层字段包括reportsRequested/reportsFound/reportsAnalyzed请求、找到、成功解析的报告数三者常因过期、下载失败、ZIP 不合法而不同downloadFailures最多 10 条失败明细runId 原因例如Artifact has an invalid compressed size or exceeds the 25,000,000-byte limit、Artifact contains more than 100 entries、Artifact contains an unsafe, ambiguous, or option-like path、Could not parse bounded vitest-results.json structureminSamples实际生效的最小样本数runs每个被采纳运行的runId、createdAt、headSha、totalTests、testFilesslowTestsfile、name、samples、medianMs、p90Ms、minMs、maxMsslowFilesfile、samples、medianWallMs、p90WallMs、maxWallMs。其中slowTests的medianMs是排名主键p90Ms可用于识别中位数不高但偶发极慢的抖动型测试slowFiles则以文件级墙钟中位数为准直接对应 CI 中该测试文件的整体执行时长。运行环境依赖脚本通过bash -c执行外部命令见runtime.mts的runShell超时与 10 MB 输出上限由调用方传入因此要求 Linux 环境具备Bash、GNUdd与find、Info-ZIP 的zipinfo与unzip、awk、base64、mktemp、stat、wc。同时需要已认证的ghCLIgh auth状态有效。分析基础镜像发布耗时同 commit 发布 vs 复用先前发布运行命令与参数node --no-warnings \ .agents/skills/nemoclaw-maintainer-analyze-ci-performance/scripts/analyze-base-image-publication-timings.mts \ --workdir $PWD该分析器比较两类 main 推送 E2E 运行发布同 commit 基础镜像E2E 运行的 headSha 同时存在于base-image.yaml的发布记录中与复用先前发布的镜像该 commit 未触发新的基础镜像发布。默认契约仓库NVIDIA/NemoClaw、最多 300 次 E2E 运行、最多 500 次基础镜像运行、每层最多 150 个系统性样本。可选标志标志默认值源码校验范围--repoNVIDIA/NemoClaw必须匹配owner/name格式--e2e-limit30030500 的整数--base-limit500e2eLimit500 的整数--max-per-stratum15030200 的整数分层与系统性抽样源码逻辑analyzeBaseImagePublicationTimings如下拉取e2e.yaml工作流main分支push事件中status completed的运行最多e2eLimit次记录id、sha、createdAt拉取base-image.yaml工作流运行最多baseLimit次取其headSha集合作为该 commit 发布过基础镜像的证据将 E2E 运行划分为两个分层stratumsame-commit-publicationbase集合包含该 sha与reuse-prior-publication不包含每层若超过maxPerStratum条则按均匀间隔系统性抽样select函数按序号等距取点保证时序上覆盖整个观察窗口每批 12 个运行并发拉取 job 明细/repos/{repo}/actions/runs/{id}/jobs每页 100 条、最多 10 页即 1,000 个 job 上限且校验分页过程中total_count不变只保留base-image-publication与generate-matrix两个 job。结合 e2e.yaml 可以理解这两个 job 的角色base-image-publication第 178 行起通过 tools/e2e/base-image-publication.mts 执行镜像发布并产出managed_image_revision等输出generate-matrix第 357 行起needs: base-image-publication据此决定后续矩阵作业的 workload 来源。因此发布→生成矩阵→矩阵作业启动的衔接耗时正是镜像复用收益的关键观测点。五类测量指标对每个成功的base-image-publicationjobconclusion success基于时间戳差秒计算五类指标且每类都输出完整统计量n、minSeconds、medianSeconds、median95CiSeconds、meanSeconds、mean95CiSeconds、p90Seconds、p95Seconds、maxSeconds指标计算方式elapsed(start, end)jobExecutionpublication jobstartedAt→completedAtjob 实际执行时长verifier名为Verify applicable base-image publication的 step 时长workflowCreationToCompletion运行createdAt→ publication jobcompletedAt工作流端到端时长runnerQueue运行createdAt→ publication jobstartedAt等待 runner 的排队时长boundaryToMatrixStartpublication jobcompletedAt→generate-matrixjobstartedAtjob 间衔接延迟其中runnerQueue与boundaryToMatrixStart正是技能描述中提到的runner queues观测项前者反映 runner 供给是否紧张后者反映依赖编排的开销。统计口径与置信区间中位数与分位数采用线性插值分位数quantileP90/P95 用于观察长尾中位数 95% 置信区间median95CiSeconds由 statistics.mts 中的medianConfidenceInterval计算——对样本做3,000 次有放回 Bootstrap取 2.5% 与 97.5% 分位数作为区间端点均值 95% 置信区间以正态近似mean ± 1.96 × std / sqrt(n)计算样本充足性门槛atLeast30SuccessfulJobs表示该层成功 job 数是否 ≥ 30当其为false时应视统计推断证据不足不宜据此下稳定结论技能文档明确要求 TreatatLeast30SuccessfulJobs: falseas insufficient evidence for stable inference。输出解读要点输出 JSON 顶层包含measuredAt测量时间戳与population总体窗口completedE2eRuns、range最早/最晚运行时间、classified两层各自的数量、method抽样方法描述明确指出成功 job 的时长是不删失观测。正文由sameCommitPublication、reusePriorPublication、combined三组对称结构组成每组含selectedRuns、successfulJobs、atLeast30SuccessfulJobs、outcomes各 conclusion 计数与上述五类指标。报告解读前务必先看population窗口与各层样本量技能文档的要求再对比两层的jobExecution、verifier、workflowCreationToCompletion中位数若两层atLeast30SuccessfulJobs均为真中位数与置信区间才具备可比性。注意所有统计均只基于成功的 publication job失败或缺失的 job 会计入outcomes如failure、missing但不参与时长统计。安全边界与可靠性设计只读与认证硬停止两个分析器对 GitHub 只做gh run list、gh api .../artifacts、gh api .../jobs等读取操作不产生任何写入。analyze-recent-cli-timings.mts还在run包装器中维护一份访问失败关键词表authentication、authorization、forbidden、not authorized、http 401、http 403、resource not accessible、sso任一命中即抛出GitHub access failed; correct authentication or authorization before retrying。技能文档进一步要求遇到认证/授权失败立即停止并遵循仓库的 GitHub 访问硬停止策略对应 .agents/skills/_shared/git-github-hard-stop.md。有界输入与输出有界是贯穿始终的设计原则下载流按字节限额截断并核对、ZIP 条目/展开体积/清单长度全部设限、JSON 解析前校验套件与断言数量、最终downloadFailures仅输出前 10 条、诊断信息裁剪至 1,0001,500 字符。其目的有二防止恶意或损坏产物拖垮分析进程以及保证 stdout 的 JSON 输出体量可控。凭据脱敏runtime.mts的redactDiagnostic在错误信息落地前统一脱敏authorization:头、token/key/secret/password赋值、Bearer/Basic凭证、gho_/ghp_/ghu_/ghs_/ghr_/github_pat_形式的 GitHub Token、/home/...与/Users/...绝对路径均替换为[REDACTED]。测试用例redacts and bounds gh failure diagnostics专门验证了ghp_SUPERSECRET不会泄漏且错误文本被裁剪到 5,000 字符以内。临时目录治理下载与解压均发生在umask 077的mktemp -d私有目录中分析结束后在finally分支递归清理若清理失败且分析本身也失败则保留原始分析错误reportCleanupFailure语义若分析成功但清理失败则抛出清理错误——避免误报与误吞。测试验证仓库内的自动化佐证该技能的可靠性并非仅靠文档背书test/automation/performance/analyze-ci-performance.test.ts 用 mockgh覆盖了核心路径聚合正确性构造两份含vitest-results.json的 ZIP 产物断言reportsFound: 2, reportsAnalyzed: 2, minSamples: 2且slowTests[0]的medianMs: 200, p90Ms: 280、slowFiles[0]的medianWallMs: 300与构造数据精确吻合分层分类同 commit 与复用先前的运行各归其层combined.jobExecution.n正确合计分页验证超过 100 个 job 后能继续读取第 2 页且boundaryToMatrixStart计算正确参数校验--repo invalid在调用gh前即被拒绝用 marker 文件证明gh未被调用脱敏与限额伪造 12,000 字符的 Bearer 泄密 stderr断言输出含[REDACTED]且长度受控统计原语quantile([40, 10, 30, 20], 0.9) 37验证插值分位数的确定性readBoundedJsonFile验证超限拒绝。这些测试与技能脚本共用skillRoot .agents/skills/nemoclaw-maintainer-analyze-ci-performance路径意味着测试改动会直接约束技能行为二者保持同步演进。适用前提与边界注意事项时间窗口CLI 时序分析依赖保留 14 天的cli-vitest-results产物若仓库清理策略调整reportsFound会下降不足 2 份时命令直接失败这是预期行为而非故障平台两个分析器都要求 Linux 及所列 GNU/Info-ZIP 工具链macOS 自带工具如 BSDdd/stat不被支持不要混用工作流技能文档明确约束——不要将本工作流与 PR 价值流分析value-stream组合完整的 PR 生命周期追踪应加载nemoclaw-maintainer-analyze-pr-value-stream技能见 .agents/skills/nemoclaw-maintainer-analyze-pr-value-stream/SKILL.md两者数据口径不同混用会产生误导性结论统计纪律atLeast30SuccessfulJobs: false的分层不具备稳定推断能力宁可报告证据不足也不要强行解读网络与认证命令依赖已认证的gh且所有读取都会受到 GitHub API 速率限制影响遇到 401/403/SSO 等访问失败应停止并先修复认证而非重试堆叠。掌握了这两个分析器维护者即可把凭感觉猜慢测试升级为基于 14 天留存样本的中位数/分位数排名把镜像复用到底省不省时间升级为分层 置信区间的对照实验为 NemoClaw 的 CI 优化提供可复现、可审计的证据链。【免费下载链接】NemoClawRun agents like Hermes, LangChain Deep Agents, and OpenClaw more securely inside NVIDIA OpenShell with managed inference项目地址: https://gitcode.com/gh_mirrors/ne/NemoClaw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价