fix(ci): reduce Starry grouped QEMU overhead#1249
Conversation
There was a problem hiding this comment.
Review: fix(ci): reduce Starry grouped QEMU overhead
变更概述
本 PR 精简了 qemu-smp1/system 和 qemu-smp4/system 八个 TOML 配置中的 grouped runner 脚本,移除了 guest 内每个子用例的 date 调用、临时 timing 文件和 sort -nr | head -n 20 汇总。同时将 apk-curl-equivalence 的 HTTP fixture 从 20MiB 缩减到 4MiB,并同步更新了 axbuild 回归测试断言。
CI 状态
- sync-lint: ✅ 通过
- Test with std: ✅ 通过
- Test axvisor riscv64 qemu: ✅ 通过
- Test axvisor x86_64 UEFI: ✅ 通过
- 其余 board 测试/container 测试为 skipped(与本次改动无关)
- CI 无需本地重复验证。
本地验证
cargo fmt --check -p axbuild✅git diff --check✅cargo test -p axbuild starry_system_grouped_qemu_configs_use_low_overhead_runner_markers --lib✅cargo test -p axbuild apk_curl_equivalence_is_in_system_grouped_qemu_case --lib✅
代码审查
-
runner 脚本简化:八个 TOML 文件的改动完全一致,移除了
timing_file、$(date ...)、elapsed_s计算和 timing 汇总段。保留了STARRY_SYSTEM_TEST_BEGIN、STARRY_SYSTEM_TEST_PASSED、STARRY_SYSTEM_TEST_FAILED、STARRY_GROUPED_TESTS_PASSED等稳定 marker,host 侧监控不受影响。 -
失败分支完整性:
exit_status=$?仍在else分支的最前位置捕获,然后打印$system_fail_marker: $bin status=$exit_status,最终返回非零状态。失败检测语义与之前一致。 -
旧 timing marker 消费者:在全仓库搜索
STARRY_SYSTEM_TEST_TIMING,仅剩 test.rs 中的负向断言(确保其不再出现)。无外部消费者,移除安全。 -
apk-curl fixture:
payload_size从 20MiB 降到 4MiB,payload_sha256同步更新。host_http_server.body_size在四个 smp1 架构 TOML 中同步更新。smp4 配置不含 apk-curl 测试,无需改动——确认一致。 -
测试断言:
test.rs的回归测试已重命名并更新断言,新增了负向检查(不允许$(date、timing_file、STARRY_SYSTEM_TEST_TIMING重新出现),有效防止后续回归。 -
无相关重复 PR:搜索
starry grouped qemu overhead仅匹配本 PR。
结论
变更隔离、逻辑清晰、CI 已通过、回归测试覆盖充分。未发现阻塞问题,予以批准。
Powered by mimo-v2.5-pro
There was a problem hiding this comment.
Review: fix(ci): reduce Starry grouped QEMU overhead
变更概述
本 PR 在 #1245 之后继续优化 Starry CI QEMU 开销,包含 6 个方面:
- 精简 8 个 TOML grouped runner 脚本,移除 per-subcase
date、timing 文件、sort 汇总 apk-curl-equivalencefixture 从 20MiB 降到 1MiBbug-ext4-dir-ops文件数量从 20/30 减少到 8,成功路径移除逐条 PASS 输出- x86 dyn-plat QEMU 默认不再注入 VMX nested feature,改为按需启用
- x86 TSC 校准增加 ACPI PM Timer 源、多轮采样和 jitter check,CPUID.15 简化,CPUID.base 降为兜底
- 更新 axbuild 回归断言
CI 状态
- Detect changed paths: ✅ 通过
- Check formatting / run_host: ✅ 通过
- Cancel stale CI runs: ✅ 通过
- Run sync-lint / run_container: 进行中(不影响格式化和核心逻辑检查)
- 其余 container/skipped 检查与本次改动无关
本地验证
cargo fmt --check✅git diff --check✅cargo test -p axbuild --lib starry_system_grouped_qemu_configs_use_low_overhead_runner_markers✅cargo test -p axbuild --lib apk_curl_equivalence_is_in_system_grouped_qemu_case✅cargo test -p axbuild --lib dynamic_x86_64_qemu_boot_disables_five_level_paging_without_default_nested_features✅cargo test -p axbuild --lib dynamic_x86_64_qemu_boot_enables_vmx_nested_features_for_vmx_backend✅
代码审查
1. Grouped runner 简化(8 个 TOML 文件)
改动完全一致:移除 timing_file、$(date ...)、elapsed_s 和 timing 汇总段。保留了 STARRY_SYSTEM_TEST_BEGIN、STARRY_SYSTEM_TEST_PASSED、STARRY_SYSTEM_TEST_FAILED、STARRY_GROUPED_TESTS_PASSED 等稳定 marker。失败分支中 exit_status=$? 仍在 else 最前位置捕获,host 侧监控语义不变。
2. ACPI PM Timer TSC 校准(trap.rs)
AcpiPmTimer::detect()正确解析 FADT PM timer GAS,校验bit_offset == 0、地址空间类型和地址范围。- 24-bit vs 32-bit mask 处理正确。
AcpiPmTimer::read()的 SystemIo/SystemMemory 两条路径均合法;SystemIo 地址已在detect()中校验 ≤ u16::MAX。- 多轮校准 + jitter check 设计合理:
select_stable_calibration_sample对min < 100的边界场景无实际影响,因为valid_tsc_freq_hz已保证 min ≥ 10MHz。
3. cpuid_tsc_freq_hz 简化
旧代码的 numerator/denominator 计算实质上退化为 processor_base_freq_hz(cpuid),与已有的 CPUID.base fallback 重复。移除后优先级更清晰:hypervisor → CPUID.15 → ACPI PM Timer → PIT → CPUID.base。
4. VMX feature 按需注入(qemu.rs)
dynamic_x86_64_nested_virtualization_features 不再默认返回 VMX feature,仅在检测到 vmx/axvm/vmx/x86_vcpu/vmx/x86-vcpu/vmx 时注入。新增单测覆盖默认路径(无 nested feature)和显式 VMX 路径。
5. ext4 test 收敛
文件数量从 20/30 减至 8,但保留了 rounds > 1 断言,确保 multi-getdents 仍被触发。成功路径 PASS 输出移除,失败路径和 DONE 摘要不变。
6. test.rs 回归断言
断言从正向检查 timing marker 转为负向检查(禁止 $(date、timing_file、STARRY_SYSTEM_TEST_TIMING),有效防止后续回归。全仓库搜索 STARRY_SYSTEM_TEST_TIMING 仅剩 test.rs 中的负向断言。
7. 无重复 PR
搜索 grouped qemu overhead 和 tsc calibration acpi 均未发现重叠 PR。
结论
变更隔离、逻辑清晰、CI 格式化和定向测试均已通过、回归测试覆盖充分。未发现阻塞问题,予以批准。
Powered by mimo-v2.5-pro
There was a problem hiding this comment.
Review: fix(ci): reduce Starry grouped QEMU overhead
变更概述
本 PR 在 #1245 之后继续优化 Starry CI QEMU 开销,涵盖 6 个方面:
- 精简 8 个 TOML grouped runner 脚本,移除 per-subcase
date、timing 文件、sort 汇总 apk-curl-equivalencefixture 从 20MiB 降到 1MiBbug-ext4-dir-ops文件数量从 20/30 减少到 8,成功路径移除逐条 PASS 输出- x86 dyn-plat QEMU 默认不再注入 VMX nested feature,改为按需启用
- x86 TSC 校准增加 ACPI PM Timer 源、多轮采样和 jitter check,CPUID.15 简化,CPUID.base 降为兜底
- 更新 axbuild 回归断言
CI 状态
- Detect changed paths: ✅ 成功
- Check formatting / run_host: ✅ 成功
- Test arceos aarch64 qemu / run_host: ✅ 成功
- Publish base container image / 多个 board/container 测试: skipped(路径过滤,预期行为,与本次改动无关)
- CI 无需本地重复验证。
本地验证
cargo fmt --check✅git diff --check✅cargo test -p axbuild --lib starry_system_grouped_qemu_configs_use_low_overhead_runner_markers✅cargo test -p axbuild --lib apk_curl_equivalence_is_in_system_grouped_qemu_case✅cargo test -p axbuild --lib dynamic_x86_64_qemu_boot_disables_five_level_paging_without_default_nested_features✅cargo test -p axbuild --lib dynamic_x86_64_qemu_boot_enables_vmx_nested_features_for_vmx_backend✅cargo clippy --manifest-path components/someboot/Cargo.toml --all-features -- -D warnings✅
代码审查
1. Grouped runner 简化(8 个 TOML 文件)
改动完全一致:移除 timing_file、$(date ...)、elapsed_s 和 timing 汇总段。保留了 STARRY_SYSTEM_TEST_BEGIN、STARRY_SYSTEM_TEST_PASSED、STARRY_SYSTEM_TEST_FAILED、STARRY_GROUPED_TESTS_PASSED 等稳定 marker。失败分支中 exit_status=$? 仍在 else 最前位置捕获,host 侧监控语义不变。全仓库搜索 STARRY_SYSTEM_TEST_TIMING 仅剩 test.rs 中的负向断言,无外部消费者,移除安全。
2. ACPI PM Timer TSC 校准(trap.rs)
AcpiPmTimer::detect()正确解析 FADT PM timer GAS,校验bit_offset == 0、地址空间类型和地址范围。- 24-bit vs 32-bit mask 处理正确。
AcpiPmTimer::read()的 SystemIo/SystemMemory 两条路径均合法;SystemIo 地址已在detect()中校验 ≤ u16::MAX。calibrated_tsc_freq_sample_hz使用 u128 计算频率,避免乘法溢出;& counter_mask正确处理 wrap-around。- 多轮校准 + jitter check 设计合理:
select_stable_calibration_sample对min < 100的边界场景无实际影响,因为valid_tsc_freq_hz已保证 min ≥ 10MHz。
3. cpuid_tsc_freq_hz 简化
旧代码的 numerator/denominator 计算实质上退化为 processor_base_freq_hz(cpuid)(base * den / num * num / den = base),与已有的 CPUID.base fallback 重复。移除后优先级更清晰:hypervisor → CPUID.15 → ACPI PM Timer → PIT → CPUID.base。
4. VMX feature 按需注入(qemu.rs)
dynamic_x86_64_nested_virtualization_features 不再默认返回 VMX feature,仅在检测到 vmx/axvm/vmx/x86_vcpu/vmx/x86-vcpu/vmx 时注入。新增单测覆盖默认路径(无 nested feature)和显式 VMX 路径。
5. ext4 test 收敛
文件数量从 20/30 减至 8,但保留了 rounds > 1 断言,确保 multi-getdents 仍被触发。成功路径 PASS 输出移除,失败路径和 DONE 摘要不变。
6. test.rs 回归断言
断言从正向检查 timing marker 转为负向检查(禁止 $(date、timing_file、STARRY_SYSTEM_TEST_TIMING),有效防止后续回归。
7. 重复 PR 分析
PR #1250(fix(starry): reprogram timer for short deadlines)与本 PR 在 VMX feature gating 部分有 partial-overlap(qemu.rs 中 dynamic_x86_64_nested_virtualization_features 改动完全相同)。其他部分互补:#1249 聚焦 CI 开销(runner 脚本、ext4、apk-curl、TSC 校准),#1250 聚焦 timer 重编程。建议先合并 #1249,然后 #1250 rebase 时移除重复的 VMX 改动。
结论
变更隔离、逻辑清晰、CI 已通过、回归测试覆盖充分、无 [patch.crates-io]。未发现阻塞问题,予以批准。
Powered by mimo-v2.5-pro
问题
#1245 已修复 x86 Starry QEMU 的 IRQ/timer 主问题后,CI 中
qemu-smp1/system仍有明显长尾,尤其 x86_64。近期 CI 日志显示,剩余开销主要来自 grouped runner 和少数重型子用例;进一步本地排查还发现 x86 TSC 频率初始化会在硬件校准前信任 CPUID/base 频率,虚拟化环境一旦给出不精确的 base MHz,就会把 Starry 的 timeout 类测试整体拉慢。date、写 timing 文件、排序输出,数百个子用例会放大固定开销;bug-ext4-dir-ops在 x86 CI 中单项可达到数百秒,主要是大量 ext4 元数据操作和逐条 PASS 串口输出叠加;apk-curl-equivalence的目标是验证 curl 下载、落盘、读回和 sha256 等价性,不是吞吐 benchmark,过大的 HTTP fixture 会拉长 QEMU usernet/guest 文件 I/O;somebootTSC 初始化原先会在 PIT/ACPI 等硬件参考校准前使用 CPUID.16/base 频率,和 Linux 更谨慎的 TSC 校准策略不一致。修改
精简
qemu-smp1/system和qemu-smp4/system四个架构的 grouped runner:STARRY_SYSTEM_TEST_BEGIN/STARRY_SYSTEM_TEST_PASSED/STARRY_SYSTEM_TEST_FAILED/STARRY_GROUPED_TESTS_PASSED等稳定 marker;$?并最终返回非零状态;date、临时 timing 文件、sort/head 汇总。收敛
apk-curl-equivalencefixture:host_http_server.body_size;收敛
bug-ext4-dir-ops重型路径:rounds > 1断言,确保仍触发多轮 getdents/read-delete 的回归条件;DONE: pass/fail摘要保持不变。调整 x86 动态平台 QEMU CPU feature:
vmx/svm相关 cargo feature 时才注入对应 CPU feature;-la57处理,并补充 VMX/SVM/默认路径单测。修复 x86 TSC 频率选择顺序:
someboot内自行读取 SystemIO/SystemMemory;更新 axbuild 回归断言:
逻辑
AXBUILD_TIMING仍然提供 case 级别的 host 侧耗时;如果以后需要子用例性能诊断,应优先在 host runner 侧做低开销统计,而不是在 guest 中为每个子用例 forkdate并排序。apk-curl-equivalence的核心语义是“下载同一份 host fixture,写入 guest 文件,再读回并校验 sha256”。1MiB 已足够覆盖 curl、QEMU usernet、guest 文件写读和 sha256 校验,避免把 CI 变成网络/磁盘吞吐测试。bug-ext4-dir-ops保留了目录 rename、多轮 getdents、读目录同时删除等 bug 触发条件,但减少重复样本数量和成功日志输出。这样失败时仍有明确定位信息,成功时不再把 x86 CI 的串口和 ext4 元数据路径打成慢长尾。x86 nested virtualization feature 改为按需启用,避免 Starry 常规 dyn-plat 测试为 Axvisor/虚拟化后端承担不必要的 CPU feature 模拟成本。
x86 TSC 校准参考 Linux 的分层思路:可信的 hypervisor/CPUID.15 信息优先,缺少明确 TSC 频率时用 ACPI PM Timer 或 PIT 这类硬件计数器校准,再把 CPUID.16/base MHz 作为最后兜底。这样能覆盖 QEMU/KVM、TCG 和缺少 CPUID crystal 信息的机器,同时保持
someboot/somehal不依赖 OS。本地验证
cargo fmtcargo fmt --checkgit diff --checkcargo test -p axbuild --lib dynamic_x86_64_qemu_bootcargo test -p axbuild --lib apk_curl_equivalence_is_in_system_grouped_qemu_casecargo xtask clippy --package axbuildcargo xtask clippy --package somebootcargo xtask starry test qemu --arch x86_64 -c qemu-smp1/system/bug-ext4-dir-opscargo xtask starry test qemu --arch x86_64 -c qemu-smp1/system/apk-curl-equivalencecargo xtask starry test qemu --arch x86_64 -c qemu-smp1/system/syscall-test-select-poll-familycargo xtask starry test qemu --arch x86_64 -c qemu-smp1/system/syscall-test-timer-familycargo xtask arceos test qemu --arch x86_64 -g rust -c task-yieldcargo xtask starry test qemu --arch aarch64 -c qemu-smp1/system/bug-ext4-dir-opscargo xtask starry test qemu --arch aarch64 -c qemu-smp1/system/apk-curl-equivalencecargo xtask starry test qemu --arch riscv64 -c qemu-smp1/system/bug-ext4-dir-opscargo xtask starry test qemu --arch riscv64 -c qemu-smp1/system/apk-curl-equivalence补充说明:本地曾运行
cargo test -p axbuild --lib,当前仓库已有的checked_in_build_configs_do_not_declare_default_dynamic_builds断言会因若干 checked-in build config 显式声明plat_dyn = true失败;该失败不属于本 PR 修改范围,因此本次用相关定向 axbuild 单测覆盖变更逻辑。