Files
oceanbase/docs/docs-cn/3.performance-white-paper/3.sysbench-test-for-oceanbase.md
2022-02-10 14:51:49 +08:00

12 KiB

OceanBase 数据库 Sysbench 测试

本文介绍如何使用 Sysbench 测试对 OceanBase 数据库的 OLTP 性能进行测试。

什么是 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 文档

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

测试方案

  1. 通过 OBD 部署 oceanbase集群,ODP 和 Sysbench 单独部署在一台机器上, 作为客户端的压力机器。OceanBase 集群规模为1:1:1,部署成功后先新建跑Sysbench测试的租户及用户(sys租户是管理集群的内置系统租户,请勿直接使用sys租户进行测试),设置租户的primary_zone为RANDOM,RANDOM表示新建表分区的leader随机到这3台机器。租户详情,参考 创建用户租户。

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

  1. 启动 Sysbench 客户端,进行 point_selectread_writeread_onlywrite_only 测试。

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

测试规格

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

安装 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
    

    参数说明:

    参数名 说明
    --prefix 指定 Sysbench 的安装目录。
    --with-mysql-includes 指定mysql的 includes 目录。
    --with-mysql-libs 指定mysql的 lib 目录。
    --with-mysql Sysbench 默认支持 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_auto_leader_switch=false;
    alter system set enable_one_phase_commit=false;
    alter system set weak_read_version_refresh_interval='5s';
    alter system set system_memory ='30G';--可根据实际环境动态调整
    ##调整日志级别及保存个数
    alter system set syslog_level='PERF';
    alter system set max_syslog_file_count=100;
    alter system set enable_syslog_recycle='True';
    alter system set trace_log_slow_query_watermark='10s';
    alter system set large_query_threshold='1s';
    alter system set clog_sync_time_warn_threshold='2000ms';
    alter system set syslog_io_bandwidth_limit='10M';
    alter system set enable_sql_audit=false;
    alter system set enable_perf_event=false; 
    alter system set clog_max_unconfirmed_log_count=5000;
    alter system set memory_chunk_cache_size ='16G';
    alter system set autoinc_cache_refresh_interval='86400s';
    ##cpu_quota_concurrency*租户cpu=工作线程数,具体的数值需要根据业务模型和机器配置调整
    alter system set cpu_quota_concurrency=2;
    alter system set enable_early_lock_release=false tenant=all;
    alter system set  default_compress_func = 'lz4_1.0';
    
  2. ODP 调优(sys租户登录设置)

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

    alter proxyconfig set enable_compression_protocol=false; --关闭压缩,降低cpu%
    alter proxyconfig set proxy_mem_limited='16G'; --防止oom,可根据实际环境动态调整
    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;
    
  3. 设置租户(进行测试的用户登录设置)

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

    ##把日志聚合,减小网络开销,提高并发读
    alter system set _clog_aggregation_buffer_amount=4;--需要在建表前配置
    alter system set _flush_clog_aggregation_buffer_timeout='1ms';
    ##数据库下租户设置,防止事务超时
    set global ob_timestamp_service='GTS';
    set global autocommit=ON;
    set global ob_query_timeout=36000000000;
    set global ob_trx_timeout=36000000000;
    set global max_allowed_packet=67108864;
    set global ob_sql_work_area_percentage=100;
    /*
    parallel_max_servers推荐设置为测试租户分配的resource unit cpu数的10倍
    如测试租户使用的unit配置为:create resource unit $unit_name max_cpu 26
    那么该值设置为260
    parallel_server_target推荐设置为parallel_max_servers * 机器数*0.8
    那么该值为260*3*0.8=624
    */
    set global parallel_max_servers=260;
    set global parallel_servers_target=624;
    

操作步骤

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

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

    /usr/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 cleanup
    
  2. 运行以下命令,新建表:

    /usr/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 --time=60 prepare
    
  3. 运行以下命令,执行测试:

    /usr/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 --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 访问数据时使用的随机生成函数。取值可以为 special、uniform、gaussian 或 pareto。 默认值为 special, 早期值为 uniform。
    --skip_trx=on 在只读测试中打开或关闭事务。默认打开。
    --percentile=N 打印百分位 rt,默认值为 95。
    oltp_write_only 在 Sysbench 的 lua 目录下,自带有针对不同场景的测试用例,比如 insert 和 point_select 等。

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 可能达到很高的利用率。