暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

分布式数据库学习Note109:OceanBase社区版中,OceanBase 数据库 Sysbench 测试如何进行?

本文介绍如何使用 Sysbench 测试对 OceanBase 数据库的 OLTP 性能进行测试。在本文中使用 2 种方式,对 OceanBase 运行 Sysbench 测试:

  • 通过 OBD test 命令一键进行 Sysbench 测试。

  • 基于官方 Sysbench 工具手动 step by step 进行测试。

什么是 Sysbench

Sysbench 是一个基于 LuaJIT 的可编写脚本的多线程基准测试工具,可以执行 CPU、内存、线程、IO 和数据库等方面的性能测试,常用于评估测试各种不同系统参数下的数据库负载情况,不需要修改源码,通过自定义 lua 脚本就可以实现不同业务类型的测试。Sysbench 主要包括以下几种测试:

  • CPU 性能

  • 磁盘 IO 性能

  • 调度程序性能

  • 内存分配及传输速度

  • POSIX 线程性能

  • 数据库性能(OLTP 基准测试)

环境准备

  • JDK:建议使用 1.8u131 及以上版本

  • make:yum install make

  • automake:yum install automake

  • autoconf:yum install autoconf

  • libtool:yum install libtool

  • gcc:yum install gcc

  • mariadb-devel:yum install mariadb-devel mariadb

  • JDBC:建议使用 mysql-connector-java-5.1.47 版本

  • Sysbench:建议使用 1.0 及以上版本

  • OBClient :详细信息,参考 OBClient 文档

    注意

    当使用的 OBClient 版本大于等于 2.2.0 时,会默认开启 ob20 协议以及全链路追踪的能力,在 sysbench 测试中会影响性能,建议通过设置环境变量手动关闭:export ENABLE_PROTOCOL_OB20=0

  • OceanBase 数据库:建议单独部署 ODP。详细信息,参考 使用 OBD 部署 OceanBase 数据库

  • iops:建议磁盘 iops 在 10000 以上

  • 租户规格:

    create resource unit sysbench_unit max_cpu 26, memory_size '70g';
    create resource pool sysbench_pool unit = 'sysbench_unit', unit_num = 1, zone_list=('zone1','zone2','zone3');
    create tenant sysbench_tenant resource_pool_list=('sysbench_pool'),  zone_list('zone1', 'zone2', 'zone3'), primary_zone=RANDOM, locality='F@zone1,F@zone2,F@zone3' set variables ob_compatibility_mode='mysql', ob_tcp_invited_nodes='%';
    

    注意

    • 上文的租户规格是基于 OceanBase Sysbench 性能测试报告 中的硬件配置进行配置的,您需根据自身数据库的硬件配置进行动态调整。详细操作请参考 修改租户

    • 部署集群时,建议不要使用 OBD cluster autodeploy 命令,该命令为了保证稳定性,不会最大化资源利用率(例如不会使用所有内存),建议单独对配置文件进行调优,最大化资源利用率。

测试方案

  1. 本次测试需要用到 4 台机器,Sysbench、ODP 和 OBD 单独部署在一台机器上,作为客户端的压力机器。通过 OBD 部署 OceanBase 集群需要使用 3 台机器,OceanBase 集群规模为 1:1:1。

    说明

    在 Sysbench 测试中,部署 Sysbench、ODP 和 OBD 的机器有一定的灵活性,根据 OBServer 总核数的不同分为以下三种情况:

    • 当 OBServer 总核数小于等于 47 核时,该机器仅需要 8 核 64G 即可。

    • 当 OBServer 总核数在 48 核和 72 核之间时,该机器需要 16 核 128G。

    • 当 OBServer 总核数大于等于 73 核时,该机器需要 32 核 128G。

  2. 部署成功后先新建进行 Sysbench 测试的租户及用户(sys 租户是管理集群的内置系统租户,请勿直接使用 sys 租户进行测试),设置租户的 primary_zone 为 RANDOM,RANDOM 表示新建表分区的 leader 随机到这 3 台机器。

  3. 通过 Sysbench 导入 30 张表,每张表有 100 万行数据。

  4. 启动 Sysbench 客户端,进行 point_selectread_writeread_only 和 write_only 测试。

  5. 每轮测试 --time 设置为 60s,线程数取值可以为 32/64/128/256/512/1024 等。

OBD 一键测试

添加一脚本 ob_sysbench.sh

#!/bin/bash
echo "run oltp_read_only test"
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_read_only.lua --table-size=1000000 --threads=32 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_read_only.lua --table-size=1000000 --threads=64 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_read_only.lua --table-size=1000000 --threads=128 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_read_only.lua --table-size=1000000 --threads=256 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_read_only.lua --table-size=1000000 --threads=512 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_read_only.lua --table-size=1000000 --threads=1024 --rand-type=uniform

echo "run oltp_write_only test"
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_write_only.lua --table-size=1000000 --threads=32 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_write_only.lua --table-size=1000000 --threads=64 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_write_only.lua --table-size=1000000 --threads=128 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_write_only.lua --table-size=1000000 --threads=256 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_write_only.lua --table-size=1000000 --threads=512 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_write_only.lua --table-size=1000000 --threads=1024 --rand-type=uniform

echo "run oltp_read_write test"
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_read_write.lua --table-size=1000000 --threads=32 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_read_write.lua --table-size=1000000 --threads=64 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_read_write.lua --table-size=1000000 --threads=128 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_read_write.lua --table-size=1000000 --threads=256 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_read_write.lua --table-size=1000000 --threads=512 --rand-type=uniform
obd test sysbench <deploy_name> --tenant=<tenant_name> --script-name=oltp_read_write.lua --table-size=1000000 --threads=1024 --rand-type=uniform

其中 deploy_name 为部署集群的名称,tenant_name 为租户名称,您需根据实际情况进行修改。

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
sudo yum install ob-sysbench
 ./ob_sysbench.sh 

注意

  • 使用 OBD 运行 Sysbench 的详细参数介绍请参考命令 obd test sysbench

  • 使用 OBD 进行一键测试时,集群的部署必须是由 OBD 进行安装和部署,否则无法获取集群的信息,将导致无法根据集群的配置进行性能调优。

  • 如果系统租户的密码通过终端登陆并修改,非默认空值,则需要您先在终端中将密码修改为默认值,之后通过 obd cluster edit-config 命令在配置文件中为系统租户设置密码,配置项是 # root_password: # root user password。在 obd cluster edit-config 命令执行结束后,您还需执行 obd cluster reload 使修改生效。

  • 运行 obd test sysbench 后,系统会详细列出运行步骤和输出,数据量越大耗时越久。

  • obd test sysbench 会自动完成所有操作,无需其他额外任何操作,包含测试数据的生成、OceanBase 参数优化、加载和测试。当中间环节出错时可以参考命令 obd test sysbench 进行重试,例如可以跳过数据的生成直接进行加载和测试。

手动进行 Sysbench 测试

测试规格

--mysql-db=test 
--table_size=1000000 
--tables=30 
--threads=32/64/128/256/512/1024 
--report-interval=10 
--time=60 
--db-ps-mode=disable
--rand-type=uniform

安装 Sysbench

按照以下步骤安装 Sysbench。

  1. 下载 Sysbench。

    详细信息参考 Sysbench 下载地址

  2. 解压 Sysbench。

    unzip ./1.0.20.zip
    
  3. 编译 Sysbench。

    进入 Sysbench 解压后的目录,运行以下命令编译 Sysbench:

    [wieck@localhost ~] $ cd sysbench-1.0.20
    [wieck@localhost sysbench-1.0.20] $./autogen.sh
    [wieck@localhost sysbench-1.0.20] $./configure --prefix=/usr/sysbench/ --with-mysql-includes=/usr/include/mysql/ --with-mysql-libs=/usr/lib64/mysql/ --with-mysql
    [wieck@localhost sysbench-1.0.20] $make
    [wieck@localhost sysbench-1.0.20] $make install
    [wieck@localhost sysbench-1.0.20] $cp -r /usr/sysbench/share/sysbench/* /usr/sysbench/bin/
    

    参数说明:

    参数名说明
    --prefix指定 Sysbench 的安装目录。
    --with-mysql-includes指定 mysql 的 includes 目录。
    --with-mysql-libs指定 mysql 的 lib 目录。
    --with-mysqlSysbench 默认支持 MySQL
  4. 运行以下命令,验证 Sysbench 是否安装成功:

    [wieck@localhost sysbench-1.0.20] $./src/sysbench --help
    

    如果返回以下信息,则 Sysbench 安装成功。

    Usage:
      sysbench [options]... [testname] [command]
    Commands implemented by most tests: prepare run cleanup help
    

环境调优

在执行 Sysbench 测试前,您需要对 OceanBase 数据库进行简单的设置,以发挥其最大性能。

  1. OBServer调优(sys 租户登录设置)

    在系统租户下执行 obclient -h$host_ip -P$host_port -uroot@sys -A 命令。

    alter system set enable_sql_audit=false;
    alter system set enable_early_lock_release=true tenant=<your tenant name>;
    alter system set memory_chunk_cache_size=0;
    alter system set syslog_io_bandwidth_limit='30m';
    alter system set enable_async_syslog=true;
    alter system set large_query_worker_percentage=10;
    alter system set builtin_db_data_verify_cycle=0;
    alter system set micro_block_merge_verify_level=0;
    alter system set large_query_threshold='200s';
    alter system set trace_log_slow_query_watermark='10s';
    alter system set server_permanent_offline_time='36000s';
    alter system set _ob_get_gts_ahead_interval='1ms';
    alter system set bf_cache_priority=10;
    alter system set user_block_cache_priority=5;
    alter system set syslog_level='PERF';
    alter system set enable_perf_event=False;
    alter system set _cache_wash_interval='1m';
    alter system set cache_wash_threshold='10G';
    alter system set plan_cache_evict_interval='30s';
    alter system set bf_cache_miss_count_threshold=1;
    alter system set _enable_defensive_check=False;
    alter system set _rowsets_enabled=false tenant=<your tenant name>;
    alter system set _enable_newsort=false;
    alter system set _trace_control_info=''  tenant=<your tenant name>;
    alter system set _lcl_op_interval='0ms';
    alter system set ob_enable_batched_multi_statement=True tenant=<your tenant name>;
    alter system set writing_throttling_trigger_percentage=100 tenant=<your tenant name>;
    
  2. ODP 调优(sys 租户登录设置)

    在系统租户下执行 obclient -h$host_ip -P$host_port -uroot@sys -A 命令。

    alter proxyconfig set enable_prometheus=False;
    alter proxyconfig set enable_metadb_used=False;
    alter proxyconfig set enable_standby=False;
    alter proxyconfig set enable_strict_stat_time=False;
    alter proxyconfig set use_local_dbconfig=True;
    alter proxyconfig set enable_compression_protocol=False;
    alter proxyconfig set enable_ob_protocol_v2=False;
    
  3. 设置租户(进行测试的用户登录设置)

    在测试用户下执行 obclient -h$host_ip -P$host_port -u$user@$tenant -p$password -A 命令。

    set global  ob_query_timeout = 3600000000;
    set global ob_trx_timeout = 3600000000;
    set global max_allowed_packet = 67108864;
    set global ob_sql_work_area_percentage = 100;
    # parallel_servers_target = max_cpu * server_num * 8
    set global parallel_servers_target = 624;
    set global binlog_row_image = 'MINIMAL';
    
  4. 调优参数设置完毕后请执行 obd cluster restart $cluster_name 命令重启集群。

操作步骤

按照以下步骤进行 Sysbench 测试:

  1. 运行以下命令,初始化数据库:

    /usr/sysbench/bin/sysbench oltp_read_write.lua --mysql-host=x.x.x.x --mysql-port=xxxx --mysql-db=test --mysql-user=$user@$tenant --mysql-password=xxx --table_size=1000000 --tables=30 --threads=150 --report-interval=10 --rand-type=uniform --time=60 cleanup 
    
  2. 运行以下命令,新建表:

    /usr/sysbench/bin/sysbench oltp_read_write.lua --mysql-host=x.x.x.x --mysql-port=xxxx --mysql-db=test --mysql-user=$user@$tenant --mysql-password=test --table_size=1000000 --tables=30 --threads=150 --report-interval=10 --rand-type=uniform --time=60 prepare 
    
  3. 运行以下命令,执行测试:

    /usr/sysbench/bin/sysbench oltp_read_write.lua --mysql-host=x.x.x.x --mysql-port=xxxx --mysql-db=test --mysql-user=$user@$tenant --mysql-password=xxx --table_size=1000000 --tables=30 --threads=150 --report-interval=10 --time=60 --rand-type=uniform --db-ps-mode=disable run 
    

    参数说明:

    参数名说明
    --mysql-host运行 OceanBase 数据库机器的 IP。如果有 ODP 建议使用 ODP 的 IP。
    --mysql-port端口号。
    --mysql-db待连接的数据库。
    --mysql-user用户名。
    --mysql-password密码。
    --table_size每张表初始化的数据数量。
    --tables初始化表的数量。
    --threads启动的线程数量。
    --time运行时间。设置为 0 时表示不限制时间。
    --report-interval运行期间日志,单位为秒。
    --events最大请求数量,定义数量后可以不需要 --time 选项。
    --rand-type访问数据时使用的随机生成函数。取值可以为 specialuniformgaussian 或 pareto。 默认值为 special, 早期值为 uniform
    --skip_trx=on在只读测试中打开或关闭事务。默认打开。
    --percentile=N打印百分位 rt,默认值为 95
    oltp_write_only在 Sysbench 的 lua 目录下,自带有针对不同场景的测试用例,比如 insert 和 point_select 等。

说明

测试结果可参考 OceanBase Sysbench 性能测试报告

FAQ

  • 安装 Sysbench 失败。报错信息如下:

    automake 1.10.x (aclocal) wasn't found, exiting
    

    操作系统没有安装 Automake。运行以下命令安装 Automake:

    yum install automake.noarch
    
  • 安装 Sysbench 失败。报错信息如下:

    libtoolize 1.4+ wasn't found, exiting
    

    操作系统没有安装 Libtool。运行以下命令安装 Libtool:

    yum install libtool
    
  • 安装 Sysbench 失败。报错信息如下:

    drv_mysql.c:35:19: fatal error: mysql.h: No such file or directory
    

    操作系统没有安装 MySQL 的 lib 库。运行以下命令安装:

    yum install mysql-community-devel.x86_64
    
  • 安装 Sysbench 失败。报错信息如下:

    cannot find MySQL client libraries in /usr/lib/mysql/
    

    执行以下命令查找 MySQL 的 lib 库。可能位于 /usr/lib64/mysql

    find /usr -name mysql
    
  • 在 Sysbench 和 OceanBase 数据库配置均合理的情况下,性能还是很差。

    1. Sysbench 是对 CPU、内存、网络非常敏感的测试。如果客户端和目标测试数据库不在一个局域网中,网络延迟可能会影响 Sysbench 性能。

    2. 与 OceanBase 数据库集群使用了 ODP 有关,可以先对单个 OceanBase 数据库进程进行高并发压力测试,将结果和使用 ODP 的场景对比。

    3. 建议将 ODP 和 Sysbench 单独部署在同一台机器上,通过 ODP 进行 Sysbench 测试。

  • 在高并发压力下,为什么系统的 CPU 利用率依然很低?

    虽然整体 CPU 偏低,但是部分模块的 CPU 可能达到很高的利用率。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论