为继续我的MariaDB服务器单线程性能调查,我设法用sysbench在单线程只读的情况下使吞吐量提升40%以上,目前的情况如下:
我用如下命令运行只读的sysbench 0.4.12:
sysbench --num-threads=1 --test=oltp --oltp-test-mode=simple --oltp-read-only --oltp-skip-trx run
mysqld以最少的参数运行:
sql/mysqld --no-defaults --basedir=X --datadir=Y --innodb-buffer-pool-size=128M
现代CPU性能都已经很高了,有必要利用内置的性能计数器来对各类应用性能及瓶颈情况进行细致的测量。忘掉以前我们看代码、计算指令或周期的情形吧,它们已经不奏效了,至少已经不在一个数量级了。
我使用了Linux的perf对此编程。 在我的调研中,我发现基准测试中最大的瓶颈是缓存指令的丢失。测试样例如下:
Counter Value
INST_RETIRED.ANY 170431I
CACHE.MISSES 17194
这就是说10%在缓存中的一级指令在执行时丢失。这是很糟糕的。Intel的优化手册指出CACHE.MISSES/INST_RETIRED.ANY的比率: 任何超过1%的指令退役都会是明显的问题。我们比明显的问题的10倍还要糟糕。
缓存指令的丢失引起了CPU前端的瓶颈,在CPU的前端x86的指令进行获取、解码并运行到微软操作系统的队列,这些队列将在后端数据流发生故障时被调度。为了进一步的明确在这个基准中我们的前端瓶颈究竟有多严重,我们用到了Intel使用说明中的另一个考核方法:IDQ_UOPS_NOT_DELIVERED.CORE / (4*CPU_CLK_UNHALTED.THREAD) = 81.5%
这个比例说明的是前端不能迅速响应后端指令的占用时间百分比。在这种情况下,只要指令可以更快的被读取和解码,在超过80%的相同时间里,CPU就能做更多的工作。
知道如何分析相应的模块对于提高性能十分重要。粗略地说,80%的时间都花在等待ICACHE。过去我们会花费大量的时间调试代码中包括改善数据局部性或分支错误预测等等问题,但却始终不能大幅改善。问题就是,只有真正知道关键点在哪里才能把好钢用到刀刃上。
在icache misses,最好是使用配置文件导引优化。profile-guided optimisation.
这可以通过运行配置的mysqld binary数去收集有关的加载数据。之后binary数会重新编译,以便使用相关的信息去优化生成的代码。
通过分析程序的实际的运行情况可以帮助编译器分离出基本代码单元以及运行路径。
这可以帮助减少icache在运行中频繁跃进或跃出一个16字节的指令流(这种频繁跳跃会浪费icache的基本单元流也就是16-byte 流,)
它也可以提高直线代码执行路径的长度,这应该有助于提高硬件缓存中 icache中的保有数量。
理论上应该是这样的 - 但是实际效果如何呢? 事实证明它是有效的。首先我用带--coverage 参数的CFLAGS/CXXFLAGS来进行编译。然后我运行sysbench来产生配置文件数据。然后,我换用--profile-use 参数重新编译。这就是需要为它做的全部,GCC会自动处理其它所有事情。
使用优化后的程序重新运行基准测试,会获得一个大幅度的速度提升:
Binary | Queries per second | Speedup |
---|---|---|
Base:-O3 | 21404 | |
PGO:-O3 --profile-use | 30903 | 44% |
可以看到仅仅用了不同的优化编译方案,就获得了44% 的速度提升,还不错! (服务器端实际的提升还会更高,这是因为,由于该测试的单线程的特点,sysbench客户端耗费了部分的运行时资源)。
顺便说一句,那44 %的加速来源于只是适度减少ICACHE失效率 - 从10%下降到8%。这说明ICACHE misses造成的影响很显著。从二级缓存获取需要像12个周期,而在每个周期的CPU可能什么都不做,这对于本能在每个时钟后台执行4个操作数的情况下,是一个很大的浪费。因此,剩下的8%的失效率还是可有很大的改进,但实现起来就不仅仅是调试编译器的一些配置那么简单了。
我觉得很自然,以后应该开始使用档案导引优化未来的MariaDB的二进制文件。这会有不小的工作量,因为我们需要制定一套典型的工作负载来进行优化实验,然后将其集成到编译过程中。之后需要优化处理一系列不同的用途。然后是更多覆盖范围更广的测试来确保不会引入新的问题也不会造成性能的回退。通过测试能确保代码的质量,但这是没有止境的。
对提高单线程性能的工作将继续下去,只要时间允许,我当然会做出更多的好成绩(几个补丁已经在发布中)。但我认为本文提到的这部分很有趣的,值得与大家分享。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务