Perfcompare:效果比较试用构建器

“perfcompare”try 构建器是一个可选的 CQ try 构建器,用于在不发布更改的情况下衡量更改对性能的影响(即用于提交前性能测试)。它会在应用 CL 和不应用 CL 的情况下运行性能测试,并比较测试结果,以了解是否存在任何性能回归或改进。

Google 员工可以参阅 Google 内部的 perfcompare 文档,了解一些其他文档。

使用方式

对于 fuchsia.git CL

如需在 Gerrit CL 上运行 perfcompare,请执行以下操作:

  • 开始构建:在 Gerrit Web 界面中,选择“选择 tryjob”,然后从构建器列表中选择一个或多个 perfcompare 构建器。快速的方法是,在搜索字段中输入“perfcompare”,系统会过滤列表以显示可用的 perfcompare 构建器。
  • 获取结果:Gerrit 中的 CL 上会显示指向试用构建器结果页面的链接。构建器运行完成后,结果将显示在“构建”页面上的“compare perf test results without and with CL”->“stdout”(或“raw”)下。

目前,以下 perfcompare 构建器可用于运行 fuchsia.git 的性能测试,并且受支持:

  • terminal.x64-release-perfcompare近期 build):此测试会在 Intel NUC (x64) 上运行 fuchsia.git 的性能测试。这是 terminal.x64-release 构建器的 perfcompare 版本(即,它会运行与该构建器相同的一组性能测试)。

  • terminal.vim3-release-perfcompare近期 build):此测试会在 VIM3s (ARM64) 上运行 fuchsia.git 的性能测试。这是 terminal.vim3-release 构建器的 perfcompare 版本。请注意,默认情况下,CQ 不会运行 terminal.vim3-release,因此与其他构建器相比,它更有可能损坏或出现更高的失败率。

对于 integration.git CL

integration.git CL 尚不支持 Perfcompare。

具体而言,perfcompare 尚不支持更改 Jiri 清单文件或 jiri.lock 文件中的依赖项或使用 patches.json 的 CL。这包括更改预构建软件包的 CL,例如工具链滚动 CL。

在这些情况下,Perfcompare 不知道如何在 CL 之前和之后检出源代码和预构建二进制文件,因此在这些情况下会给出错误的结果。即使 CL 确实会改变效果,系统也会得出效果没有变化的结论。

输出示例

以下是针对简单的测试 CL 运行 perfcompare 的输出部分:

Summary counts:
  2939 test cases in total
  2938 test cases had no significant difference (no_sig_diff)
  1 test case got faster
  0 test cases got slower
  0 test cases added
  0 test cases removed

Results from test cases with differences:

Test case                                 Improve/regress?  Factor change  Mean before         Mean after
----------------------------------------  ----------------  -------------  ------------------  -----------------
fuchsia.microbenchmarks: ExampleNoOpLoop  faster            0.143-0.145    405.36 +/- 0.39 ns  58.49 +/- 0.30 ns

Results from all test cases:

Test case                                      Improve/regress?  Factor change  Mean before        Mean after
---------------------------------------------  ----------------  -------------  -----------------  -----------------
...
fuchsia.microbenchmarks: Syscall/ManyArgs      no_sig_diff       0.986-1.008    92.94 +/- 0.66 ns  92.65 +/- 0.40 ns
fuchsia.microbenchmarks: Syscall/Null          no_sig_diff       0.993-1.007    84.33 +/- 0.40 ns  84.31 +/- 0.19 ns
fuchsia.microbenchmarks: Thread/CreateAndJoin  no_sig_diff       0.950-1.034    34229 +/- 711 ns   33935 +/- 739 ns
fuchsia.microbenchmarks: TicksGet              no_sig_diff       0.981-1.022    19.77 +/- 0.19 ns  19.81 +/- 0.21 ns
...

解读结果

  • no_sig_diff 表示指标中未发现具有统计显著性的差异。这并不意味着没有差异,只是任何差异都太小(相对于指标的变化量而言),无法检测到。

  • 如果“平均值(之前)”和“平均值(之后)”中的置信区间过宽,以致下限变为负数,则“因子变化”列中会显示 ci_too_wide。如果指标存在大量变化,就会出现这种情况。

测试 CL 堆栈与单个 CL

perfcompare 构建器用于衡量单个 CL 的性能影响,而不是 CL 堆栈的性能影响。

例如,假设您有一系列 CL:P1、P2、P3、P4、P5,其中 P1 是最早的(即所有其他 CL 都依赖于它)。如果您在 P3 上运行 perfcompare,则“使用 CL”build 将包含 P1+P2+P3,而“不使用 CL”build 将仅包含 P1+P2。

  • 这样一来,您就可以衡量对尚未提交的测试用例的影响。您可以有一个 CL 用于添加新的性能测试,另一个 CL 用于更改被测软件。对第二个 CL 运行 perfcompare 将显示该 CL 对新测试的影响。
  • 如果您确实想要衡量补丁堆栈的总体影响,一种方法是将更改合并到单个 Git 提交中(例如使用 git merge --squash),将其上传到 Gerrit,然后对其运行 perfcompare。

“使用 CL”和“不使用 CL”build

perfcompare 构建器会依次应用以下步骤来生成“使用 CL”和“不使用 CL”build:

  1. integration.git 的当前树顶修订版中检出 Fuchsia。
  2. 将 CL 系列应用于该签出,包括要测试的 CL。此方法使用 jiri patch,而 jiri patch 使用 git rebase
  3. 构建 Fuchsia。这会生成“with CL” build。
  4. 从签出中取消应用最顶部的 CL(保留 CL 系列中已应用的较早 CL,如果有)。具体方法是在应用 CL 系列的 Git 代码库中运行 git checkout HEAD^
  5. 再次构建 Fuchsia,进行增量构建。这会生成“不含 CL”build。

第 1-3 步与非 perfcompare Fuchsia 试用构建器相同。

限制

  • 如上所述,我们尚不支持使用 patches.json 或更改 Jiri 清单文件中依赖项的 CL。

如何在本地运行性能比较

perfcompare 构建器使用 perfcompare.py 来比较性能结果。您可以使用 perfcompare.py 在本地(即不使用 Fuchsia Infra)运行性能测试,并比较测试结果。请参阅文档

如何下载原始效果结果

您可以下载 perfcompare 试用 build 模块运行生成的原始性能测试结果。如果您想修改 perfcompare.py 执行的分析,这将非常有用。为此,请按以下步骤操作:

  1. 从 perfcompare build 的输出属性中查找 cas_instanceperfcompare_dataset_digest 字段的值。您可以在 build 的 build 页面上找到这些信息(可通过 Gerrit 代码审核中的“检查”标签页访问该页面)。典型值示例如下:

    • cas_instance="projects/chromium-swarm/instances/default_instance"
    • perfcompare_dataset_digest="3ff389154e02490f29e379564f7e70b3df66f74c3116ed50172cceec1e9d9888/165"

    如需从非性能比较 build 下载结果数据,应使用 perf_dataset_digest 而非 perfcompare_dataset_digest 字段名称。

  2. 运行以下命令(使用 Fuchsia 检出的预构建 cas 工具)下载数据集:

    ./prebuilt/tools/cas/cas download -cas-instance $CAS_INSTANCE -digest $DIGEST -dir $DEST_DIR
    
  3. 对下载的数据集运行 perfcompare.py

    python3 src/testing/perfcompare/perfcompare.py compare_perf $DEST_DIR/without_cl/ $DEST_DIR/with_cl/
    

请注意,RBE-CAS 系统只会将数据保留约 2-3 个月,因此如果最近未运行 build,下载命令将会失败。(RBE-CAS 中存活时间 [TTL] 的当前默认值为 90 天。)