本文介绍常用测试工具Sysbench如何对RDS MySQL的X-Engine引擎进行测试,帮助您准确评估X-Engine的性能。

前提条件

  • 确认RDS MySQL实例默认存储引擎为X-Engine。
    说明 如下所示,XENGINE的Support列值应为DEFAULT。
    MySQL [(none)]> show storage engines;
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
    | BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
    | XENGINE            | DEFAULT | X-Engine storage engine                                        | YES          | YES  | YES        |
    | MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
    | InnoDB             | YES     | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
    | PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
    | Sequence           | YES     | Sequence Storage Engine Helper                                 | NO           | NO   | NO         |
    | MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
    | MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
    | CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
    | ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    11 rows in set (0.00 sec)
  • 确认测试用表存储在X-Engine中。
    说明 如下所示,ENGINE=XENGINE。如果建表语句显式注明了ENGINE=INNODB或其他存储引擎,所建的表将不使用X-Engine。
    MySQL [sbtest]> show create table sbtest1;
    +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table   | Create Table                                                                                                                                                                                                                                                                                                                                                          |
    +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | sbtest1 | CREATE TABLE `sbtest1` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `k` int(11) NOT NULL DEFAULT '0',
      `c` char(120) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
      `pad` char(60) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      KEY `k_1` (`k`)
    ) ENGINE=XENGINE AUTO_INCREMENT=2001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci |
    +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.01 sec)
说明 建议您使用1.1.0或更高版本的Sysbench。

使用DTS进行存储空间测试

我们推荐您使用阿里云数据迁移服务DTS将您的真实数据库数据迁移至X-Engine引擎的RDS MySQL实例,然后查看X-Engine的磁盘空间占用情况,这样的测试结果更符合您的实际业务情况。由于X-Engine同时应用了空间友好的存储格式、前缀编码、分层存储、高效压缩算法等多种技术来降低磁盘空间占用,这些技术的实际效果与您数据库中的库表结构、记录长度等因素相关,所以使用您的真实数据进行测试,结果更为准确。

因为DTS不支持在迁移数据的过程中自动切换存储引擎,您需要在使用X-Engine引擎的RDS MySQL实例上手动创建数据库和表,并按前提条件所述确认建表语句指明使用X-Engine存储引擎(ENGINE=XENGINE),然后使用DTS仅迁移数据,不迁移库表结构。

建议您在完成数据导入后,暂勿执行SQL,并通过RDS控制台持续观测实例的CPU和IOPS利用率情况,待CPU和IOPS基本归零后,此时的空间占用数据较为准确。这是因为X-Engine所采用的LSM-tree数据结构依赖后台异步任务来完成数据压缩等降低存储成本的功能,后台任务的执行需要一些时间,会使用一些CPU和IOPS资源。

详细迁移步骤请参见RDS实例间数据迁移

使用Sysbench进行存储空间测试

为充分测试X-Engine的空间压缩效率,建议将Sysbench测试命令中的table_size参数设为一个较大的数(在MySQL实例磁盘大小允许范围内)。

与使用DTS测试相同,我们建议您在完成数据导入后持续观测实例的CPU和IOPS利用率情况,待CPU和IOPS基本归零后,此时的空间占用数据较为准确。

Sysbench测试命令:

sysbench /usr/share/sysbench/oltp_update_index.lua \
  --mysql-host=[RDS实例连接串] \
  --mysql-user=sbtest \
  --mysql-password=sbtest@888 \
  --mysql-db=sbtest \
  --threads=32 \
  --tables=32 \
  --table_size=1000000000 \
  --mysql-storage-engine=XENGINE \
  prepare

使用Sysbench进行性能测试

在使用Sysbench进行性能测试时,我们建议您将rand-type设为zipfian,将rand-zipfian-exp设为0.9。

  • rand-type为SQL语句填充的随机数的分布。
  • zipfian分布是一种常见的带热点倾斜的数据分布,当rand-zipfian-exp为0.9时,使用zipfian分布所生成的随机数更接近真实世界中常见的数据分布,此时测试结果相比使用默认的uniform分布而言更具参考价值。

建议您单次测试进行更长的时间,如3600秒。长时间测试有利于获得更具参考价值的平均性能,降低潜在的干扰因素对性能数据的影响。

建议使用较多的线程数来测试吞吐能力,如512个线程。

如您希望通过对X-Engine进行参数调节来获得更高的性能,请与您的客户经理、售后工程师等阿里云服务人员取得联系,我们将为您提供咨询服务。

Sysbench测试命令:

sysbench /usr/share/sysbench/oltp_point_select.lua \
  --mysql-host=[RDS实例连接串] \
  --mysql-user=sbtest \
  --mysql-password=sbtest@888 \
  --time=3600 \
  --mysql-db=sbtest \
  --tables=32 \
  --threads=512 \
  --table_size=10000000 \
  --rand-type=zipfian \
  --rand-zipfian-exp=0.9 \
  --report-interval=1 \
  run

使用Python脚本批量执行测试

如需要批量进行多个Sysbench测试,推荐使用Python脚本自动执行并记录结果。示例(被测数据库实例连接地址为输入)如下:

import subprocess
import time
import sys

def execute_test(test_name, db_conn_string):
  # setup sysbench parameters
  mysql = "--mysql-host=%s" % db_conn_string
  user = "--mysql-user=sbtest"
  password = "--mysql-password=*********"
  time = "--time=3600"
  database = "--mysql-db=sbtest"
  tables = "--tables=32"
  threads = "--threads=512"
  table_size = "--table_size=1000000"
  distribution = "--rand-type=pareto --rand-pareto-h=0.9"
  # formulate the sysbench command
  cmd = 'sysbench ' + test_name + " " + mysql + " " + user+ " " + password + " " + time+ " " + database+ " " + tables + " " + threads + " " + table_size+ " " + distribution+ " " + "--report-interval=1"+ " " +'run'
  # execute
  out = subprocess.check_output(cmd,
    stderr = subprocess.STDOUT, shell=True)
  # output sysbench outputs to a file
  output_file_name = "xengine_result_"+test_name[20:len(test_name)]
  output_file = open(output_file_name, "w")
  output_file.write(out)
  output_file.close()

if __name__ == '__main__':
  # the connection string for the MySQL (X-Engine) instance to be tested
  db_conn_string = sys.argv[1]

  test = [
    "/usr/share/sysbench/oltp_update_index.lua",
    "/usr/share/sysbench/oltp_point_select.lua",
    "/usr/share/sysbench/oltp_read_only.lua",
    "/usr/share/sysbench/oltp_write_only.lua",
    "/usr/share/sysbench/oltp_read_write.lua",
    "/usr/share/sysbench/oltp_insert.lua"
  ]

  for atest in test:
    print("start test:\t%s\t%s" % (atest, time.ctime()))
    execute_test(atest, db_conn_string)
    print("end test:\t%s\t%s" % (atest, time.ctime()))
    # sleep for some seconds
    # after a period of testing with inserts/updates/deletes, x-engine needs some time to complete
    # its asynchronous background compactions.
    time.sleep(1000)