为 Ryzen CPU 优化 Git(速度提升 1.5 倍)
我至今仍记得,为了买到“附近”唯一有货的锐龙 3900X,我驱车两小时才买到。AMD 终于打破了英特尔在高端 CPU 领域的垄断,那种兴奋感是会传染的。从那时起,我用它处理过各种任务,它都应付自如,但我总感觉我运行的大多数软件仍然只为英特尔进行了优化。这些 CPU 的性能确实非常出色,但如果软件能专门为它们进行优化,性能还能提升多少呢?
锐龙系列的一个独特之处在于,它目前是唯一支持英特尔 SHA-NI 指令集的高端 CPU。该指令集于 2013 年首次发布,但英特尔似乎只在自家的低端 CPU 上实现了它。因此,大多数软件(包括我 Ubuntu 18.04 系统上的 OpenSSL)都懒得去使用这些指令。我知道它比纯软件实现要快得多,但我想看看在实践中效果如何,于是我启动了我的汇编器,开始工作。
我的假设很简单:或许这些指令能让 SHA 的速度快到足以用作哈希表的通用哈希函数。哈希表是 KeyDB 和 Redis 的核心数据结构,所以如果在这方面能有提升,那将是一大胜利。不幸的是,尽管这些指令比纯软件实现的 SHA-1 快得多,但它们仍然比像 siphash 这样为哈希表优化的函数慢很多。
手里有了可行的代码,我便开始为一个已有的解决方案寻找适用的问题。突破口出现在近旁的 Git 及其备受争议的 SHA-1 使用上。既然这些指令对于哈希表用途来说价值不大,或许它们还能改进 Git。经过几个小时的调试,我终于让一个运行着我为锐龙优化的 SHA-1 代码的 Git 成功跑了起来。结果显示,对于某些命令,这带来了显著的实际性能提升——特别是当你处理大文件时。
#
性能结果正如所料,严重依赖哈希计算的操作得到了大幅加速。这一点在检入大文件时尤其明显,我观察到了 1.5 倍的速度提升。次大的改进是“git fsck”,在 Linux 仓库上运行时速度快了 1.4 倍。Git checkout 也有轻微改进,在 Linux 仓库内运行速度快了约 1.06 倍。我在 clone 和 merge 操作中没有看到任何改进。
未测试的情况包括包含大量小文件的提交和非简单的合并;不过,只要不被磁盘 I/O 瓶颈所限,我预计在这些场景下也能看到性能提升。我的代码只是几个小时“黑客”式开发的成果,如果投入更多时间和打磨,结果应该会更好。
#
结论对于一些用户来说,这些改进将真正节省时间,而另一些用户可能只会看到微不足道的收益。但是,如果几个小时的“黑客”式开发就能改进如此大规模部署的软件,那么很明显,大多数软件仍然只为英特尔进行了优化。我希望我们能开始看到更多软件添加为 Zen 架构优化的代码路径——特别是随着 EPYC(霄龙)处理器在数据中心得到更广泛的采用。
你可以在这里找到我修改过的 Git:https://github.com/JohnSully/git。请注意,这些更改只是用于演示目的的原型,我暂时不建议在生产环境中使用它。