LWN: 在Linux kernel里应用profile-guided optimization!

关注了就能看到更多这么棒的文章哦~

Profile-guided optimization for the kernel

By Jonathan Corbet
September 3, 2020
LPC
原文来自:https://lwn.net/Articles/830300/
DeepL assisted translation

Covid-19 大流行带来的诸多影响之一,就是 2020 年 GNU Tools Cauldron 被取消了。Linux Plumbers 会议相应地就增加了一个 GNU Tools Cauldron 主题,许多原本会在 Cauldron 上进行的讨论就在 Linux Plumbers 中展开讨论了。其中,Ian Bearman 介绍了他的团队在 Linux 内核中使用 profile-guided optimization 的工作。Bearman 称这种技巧为 "pogo",尽管它并不能直接在内核中用起来,但看起来还是有不少优势,值得大家投入精力的。

Bearman 是微软 GNU/Linux 开发工具团队的负责人,该团队负责为公司其他部门支持这些 GNU/Linux 工具集。该团队的职责包括确保这些工具(以及由它们生成的程序)的正确性、性能和安全性。很久很久以前的时候,如果人们看到微软拥有一个 GNU 工具团队,会感到非常惊讶。而现在情况已经不同了,微软云中约有一半的实例(instance)都在运行 Linux,这使得 Linux 对公司来说是个非常重要的产品了;因此,不出意料地,公司的 cloud group 成为了他团队的最大客户。

他说,最近有一位内部客户正在开发一项基于 Linux 的新服务,向他的团队寻求帮助以改善性能。经过一番头脑风暴讨论后,团队认为这将是一个使用 profile-guided optimization 的好机会。客户可以控制服务所在的整台机器,并愿意构建一个定制过的 Linux kernel,这样一来他们就可以对系统全面控制来想办法提升性能。但是有一个小问题,客户无法提供任何代码来作为典型负载场景来进行 profile 采集。

Optimization techniques

接下来,Bearman 转而开始简要介绍了一下两个高级优化技术。其中,Profile-guided optimization 中,编译器可以根据对程序在 runtime(运行时)性能的测量结果来优化程序。随便哪个程序中,并不是所有代码都会以同等概率来执行。其实其中有些部分可能根本就不会被运行到。利用 profile 过程中得到的数据,编译器就可以把那些很少使用的代码鉴别出来,并根据节省存储空间的目的来对其施加编译选项。而那些常用的代码和数据则可以进行充分地编译,也允许其在编译生成的文件占用更多字节。常用的代码和数据也可以专门排布在地址空间中相邻位置。这样做就能让整体性能更好、近距离的访问更多、更好地利用 TLB (translation lookaside buffer)、以及减少由于分页(paging)行为而导致的磁盘 I/O 操作。

Link-time optimization(链接时优化)是一种不同的技术。通常情况下,编译器每次只能看到一个文件,因此只能优化这一个文件中的代码。然后链接器(linker)将多个编译产生的目标文件一起组装起来生成最终程序。Link-time optimization 的工作原理是让编译器一次性处理整个程序,将优化和代码生成步骤延迟到所有的依赖文件都已经准备好了之后再进行。这样一来就能显著提高性能。

他说,这两种技术可以配合起来同时使用,取得令人印象深刻的结果。一些优化 SPEC benchmark 的工作,使用 lknk-time optimization 优化获得了 5%的性能提升,而再加上 profile-guided optimization 优化后,性能提升了 20%。对于一个单独的应用程序来说这个技术已经很成熟了,但是 Bearman 想把这些技术应用到内核上,这一点之前很少有人敢于涉足。仔细调查之后,他发现了 Pengfei Yuan (及合作者)在 2014 年和 2015 年发表的两篇论文,后面这篇论文声称平均提速 8%。所以这项技术似乎值得一试。

Optimizing the kernel

他是在 Ubuntu 19.10 系统上进行开发的,使用的 toolchain 就是发行版中的自带的。Link-time optimization 配置起来还不是很容易,后来还是多亏了 Andi Kleen(他多年来一直在进行 kernel 的 link-time optimization 的工作,https://lwn.net/Articles/512548/ )的帮助,才成功完成。而 profile-guided optimization 搭建起来则相对容易很多,只是需要进行一些尝试就成功了。

团队先对内核配置打开了一些监控信息(instrumenting),然后用它来跑计划中的各种 workload。内核支持使用 gcov 进行 profiling,这就提供了很多必需信息。他提醒说,大家如果想要也尝试一下的话,一定要记得在采集完数据之后要关掉 profiling 选项并且重新编译 kernel,否则的话看到的数据差异就不如预想的大了。这听起来像是他们曾经踩过的坑。将 profile data 送入编译器是个不小的挑战,GCC 需要这个文件改成特定的很复杂的名字放到某个特定位置上。曾经有一个文件直接让编译器崩溃了,此外还遇到了各种 "其他小毛病"。

大部分的测试都是在 5.3 内核上用 Redis 数据库完成的。如果仅使用-O3 选项来构建内核的话,会看到性能变差了。不过,经过 link-time optimization 和 profile-guided optimization 的优化之后,会比标准 kernel 在各方面的测试中都有 2-4%的提升,除了有一个测试大约性能下降了 0.5%。他说,这个性能提升令人印象深刻,尤其是 Redis 实际上并没有在内核中花费很多时间。

Bearman 从这项工作中得出的结论是:在内核中使用这些技术是值得的。他说,Windows 非常依赖 profile-guided optimization 来进行内核优化,并取得了 5-20% 的性能提升。Linux 可能也可以得到类似的好处。这里其实有个恶性循环的问题导致这些工具在 Linux kernel 上很少使用:profile-guided optimization 还没有大范围用起来,所以人们对它的价值印象不深。这样导致编译器的开发者们也就不会花更多精力去进一步优化编译器了,从而又导致没人去用它。如果有更多的开发者努力把 profile-guided optimization 用起来,也许可以打破这种恶性循环,使整个社区受益。

更多的信息可以在这个演讲的幻灯片中找到(https://linuxplumbersconf.org/event/7/contributions/771/attachments/630/1193/Exploring_Profile_Guided_Optimization_of_the_Linux_Kernel.pdf )。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值