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 文档](https://github.com/oceanbase/obclient/blob/master/README.md)。

  

* OceanBase 数据库：建议单独部署 ODP。详细信息，参考 [使用 OBD 部署 OceanBase 数据库](../2.quickstart/4.deploy-the-oceanbase-database-by-using-obd.md)。

  




测试方案 
-------------------------

1. 通过 OBD 部署 oceanbase集群，ODP 和 Sysbench 单独部署在一台机器上, 作为客户端的压力机器。OceanBase 集群规模为1：1：1，部署成功后先新建跑Sysbench测试的租户及用户（sys租户是管理集群的内置系统租户，请勿直接使用sys租户进行测试），设置租户的primary_zone为RANDOM，RANDOM表示新建表分区的leader随机到这3台机器。租户详情，参考 [创建用户租户。](../6.administrator-guide/3.basic-database-management/5.tenants/2.create-a-user-tenant.md)

   

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

   




<!-- -->

3. 启动 Sysbench 客户端，进行 `point_select`、`read_write`、`read_only` 和 `write_only` 测试。

   

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

   




**测试规格** 

```shell
--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 下载地址](https://github.com/akopytov/sysbench/releases/tag/1.0.20)。
   

2. 解压 Sysbench。

   ```unknow
   unzip ./1.0.20.zip
   ```

   

3. 编译 Sysbench。

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

   ```unknow
   [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 是否安装成功：

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

   

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

   ```unknow
   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` 命令。

   ```sql
   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` 命令。

   ```sql
   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` 命令。

   ```sql
   ##把日志聚合，减小网络开销，提高并发读
   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. 运行以下命令，初始化数据库：

   ```unknow
   /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. 运行以下命令，新建表：

   ```unknow
   /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. 运行以下命令，执行测试：

   ```unknow
   /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 失败。报错信息如下：

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

  

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

  ```unknow
  yum install automake.noarch
  ```

  

* 安装 Sysbench 失败。报错信息如下：

  ```unknow
  libtoolize 1.4+ wasn't found, exiting
  ```

  

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

  ```unknow
  yum install libtool
  ```

  

* 安装 Sysbench 失败。报错信息如下：

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

  

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

  ```unknow
  yum install mysql-community-devel.x86_64
  ```

  

* 安装 Sysbench 失败。报错信息如下：

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

  

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

  ```unknow
  find /usr -name mysql
  ```

  

* 在 Sysbench 和 OceanBase 数据库 配置均合理的情况下，性能还是很差。

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

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

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

* 在高并发压力下，为什么系统的 CPU 利用率依然很低？

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




