MariaDB · 社区动态 · MariaDB on Power8

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 前言 Power平台作为IBM的企业级平台,其稳定性和高效能在业界尤其是大型金融企业有着良好的口碑,MariaDB作为MySQL的重要开源分支,也对IBM Power8平台进行了适配。 很幸运我拿到了一台Power8的机器,在Linux on Power上成功编译了MariaDB 10.1版本,

前言

Power平台作为IBM的企业级平台,其稳定性和高效能在业界尤其是大型金融企业有着良好的口碑,MariaDB作为MySQL的重要开源分支,也对IBM Power8平台进行了适配。

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

关于Power平台

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

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

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

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

MariaDB对Power的适配

MariaDB迁移到Power8平台不仅仅是简单的修改代码让编译可以通过,当然这也是很重要的。

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

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

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

编译中的问题

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

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

[ 52%] Building CXX object storage/innobase/CMakeFiles/innobase.dir/api/api0api.cc.o
In file included from /root/mariadb-10.1.9/storage/innobase/include/ut0ut.h:36,
 from /root/mariadb-10.1.9/storage/innobase/include/univ.i:636,
 from /root/mariadb-10.1.9/storage/innobase/api/api0api.cc:27:
/root/mariadb-10.1.9/storage/innobase/include/os0sync.h:521:4: error: #error "Unsupported platform"
[ 52%] Building CXX object storage/archive/CMakeFiles/archive.dir/ha_archive.cc.o
In file included from /root/mariadb-10.1.9/storage/innobase/include/ sync0sync.h:837,
 from /root/mariadb-10.1.9/storage/innobase/include/mem0mem.h:34,
 from /root/mariadb-10.1.9/storage/innobase/include/data0data.h:33,
 from /root/mariadb-10.1.9/storage/innobase/include/que0que.h:30,
 from /root/mariadb-10.1.9/storage/innobase/include/api0misc.h:32,
 from /root/mariadb-10.1.9/storage/innobase/api/api0api.cc:38:
/root/mariadb-10.1.9/storage/innobase/include/sync0sync.ic: In function ‘lock_word_t ib_mutex_test_and_set(ib_mutex_t*)’:
/root/mariadb-10.1.9/storage/innobase/include/sync0sync.ic:85: error: ‘os_atomic_test_and_set’ was not declared in this scope
/root/mariadb-10.1.9/storage/innobase/include/sync0sync.ic: In function ‘void mutex_reset_lock_word(ib_mutex_t*)’:
/root/mariadb-10.1.9/storage/innobase/include/sync0sync.ic:113: error: ‘os_atomic_clear’ was not declared in this scope
make[2]: *** [storage/innobase/CMakeFiles/innobase.dir/api/api0api.cc.o] Error 1
make[1]: *** [storage/innobase/CMakeFiles/innobase.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

查看了下报错的代码行:
storage/innobase/include/sync0sync.ic

ib_mutex_test_and_set(
/*==================*/
        ib_mutex_t*     mutex)  /*!< in: mutex */
{
#if defined(HAVE_ATOMIC_BUILTINS)
        return(os_atomic_test_and_set(&mutex->lock_word));
#else

storage/innobase/include/os0sync.h

469 # if defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET)
470
471 /** Do an atomic test-and-set.
472 @param[in,out]  ptr   Memory location to set to non-zero
473 @return the previous value */
474 inline
475 lock_word_t
476 os_atomic_test_and_set(volatile lock_word_t* ptr)
477 {
478        return(__atomic_test_and_set(ptr, __ATOMIC_ACQUIRE));
479 }
480
481 /** Do an atomic clear.
482 @param[in,out]  ptr   Memory location to set to zero */
483 inline
484 void
485 os_atomic_clear(volatile lock_word_t* ptr)
486 {
487   __atomic_clear(ptr, __ATOMIC_RELEASE);
488 }
489
490 # elif defined(IB_STRONG_MEMORY_MODEL)
491
492 /** Do an atomic test and set.
493 @param[in,out]  ptr   Memory location to set to non-zero
494 @return the previous value */
495 inline
496 lock_word_t
497 os_atomic_test_and_set(volatile lock_word_t* ptr)
498 {
499   return(__sync_lock_test_and_set(ptr, 1));

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

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

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

diff --git a/storage/innobase/include/os0sync.h b/storage/innobase/include/os0sync.h
index 8e4b4f4..e192a3a 100644
--- a/storage/innobase/include/os0sync.h
+++ b/storage/innobase/include/os0sync.h
@@ -487,7 +487,7 @@ os_atomic_clear(volatile lock_word_t* ptr)
 	__atomic_clear(ptr, __ATOMIC_RELEASE);
 }

-# elif defined(IB_STRONG_MEMORY_MODEL)
+# elif defined(HAVE_ATOMIC_BUILTINS)

 /** Do an atomic test and set.
 @param[in,out]	ptr		Memory location to set to non-zero

最后说两句

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

最后放两张官方的测试结果,看起来还是很牛X的!

MariaDB Total System
MariaDB Per Core

目录
相关文章
|
关系型数据库 MySQL 数据安全/隐私保护
MySQL · 社区见闻 · MariaDB Developer Meeting 2016
高能预警:这还不是一篇纯技术的月报…… 前言 Percona Live 之后紧接着第二天就是 MariaDB Developer Meeting,会议地点就在Booking的办公大楼这次会议的主题就是讨论 10.3 的规划,以及 10.2 的 GA 计划,以及还需要加入 10.2 的功能。 先哭一会别人家的办公楼,这风景。 MariaDB Foundation 不比各种商业公司,全靠捐
2006 0
|
关系型数据库 MySQL 索引
MySQL · 社区动态 · MariaDB 10.2 前瞻
继 MariaDB 10.1 之后,对标 MySQL 5.7 的 MariaDB 10.2 版本也即将封板,那么我们就来看看新的版本有哪些新的功能吧。 之前的月报我们写过一篇关于 Window Function 的介绍,除此之外,10.2.2 又即将发布一些新的特性。 Virtual Columns 进一步加强 目前有两种类型的虚拟列:PERSISTENT/STORED 类型,这种类型的虚拟
1668 0
|
关系型数据库 MySQL C++
MariaDB · 社区动态 · MariaDB on Power8 (下)
背景 上一期月报MariaDB on Power8我介绍了下 MariaDB 为 Power 处理器所做的一些优化,但是并没有给出实际测试的效果,这次月报我们借到了一台Power8的机器,有机会亲自试一把 MariaDB 在 Power 上的表现。 环境 一切不交代测试场景的Benchmark
1907 0
|
存储 SQL 安全
MySQL · 社区动态 · MariaDB Role 体系
背景 从 MairaDB 10.0.5 开始,MariaDB 开始提供 Role(角色)的功能,补全了大家一直吐槽的 MySQL 不能像 Oracle 一样支持角色定义的功能。 一个角色就是把一堆的权限捆绑在一起授权,这个功能对于有很多用户拥有相同权限的情况可以显著提高管理效率。在有角色之前,这
1784 0
|
7月前
|
NoSQL 关系型数据库 MySQL
阿里云RDS关系型数据库大全_MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等,NoSQL数据库如Redis、Tair、Lindorm和MongoDB
256 0
|
7月前
|
NoSQL 关系型数据库 MySQL
阿里云关系型数据库详细介绍MySQL/MariaDB/SQL Server/PolarDB/PostgreSQL等
阿里云关系型数据库详细介绍MySQL/MariaDB/SQL Server/PolarDB/PostgreSQL等,阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
123 0
|
7月前
|
NoSQL Cloud Native 关系型数据库
阿里云RDS数据库_MySQL_SQL Server_MariaDB_PolarDB_PostgreSQL
阿里云RDS关系型数据库大全:MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
111 0
|
9月前
|
关系型数据库 MySQL API
MariaDB数据库中如何允许远程链接mysql并开放3306端口
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。
570 0