“perfcompare” try 构建器是一个可选的 CQ try 构建器,用于衡量更改对性能的影响,而无需执行更改(即用于提交前性能测试)。它会在应用 CL 和不应用 CL 的情况下运行性能测试,并比较测试结果,以确认是否存在任何性能下降或改进。
Google 员工可以参阅 Google 内部 perfcompare 文档,以获取其他文档。
使用方式
对于 fuchsia.git CL
如需在 Gerrit CL 上运行 perfcompare,请执行以下操作:
- 启动构建:在 Gerrit 网页界面中选择“Choose tryjobs”,从构建器列表中选择一个或多个 perfcompare 构建器。一种快速做到这一点的方法是在搜索字段中输入“perfcompare”,这将过滤列表以显示可用的 Perfcompare 构建器。
- 获取结果:指向 try 构建器结果页面的链接将显示在 Gerrit 中的 CL 上。构建器运行完成后,结果将显示在 build 页面上的“比较不使用 CL 和使用 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):这会在 VIM3 (ARM64) 上运行fuchsia.git
的性能测试。这是terminal.vim3-release
构建器的 perfcompare 版本。请注意,默认情况下,terminal.vim3-release
不会由 CQ 运行,因此与其他构建器相比,它更容易损坏或具有更高的不稳定速率。
对于 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
...
测试 CL 堆栈与单个 CL
Perfcompare 构建器衡量的是各个 CL(而不是 CL 堆栈)的性能影响。
例如,假设您有一系列 CL:P1、P2、P3、P4、P5,其中 P1 是最早的 CL(即,所有其他 CL 都依赖于该 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:
- 从
integration.git
的当前树尖版本中检出 Fuchsia。 - 将 CL 系列应用于结账,直到被测 CL(含)为止。此方法使用
jiri patch
,后者使用git rebase
。 - 构建 Fuchsia。这会提供“使用 CL”build。
- 在结账时取消应用最顶层的 CL(应用 CL 系列中较早的 CL(如果有)。这是通过在应用 CL 系列的 Git 代码库中运行
git checkout HEAD^
来实现的。 - 通过增量构建再次构建 Fuchsia。这会提供“不使用 CL”build。
第 1-3 步与使用非 Perfcompare Fuchsia 尝试构建器相同。
限制
- 如上所述,目前尚不支持使用
patches.json
或更改 Jiri 清单文件中依赖项的 CL。
如何在本地进行效果比较
Perfcompare 构建器使用 perfcompare.py
来比较性能结果。您可以使用 perfcompare.py
在本地运行性能测试(即不使用 Fuchsia Infra),并比较测试结果。请参阅此文档。
如何下载原始性能结果
您可以下载通过 perfcompare 试用构建器运行生成的原始性能测试结果。如果要修改 perfcompare.py
执行的分析,这会非常有用。为此,请按以下步骤操作:
从 perfcompare build 的输出属性查找
cas_instance
和perfcompare_dataset_digest
字段的值。您可以在该 build 的 build 页面上找到这些 build(可从 Gerrit 代码审核中的“Checks”标签页访问)。典型值的示例如下:cas_instance="projects/chromium-swarm/instances/default_instance"
perfcompare_dataset_digest="3ff389154e02490f29e379564f7e70b3df66f74c3116ed50172cceec1e9d9888/165"
如需从非 Perfcompare build 下载结果数据,要使用的字段名称为
perf_dataset_digest
,而不是perfcompare_dataset_digest
。运行以下命令(使用 Fuchsia 检出中预构建的
cas
工具)下载数据集:./prebuilt/tools/cas/cas download -cas-instance $CAS_INSTANCE -digest $DIGEST -dir $DEST_DIR
对下载的数据集运行
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 天。)