很幸运我拿到了一台Power8的机器,在Linux on Power上成功编译了MariaDB 10.1版本,不过还没有拿到同规格的PC服务器用于对比,所以本期我先介绍一下MariaDB on Power的一些信息,下期月报我会拿出实测对比数据,并且分析一下MariaDB在Power平台和x86平台上关键路径的效率。

    与我们常见的x86平台不同,Power平台是RISC架构,而Intel的x86是CISC架构,早期的Mac也是采用PowerPC。

    RISC相对于CISC,把主要的设计放在最常用的指令上,尽量使这些执行执行更加简单高效,对于不常用的指令,通过组合指令来完成。所以在实现特殊任务时,RISC会比CISC更复杂,但是因为RISC指令简单,可以更轻松的实现更多核数更多流水线来弥补。而且RISC单元电路少,功耗低,整体能耗水平会比CISC好很多。

    数据库业务属于简单业务,如果一台主机只运行数据库,那么在x86下其实有很多指令集是完全用不上的,所以理论上单位面积更低功耗,更多流水线,更高频率的Power平台运行数据库会更加高效。

    同时IBM也提供了Linux on Power,并且同时提供了大端、小端两种模式,而不再要求必须是AIX,毕竟Linux大部分人会更熟悉。

    从 git log 中可以看到,官方针对Power和Intel平台的不同,例如的差异,Intel平台是64,Power平台是128。还有MEMORY_BARRIER上的差异,也会导致在锁操作和部分IO操作上两个平台会有差异,MariaDB在这部分也做了修改。

    另外为了能使用IBM Advance Toolchain工具集编译 MariaDB 提升效率,也对代码上做了不少改动以便IBM Advance Toolchain能使用。

    总之看起来一切都很好,针对很多细节都做了针对性修改。

    既然广告看起来这么好,那么就亲自动手试一下。

    在Power on Linux上我下载了MariaDB 10.1.9的源码用GCC编译然而报错了:

    storage/innobase/include/os0sync.h

    可以看到,只有在HAVE_IB_GCC_ATOMIC_TEST_AND_SET或至少有一个标签打开的情况,ib_mutex_test_and_set()中调用的os_atomic_test_and_set()函数才会被开启。

    然而因为RHEL6的原因,在Power8平台上GCC只有和__powerpc__两个宏(升级到RHEL7可以解决)。因此就出现了这一幕,ib_mutex_test_and_set中调用了而os_atomic_test_and_set()在头文件中没有被定义。修改很简单啦,改成用同一个宏判断就行了。

    跟官方开发者沟通后这个fix可以解决这个问题

    虽然官方也是有性能测试结果的,然而显然我们是不能相信官方测试的。因此我还会构造场景针对CPU本身的效能进行测试,下一期大家期待测试结果吧。

    MariaDB Per Core