MariaDB 10.1 和 MySQL 5.7.4-labs-tplc 的性能评估

引言

评估数据库系统的性能是一项非常艰巨的任务。需要做出很多艰难的选择,例如:

  • 使用什么操作系统及版本
  • 使用什么配置设置
  • 使用什么基准测试以及预热和测量时间多长
  • 使用什么测试设置
  • 使用什么版本的数据库管理系统
  • 使用什么存储引擎

虽然性能评估主要是机器时间,但人类监控测试仍然需要大量艰苦的工作。在这篇博文中,我们做出了以下选择:

  • 我们使用了一颗 Intel Xeon E5-2690 @ 2.9GHz CPU,包含 32 个核心,运行 Linux 3.4.12,拥有 132GB 主内存。数据库存储在 Fusion-IO ioDrive2 Duo 2.41TB 固件 v7.2.5,版本 110646 上,使用驱动程序 3.3.4 版本 5833069。数据库文件系统使用 NVMFS,所有测试日志和输出存储在 EXT4 上。
  • 我们选择了以下基准测试:
    • LinkBench [1],它基于 Facebook(一家主要社交网络)存储社交图数据生产数据库的跟踪记录。LinkBench 为社交和 Web 服务数据的持久存储提供了现实且具有挑战性的测试。
    • Percona 提供了一个在线事务处理 (OLTP) 基准测试,它是类似 TPC Benchmark C [2] 工作负载的实现,模拟仓库应用。TPC Benchmark C 于 1992 年 7 月获得批准,是一个在线事务处理 (OLTP) 基准测试。TPC-C 比之前的 OLTP 基准测试(如 TPC-A)更复杂,因为它具有多种事务类型、更复杂的数据库和整体执行结构。TPC-C 涉及混合执行五种不同类型和复杂度的并发事务,这些事务既可以在线执行,也可以排队延迟执行。数据库由九种类型的表组成,记录和填充大小范围广泛。TPC-C 以每分钟事务数 (tpmC) 为单位进行衡量。
  • 我们使用 LinkBench 数据库大小为 10 倍,即约 100GB,TPC-C 仓库数量为 1000 个。InnoDB 缓冲池设置为 50GB,因此在这两个基准测试中,数据库都无法完全放入主内存中。
  • 我们选择了 MariaDB 10.1.0 和 MySQL 5.7.4-labs-tplc 的 Alpha 版本,因为我们对它们的开发版本性能感兴趣。我们之所以选择这些特定版本,是因为它们都包含对 FusionIO 硬件、原子写入 [3,4] 和页压缩 [5] 的支持。
  • 我们决定在测试的两个服务器上都使用 InnoDB 存储引擎。
  • 我们在所有测试中都使用了 FusionIO 硬件原子写入 [3,4]。

我们选择这些的原因如下:

  • 我们希望评估现代硬件的性能,而不是一些即将淘汰的旧硬件。选择的硬件是如今为数据库服务器采购新硬件时可能会使用的设备。
  • 我们不想评估任何极端情况的性能,例如单线程客户端、所有数据都在主内存中、客户端线程数量过高或过低、仅读或仅写工作负载等等。这些情况对某些应用来说很有趣,但并非对所有应用都如此。
  • 我们希望使用数据库社区熟知和认可的基准测试。
  • XtraDB 不适用于 MySQL,我们有证据表明 XtraDB 在 FusionIO 硬件上性能不佳。
  • 我们在所有测试中都使用原子写入,因为它提供了更好的性能,因此我们禁用了 doublewrite buffer,因为使用原子写入时它是不必要的。

MySQL/MariaDB 配置

我们无法为 MariaDB 和 MySQL 使用完全相同的配置文件 (my.cnf),因为参数命名存在一些差异。因此,下面列出了配置变量的值,首先是通用变量及其值,然后是包含 MySQL 参数的 oracle 标签,以及包含 MariaDB 参数的 mariadb 标签。所有参数的选择都力求公平和具有代表性,但我们不声称它们是针对此硬件或这些基准测试的最佳值。

[mysqld]
innodb_buffer_pool_size = 50G
innodb_use_native_aio = 1
innodb_data_file_path=ibdata1:10M:autoextend
innodb_doublewrite = 0
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit=1
innodb_buffer_pool_instances = 16
innodb_compression_level = 6
#following is used for page compressed tables 2=lz4
innodb_compression_algorithm = 2
#following is used for uncompressed tables
#innodb_compression_algorithm = 0
innodb_flush_method = O_DIRECT
innodb_thread_concurrency = 32
innodb_write_io_threads = 32
innodb_read_io_threads = 32
innodb_file_format=barracuda
innodb_lru_scan_depth=25000
innodb_io_capacity=25000
innodb_io_capacity_max=35000
innodb_flush_neighbors=0
innodb_adaptive_flushing=1
innodb_log_buffer_size=256M
innodb_log_files_in_group=2
innodb_log_file_size=8GB
[oracle]
innodb_compression_punch_hole = 1

[mariadb]
innodb_use_fallocate = 1
innodb_use_atomic_writes = 1
innodb_use_trim = 1
ignore-builtin-innodb 
plugin-load=ha_innodb.so plugin-dir=/usr/local/mysql/
#these are used on MariaDB page compressed tables, not so good on other configurations
innodb_mtflush_threads = 16 
innodb_use_mtflush = 1 

基准测试设置

如前所述,LinkBench 使用 10 倍数据库大小,这将创建约 100GB 的数据库。加载命令如下:

./bin/linkbench -D dbid=linkdb -D maxid1=100000001 -c config/MyConfig.properties -l

LinkBench 测量阶段使用 64 个客户端线程,我们使用 maxtime 86300 秒,即 24 小时,预热时间默认为 180 秒。测量命令如下:

nohup ./bin/linkbench -D requesters=64 -Dmaxid1=100000001 -c config/MyConfig.properties -D requests=500000000 -D maxtime=86300 -r

对于 TPC-C,我们使用 1000 个仓库,因此加载命令如下:

sh -x load.sh tpcc1000 1000

我们使用默认线程数,即 64 个客户端线程(除非另有说明)。我们运行 TPC-C 的时限为 10800 秒,即 3 小时,预热时间为 30 秒,即测量命令如下:

./tpcc_start -dtpcc1000 -u root -w1000 -c64 -r30 -l10800 > res

 

性能结果:LinkBench

两个服务器都包含对 FusionIO 硬件的原子写入 [3,4] 和页压缩 [5] 的支持。下面我们比较使用此功能报告的操作数 = 事务/秒。

LinkBench_measure

两个服务器在缓冲池预热并满载后都提供了稳定的性能。在两个服务器中,缓冲池满载后性能都会下降,这时我们需要从 FusionIO 硬件中真正获取页面。然而,MariaDB 在缓冲池满载后提供了明显更优的性能。在此测试中,我们使用了两个服务器都提供的 LZ4 压缩方法。MariaDB 可以提供约 30% 的更好性能,测试结束时的差异为每秒 5654 次操作。

如果系统可用,两个服务器都提供以下压缩方法:

 

如果系统可用,MariaDB 还支持以下压缩方法:

下面我们展示了在两个服务器上使用未压缩表得到的相同结果。

LinkBench_measure2

两个服务器一开始性能都很好,但当缓冲池满载且写入放大开始减缓 I/O 性能时,性能会缓慢下降。这是由于写入放大 (WA),它可能发生在闪存和固态硬盘 (SSD) 上,其中实际写入的物理信息量是预期写入的逻辑信息量的倍数。因为闪存必须先擦除才能重写,执行这些操作的过程导致用户数据和元数据被移动(或重写)不止一次。这种倍增效应增加了 SSD 生命周期内所需的写入次数,从而缩短了其可靠运行的时间。增加的写入还会消耗到闪存的带宽(计算),这主要降低了 SSD 的随机写入性能 [6]。MariaDB 提供了约 8% 的更好性能,测试结束时的差异为每秒 2225 次操作。

下一个研究点是行压缩表。由于 MySQL 和 MariaDB 包含相同或几乎相同的实现,我们预计性能不会有显著差异。结果如下:

LinkBench_measure3

结果正如预期,几乎相同,观察到的微小差异显然在统计变异范围内。最后,让我们结合之前的所有结果,看看未压缩、行压缩和页压缩结果之间的差异。

LinkBench_measure4

正如预期的那样,使用未压缩表可获得最佳性能。请注意,此结果与 [5] 中呈现的结果并不矛盾,因为在此我们使用原子写入并在所有测试中禁用了 doublewrite buffer。在测量时间结束时,页压缩性能比未压缩性能低约 22%,差异为每秒 5500 次操作。类似地,在测量时间结束时,行压缩性能比未压缩性能低约 68%,行压缩性能比页压缩性能低约 37%。最后,未压缩和行压缩之间的差异为每秒 11800 次操作,页压缩和行压缩之间的差异为每秒 6568 次操作。

对于我们的最终测试,我们测量了使用 MariaDB 10.1 创建 10 倍大小 LinkBench 数据库所需的加载时间。

load_time

 

显然,创建页压缩数据库所需时间最短,其次是未压缩数据库。创建行压缩数据库比前两者慢得多。

性能结果:TPC-C

我们再次从使用页压缩功能 [5] 的 TpmC 结果开始,使用不同数量的客户端线程。

 

tpcc_page

同样,MariaDB 在所有测试中都提供了明显更好的性能。使用的服务器有 32 个核心,这就是为什么当客户端线程数增加到超过 32 个核心时,性能数字会下降。让我们看看新订单事务的性能结果以及使用默认客户端线程数的结果。

 

tpcc_pagecomp

虽然 MySQL 偶尔可以提供更高数量的已完成新订单事务,但其变化幅度明显更大,中位数也远低于 MariaDB 的结果。MariaDB 在缓冲池预热后可以提供相当稳定的性能。显然,MySQL 的 flush 实现无法跟上非常快的 FusionIO 硬件。本文所有测试的瓶颈不在于 FusionIO 硬件,而在于 MySQL/MariaDB 的实现。

在下图中,我们比较了使用未压缩表和页压缩表的结果,同时改变 TPC-C 测试套件客户端线程数从 4 到 512。

tpcc_full

当客户端线程数在 4 到 32 之间时,MariaDB 在未压缩表和页压缩表上都能提供明显更好的性能。实际上,MariaDB 页压缩表的性能与 MySQL 未压缩表的性能相同甚至更好。当客户端线程数增加时,MariaDB 的性能比 MySQL 更早下降,但下降幅度不如使用 512 个客户端线程的最终结果中看到的 MySQL 性能那样显著。在高客户端线程数下,MariaDB 页压缩性能与未压缩表相比可以提供显著更好的性能。

结论

首先,这两个数据库服务器的 Alpha 版本都非常稳定。在进行性能评估期间,我们没有遇到哪怕一次崩溃或其他问题。这对这些开发版本的质量来说是一个非常好的迹象。

其次,显然需要识别和修复由显着更快的 FusionIO 存储设备引入的新瓶颈。在所有测试中,我们都未能接近充分利用 FusionIO 硬件提供的全部吞吐量。FusionIO 硬件可以被视为内存层次结构 [7] 的新级别,需要类似主内存所需的 [8] 新型优化和研究。一些早期研究成果可以在 [9] 中看到。

最后,对于具有类似于 LinkBench 和 TPC-C 所示工作负载的应用,MariaDB 显然可以提供更好的性能。

参考文献

[1] Timothy G. Armstrong, Vamsi Ponnekanti, Dhruba Borthakur, and Mark Callaghan. 2013. LinkBench:一个基于 Facebook 社交图的数据库基准测试。收录于 Proceedings of the 2013 ACM SIGMOD International Conference on Management of Data (SIGMOD ’13)。ACM, New York, NY, USA, 1185-1196. http://doi.acm.org/10.1145/2463676.2465296.

[2] http://www.tpc.org/tpcc/

[3] MariaDB 引入原子写入,https://blog.mariadb.org/mariadb-introduces-atomic-writes/

[4] Xiangyong Ouyang and David W. Nellans and Robert Wipfel and David Flynn and Dhabaleswar K. Panda: 超越块 I/O:重新思考传统存储原语,收录于 Proceedings of the 2011 IEEE 17th International Symposium on High Performance Computer Architecture, pages 301-311, http://dx.doi.org/10.1109/HPCA.2011.5749738

[5] MariaDB 在 FusionIO 上使用新的页压缩显着提升性能,https://blog.mariadb.org/significant-performance-boost-with-new-mariadb-page-compression-on-fusionio/

[6] 写入放大。https://en.wikipedia.org/wiki/Write_amplification

[7] 内存层次结构。https://en.wikipedia.org/wiki/Memory_hierarchy

[8] Stefan Manegold, Peter A. Boncz, and Martin L. Kersten. 2000. 为新瓶颈:内存访问优化数据库架构。《The VLDB Journal》9, 3 (2000 年 12 月), 231-246. DOI=10.1007/s007780000031 http://dx.doi.org/10.1007/s007780000031

[9] Seok-Hoon Kang, Dong-Hyun Koo, Woon-Hak Kang and Sang-Won Lee: Flash Memory SSD 在 Hadoop 应用中的案例分析,
《International Journal of Control and Automation》,Vol. 6, No. 1, 2013 年 2 月。http://www.sersc.org/journals/IJCA/vol6_no1/17.pdf