Skip to content

fix(ci): reduce Starry grouped QEMU overhead#1249

Closed
ZR233 wants to merge 3 commits into
rcore-os:devfrom
ZR233:fix/starry-grouped-qemu-overhead
Closed

fix(ci): reduce Starry grouped QEMU overhead#1249
ZR233 wants to merge 3 commits into
rcore-os:devfrom
ZR233:fix/starry-grouped-qemu-overhead

Conversation

@ZR233

@ZR233 ZR233 commented Jun 12, 2026

Copy link
Copy Markdown
Member

问题

#1245 已修复 x86 Starry QEMU 的 IRQ/timer 主问题后,CI 中 qemu-smp1/system 仍有明显长尾,尤其 x86_64。近期 CI 日志显示,剩余开销主要来自 grouped runner 和少数重型子用例;进一步本地排查还发现 x86 TSC 频率初始化会在硬件校准前信任 CPUID/base 频率,虚拟化环境一旦给出不精确的 base MHz,就会把 Starry 的 timeout 类测试整体拉慢。

  • grouped runner 在 guest 内为每个子用例执行 date、写 timing 文件、排序输出,数百个子用例会放大固定开销;
  • bug-ext4-dir-ops 在 x86 CI 中单项可达到数百秒,主要是大量 ext4 元数据操作和逐条 PASS 串口输出叠加;
  • apk-curl-equivalence 的目标是验证 curl 下载、落盘、读回和 sha256 等价性,不是吞吐 benchmark,过大的 HTTP fixture 会拉长 QEMU usernet/guest 文件 I/O;
  • x86 动态平台默认给所有 dyn-plat QEMU 启用 VMX 嵌套虚拟化 CPU feature,但 Starry 常规测试并不需要这些 feature,CI/TCG 路径会产生额外兼容和模拟成本;
  • x86 someboot TSC 初始化原先会在 PIT/ACPI 等硬件参考校准前使用 CPUID.16/base 频率,和 Linux 更谨慎的 TSC 校准策略不一致。

修改

  1. 精简 qemu-smp1/systemqemu-smp4/system 四个架构的 grouped runner:

    • 保留 STARRY_SYSTEM_TEST_BEGIN / STARRY_SYSTEM_TEST_PASSED / STARRY_SYSTEM_TEST_FAILED / STARRY_GROUPED_TESTS_PASSED 等稳定 marker;
    • 保留失败时立即捕获 $? 并最终返回非零状态;
    • 移除 guest 内 per-subcase date、临时 timing 文件、sort/head 汇总。
  2. 收敛 apk-curl-equivalence fixture:

    • host HTTP payload 从 4MiB 调整到 1MiB;
    • 同步更新脚本中的 payload size 和 sha256;
    • 同步更新 x86_64、aarch64、riscv64、loongarch64 的 host_http_server.body_size
    • 保留 curl 下载、文件大小、sha256、落盘读回校验语义。
  3. 收敛 bug-ext4-dir-ops 重型路径:

    • 将多文件 rename/read-delete/rm-rf 场景中的文件数量改为常量 8;
    • 保留 rounds > 1 断言,确保仍触发多轮 getdents/read-delete 的回归条件;
    • 仅在该私有 test framework 中移除成功路径逐条 PASS 输出,失败路径和最终 DONE: pass/fail 摘要保持不变。
  4. 调整 x86 动态平台 QEMU CPU feature:

    • 默认 dyn-plat 不再自动注入 VMX nested feature;
    • 只有显式启用 vmx/svm 相关 cargo feature 时才注入对应 CPU feature;
    • 保留 -la57 处理,并补充 VMX/SVM/默认路径单测。
  5. 修复 x86 TSC 频率选择顺序:

    • 优先使用 hypervisor 明确报告的 TSC 频率和 CPUID.15 crystal ratio 推导出的真实 TSC;
    • 增加 ACPI PM Timer 参考校准,直接解析 FADT PM timer GAS 并在 someboot 内自行读取 SystemIO/SystemMemory;
    • PIT 校准保留为硬件后备,并增加多轮采样和 jitter sanity check;
    • CPUID.16/base 频率降级为最后兜底,避免虚拟化环境把 processor base MHz 误当作真实 TSC。
  6. 更新 axbuild 回归断言:

    • grouped system 配置必须使用低开销 marker runner;
    • 不再允许 guest 内 timing 命令重新出现;
    • apk-curl 用例必须匹配新的 1MiB fixture。

逻辑

AXBUILD_TIMING 仍然提供 case 级别的 host 侧耗时;如果以后需要子用例性能诊断,应优先在 host runner 侧做低开销统计,而不是在 guest 中为每个子用例 fork date 并排序。

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 fmt
  • cargo fmt --check
  • git diff --check
  • cargo test -p axbuild --lib dynamic_x86_64_qemu_boot
    • 通过,8 passed
  • cargo test -p axbuild --lib apk_curl_equivalence_is_in_system_grouped_qemu_case
    • 通过,1 passed
  • cargo xtask clippy --package axbuild
    • 通过
  • cargo xtask clippy --package someboot
    • 通过,7 checks passed
  • cargo xtask starry test qemu --arch x86_64 -c qemu-smp1/system/bug-ext4-dir-ops
    • 通过,qemu-run 约 17.09s
  • cargo xtask starry test qemu --arch x86_64 -c qemu-smp1/system/apk-curl-equivalence
    • 通过,qemu-run 约 23.89s
  • cargo xtask starry test qemu --arch x86_64 -c qemu-smp1/system/syscall-test-select-poll-family
    • 通过,qemu-run 约 17.89s
  • cargo xtask starry test qemu --arch x86_64 -c qemu-smp1/system/syscall-test-timer-family
    • 通过,qemu-run 约 42.44s
  • cargo xtask arceos test qemu --arch x86_64 -g rust -c task-yield
    • 通过,x86 SMP smoke 正常启动并完成
  • cargo xtask starry test qemu --arch aarch64 -c qemu-smp1/system/bug-ext4-dir-ops
    • 通过,qemu-run 约 4.41s
  • cargo xtask starry test qemu --arch aarch64 -c qemu-smp1/system/apk-curl-equivalence
    • 通过,qemu-run 约 4.88s
  • cargo xtask starry test qemu --arch riscv64 -c qemu-smp1/system/bug-ext4-dir-ops
    • 通过,qemu-run 约 4.70s
  • cargo xtask starry test qemu --arch riscv64 -c qemu-smp1/system/apk-curl-equivalence
    • 通过,qemu-run 约 6.42s

补充说明:本地曾运行 cargo test -p axbuild --lib,当前仓库已有的 checked_in_build_configs_do_not_declare_default_dynamic_builds 断言会因若干 checked-in build config 显式声明 plat_dyn = true 失败;该失败不属于本 PR 修改范围,因此本次用相关定向 axbuild 单测覆盖变更逻辑。

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: fix(ci): reduce Starry grouped QEMU overhead

变更概述

本 PR 精简了 qemu-smp1/systemqemu-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

代码审查

  1. runner 脚本简化:八个 TOML 文件的改动完全一致,移除了 timing_file$(date ...)elapsed_s 计算和 timing 汇总段。保留了 STARRY_SYSTEM_TEST_BEGINSTARRY_SYSTEM_TEST_PASSEDSTARRY_SYSTEM_TEST_FAILEDSTARRY_GROUPED_TESTS_PASSED 等稳定 marker,host 侧监控不受影响。

  2. 失败分支完整性exit_status=$? 仍在 else 分支的最前位置捕获,然后打印 $system_fail_marker: $bin status=$exit_status,最终返回非零状态。失败检测语义与之前一致。

  3. 旧 timing marker 消费者:在全仓库搜索 STARRY_SYSTEM_TEST_TIMING,仅剩 test.rs 中的负向断言(确保其不再出现)。无外部消费者,移除安全。

  4. apk-curl fixturepayload_size 从 20MiB 降到 4MiB,payload_sha256 同步更新。host_http_server.body_size 在四个 smp1 架构 TOML 中同步更新。smp4 配置不含 apk-curl 测试,无需改动——确认一致。

  5. 测试断言test.rs 的回归测试已重命名并更新断言,新增了负向检查(不允许 $(datetiming_fileSTARRY_SYSTEM_TEST_TIMING 重新出现),有效防止后续回归。

  6. 无相关重复 PR:搜索 starry grouped qemu overhead 仅匹配本 PR。

结论

变更隔离、逻辑清晰、CI 已通过、回归测试覆盖充分。未发现阻塞问题,予以批准。

Powered by mimo-v2.5-pro

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: fix(ci): reduce Starry grouped QEMU overhead

变更概述

本 PR 在 #1245 之后继续优化 Starry CI QEMU 开销,包含 6 个方面:

  1. 精简 8 个 TOML grouped runner 脚本,移除 per-subcase date、timing 文件、sort 汇总
  2. apk-curl-equivalence fixture 从 20MiB 降到 1MiB
  3. bug-ext4-dir-ops 文件数量从 20/30 减少到 8,成功路径移除逐条 PASS 输出
  4. x86 dyn-plat QEMU 默认不再注入 VMX nested feature,改为按需启用
  5. x86 TSC 校准增加 ACPI PM Timer 源、多轮采样和 jitter check,CPUID.15 简化,CPUID.base 降为兜底
  6. 更新 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_BEGINSTARRY_SYSTEM_TEST_PASSEDSTARRY_SYSTEM_TEST_FAILEDSTARRY_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_samplemin < 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 转为负向检查(禁止 $(datetiming_fileSTARRY_SYSTEM_TEST_TIMING),有效防止后续回归。全仓库搜索 STARRY_SYSTEM_TEST_TIMING 仅剩 test.rs 中的负向断言。

7. 无重复 PR
搜索 grouped qemu overheadtsc calibration acpi 均未发现重叠 PR。

结论

变更隔离、逻辑清晰、CI 格式化和定向测试均已通过、回归测试覆盖充分。未发现阻塞问题,予以批准。

Powered by mimo-v2.5-pro

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: fix(ci): reduce Starry grouped QEMU overhead

变更概述

本 PR 在 #1245 之后继续优化 Starry CI QEMU 开销,涵盖 6 个方面:

  1. 精简 8 个 TOML grouped runner 脚本,移除 per-subcase date、timing 文件、sort 汇总
  2. apk-curl-equivalence fixture 从 20MiB 降到 1MiB
  3. bug-ext4-dir-ops 文件数量从 20/30 减少到 8,成功路径移除逐条 PASS 输出
  4. x86 dyn-plat QEMU 默认不再注入 VMX nested feature,改为按需启用
  5. x86 TSC 校准增加 ACPI PM Timer 源、多轮采样和 jitter check,CPUID.15 简化,CPUID.base 降为兜底
  6. 更新 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_BEGINSTARRY_SYSTEM_TEST_PASSEDSTARRY_SYSTEM_TEST_FAILEDSTARRY_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_samplemin < 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 转为负向检查(禁止 $(datetiming_fileSTARRY_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

@ZR233 ZR233 closed this Jun 12, 2026
@ZR233
ZR233 deleted the fix/starry-grouped-qemu-overhead branch June 29, 2026 04:20
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.

1 participant