使用Coz:因果分析以优化代码性能的利器

使用Coz:因果分析以优化代码性能的利器

Coz 是一个针对C/C++/Rust原生代码的新型性能剖析器,它通过因果分析(Causal Profiling) 技术揭示传统剖析器忽视的优化机会。Coz预测优化特定代码段将如何影响整体的吞吐量或延迟,从而提供了一个全新的性能提升视角。

当开发者优化代码时,他们期望优化高优先级的部分能带来最大的性能改善。Coz的剖析结果显示了每一行代码优化对性能的“性价比”,如下图所示,几乎每一次针对某代码行的优化都能直接带来性能的提升,使其成为优化的理想候选。

Coz的测量方法与开发者对剖析器的期待一致:优化高度排名的代码会产生最大的性能影响。因果分析不需要对特殊库调用和并发原语进行特别处理或 instrumentation,而是通过性能实验来预测优化效果,从而建立因果关系:“优化函数X将产生效果Y”。这正是开发者一直以来希望从剖析器中获取的信息。

详细的技术描述可参阅我们的论文Coz: Finding Code that Counts with Causal Profiling (pdf),该论文在2015年SOSP会议上发表,并获得了最佳论文奖。

观看SOSP上的Coz演讲

安装

在Debian、Ubuntu和Fedora上,你可以通过apt安装Coz:

sudo apt install coz-profiler

OpenSUSE用户可以使用@zethra准备的包,可以在https://build.opensuse.org/package/show/home:zethra/coz-profiler找到。

Coz应在任何现代Linux系统(支持perf_event_open系统调用的2.6.32版本或更高版本)和Python 3.x解释器上运行。

兼容性与其他语言

默认情况下,Coz适用于C,C++和Rust程序。已为其他语言进行了移植或提供了包装器:

| 语言 | 链接 | | ---------- | ----------------------
| Java | JCoz: https://github.com/Decave/JCoz | | Go | Cozgo: https://github.com/urjitbhatia/cozgo | | Swift | Swift Coz: https://github.com/funcmike/swift-coz |

源码构建

源码构建需要以下工具:

  • 本项目的源代码
  • 支持C++0x的编译器(如clang++或g++)
  • Python 3.x解释器
  • (可选)为了构建剖析器查看器,你需要NodeJS和npm —— sudo apt-get install nodejs npm

在Debian类发行版上,可以通过以下命令完成整个过程:

sudo apt-get install build-essential cmake docutils-common git python3 pkg-config
git clone https://github.com/antoyo/libelfin && cd libelfin && make && sudo make install && cd ..
git clone https://github.com/plasma-umass/coz && cd coz && cmake . && make && sudo make install && cd ..

接着,改变perf_event_paranoid级别,使Coz可以运行:

sudo sh -c 'echo 1 >/proc/sys/kernel/perf_event_paranoid'

然后测试Coz。构建基准测试套件并运行一个基准测试(SQLite3基准可能需要较长的构建时间):

sudo apt-get install libbz2-dev libsqlite3-dev
cd coz/benchmarks && cmake . && make && cd ../..
coz run --- ./coz/benchmarks/toy/toy

最后,使用Coz查看器查看结果。这个命令会在浏览器中打开一个新的标签页,你需要加载文件profile.coz

coz plot

(你可能需要移动左侧的“最小点数”滑块以看到结果)

使用Coz

使用Coz需要一些基本设置,但如果你想立即尝试,可以直接跳到本仓库中的示例应用部分。

要使用Coz运行你的程序,你需要用带有调试信息的选项(-g -gdwarf-3)来构建它。不需要在主执行文件中包含调试符号:Coz使用与gdb相同的方法来定位剥离二进制文件的调试信息。

一旦你的程序带有调试信息,就可以使用coz run {coz options} --- {program name and arguments}命令来运行。但是,为了生成有用的时间线,你需要指定一个或多个进度点。

分析模式

Coz通过使你能查看优化对吞吐量和延迟的影响,偏离了传统的分析方式。要进行吞吐量分析,你需要指定一个进度点。要进行延迟分析,需要指定一对进度点。

吞吐量分析:指定进度点

为了分析吞吐量,你必须指出代表工作单元结束的代码行。例如,进度点可能是交易完成、网页渲染完毕或查询完成的地方。Coz然后测量每个进度点的访问速率,以确定潜在优化对吞吐量的影响。

要在代码中插入一个进度点,引入include目录下本仓库中的coz.h,并在至少一行你希望更频繁执行的代码前使用COZ_PROGRESS宏。别忘了在链接时使用-ldl选项。

默认情况下,Coz会使用源文件名和行号作为进度点的名称。如果你使用COZ_PROGRESS_NAMED("progress point name"),则可以为你的进度点提供一个有意义的名字。这也允许你在同一位置标记多个进度点。

延迟分析:指定进度点

对于延迟分析,你需要在感兴趣事件的开始和结束处放置两个进度点,比如交易开始和完成。简单地用COZ_BEGIN("transaction name")宏标记事务的开始,用COZ_END("transaction name")宏标记事务的结束。与常规的进度点不同,延迟进度点始终需要指定一个名字。别忘了在链接时使用-ldl选项。

Coz在测试假设的优化时,会报告该优化对这两个点之间平均延迟的影响。这得益于Littles Law

在命令行指定进度点

Coz有命令行选项用于在剖析应用程序时指定进度点,而不是修改其源代码。但目前此功能未启用,因为工作效果不理想。未来计划支持更好的命令行指定进度点功能。

处理结果

要绘制分析结果,请前往http://plasma-umass.github.io/coz/ 并加载你的分析结果。这个页面还包括来自PARSEC基准的一些样本分析。

示例应用

本仓库的benchmarks目录中包括几个小基准测试,其中添加了适当的进度点。要构建并运行这些基准之一,只需转到benchmarks/{benchmark name}并输入cmake . && make。这些程序可能需要多次运行,Coz才能收集足够的数据生成有用的分析。对这些程序进行几分钟的分析后,去http://plasma-umass.github.io/coz/ 加载并绘制你的分析结果。

CMake集成

当你安装Coz时,它会安装一个cmake配置文件。要在cmake项目中添加Coz,只需要使用命令find_package(coz-profiler)。这将导入一个名为coz::coz的库和头文件目标,以及一个名为coz::profiler的coz二进制目标。有关如何使用这些目标的指南,请参考CMake文档。

限制

Coz目前不支持解释型或JIT编译的语言,如Python、Ruby或JavaScript。解释型语言不太可能在未来得到支持,但对于产生调试信息的JIT编译语言,将来可能会增加支持。

许可证

所有源代码均在BSD 2-clause许可证下发布,除非另有说明。详细信息请参见LICENSE.md。

benchmarks目录中的样本应用(包括几个Phoenix程序和pbzip2),分别拥有独立的许可协议,并包含在此发布版中以供方便使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平奇群Derek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值