「最佳实践」Sysbench:开发者必备技能

2024-08-12 16:35:09 浏览数 (1)

本章看点:

  • Sysbench 简介
  • Sysbench 安装
  • Sysbench 用法讲解
  • Sysbench 对MySQL进行 OLTP
  • 分析 MySQL 测试结果
  • SysBench 对服务器进行测试
  • SysBench 常见测试场景
  • SysBench 自定义测试脚本
  • 总结

SysBench 简介

SysBench 是一个非常强大的开源性能测试工具,广泛应用于数据库系统(特别是 MySQL)的性能测试。它基于 LuaJIT,这使得它不仅拥有 Lua 的灵活性,还具有出色的执行性能。由于 LuaJIT 的即时编译能力,SysBench 能够将 Lua 脚本直接编译为机器码,从而实现高效的执行,这对于性能测试工具来说尤为重要。

主要特点

  • 多线程支持: SysBench 可以通过多线程模拟并发操作,这对测试数据库在高并发情况下的性能表现至关重要。
  • 高度可定制: 通过 Lua 脚本,用户可以编写自定义测试用例,测试不同的数据库操作场景,如插入、更新、删除、选择等。
  • 跨平台: Sysbench 支持多种操作系统,包括 Linux、Windows、macOS 等,适用于各种开发和测试环境。
  • 广泛应用: 虽然它常用于 MySQL,但 SysBench 也支持其他数据库系统(如 PostgreSQL),以及非数据库的基准测试,如 CPU、内存、文件系统等。

典型应用场景

  • 数据库性能测试: 评估数据库在各种操作下(插入、选择、更新、删除等)的性能,包括单线程和多线程的表现。
  • 硬件性能评估: 测试 CPU、内存和 I/O 性能,评估硬件在处理高负载任务时的能力。
  • 系统稳定性测试: 通过长时间的高负载测试,检测系统在长时间运行下的稳定性。

为什么 LuaJIT 重要

LuaJIT 是 Lua 的即时编译器,与传统解释型语言相比,它能将代码直接编译为机器码,显著提升代码执行速度。这对于 SysBench 这样一个基准测试工具来说非常重要,因为高效的脚本执行能够确保测试本身不会成为系统性能的瓶颈。

在使用 SysBench 进行测试时,用户可以根据需求编写或调整 Lua 脚本,从而模拟出更贴近实际应用场景的负载。LuaJIT 的高效性保证了这些脚本在执行过程中尽可能减少对测试结果的影响,使得测试更加准确。

主要功能

  • CPU运算性能测试:通过质数计算或圆周率计算来评估CPU性能。
  • 磁盘IO性能测试:测试系统的磁盘读写速度。
  • 调度程序性能测试:评估操作系统的调度程序性能。
  • 内存分配及传输速度测试:测试系统的内存性能。
  • POSIX线程性能测试:评估系统的线程处理能力。
  • 数据库性能测试(OLTP基准测试):通过模拟数据库操作来评估数据库性能。

支持的数据库

SysBench目前支持MySQL、Oracle和PostgreSQL数据库的性能测试。

安装方法

  • 二进制安装:对于RHEL/CentOS,可以使用curlyum命令安装。
  • 源码安装:对于其他Linux发行版,可以从GitHub下载源码包进行编译安装。

核心性能测试指标

  • QPS(Queries Per Second):每秒的查询数。
  • TPS(Transactions Per Second):每秒的事务数。
  • 并发数:系统同时处理的请求数(事务数)。
  • 响应时间:一般取平均响应时间。

SysBench 安装

基于CentOS系统上从源码安装Sysbench的步骤

1.安装依赖包

代码语言:bash复制
yum -y install make automake libtool pkgconfig libaio-devel openssl-devel mysql-devel

这一步安装了编译Sysbench所需的依赖包,包括makeautomakelibtoolpkgconfiglibaio-developenssl-develmysql-devel

2.进入源码目录

代码语言:bash复制
cd /usr/src/

这一步切换到/usr/src/目录,这是存放源码包的常用目录。

3.下载Sysbench源码包

代码语言:bash复制
wget https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz

这一步使用wget命令从GitHub下载Sysbench的源码包。这里下载的是版本1.0.20。

4.解压源码包

代码语言:bash复制
tar xvf 1.0.20.tar.gz

这一步使用tar命令解压下载的源码包。

5.进入解压后的目录

代码语言:bash复制
cd sysbench-1.0.20/

这一步切换到解压后的Sysbench源码目录。

6.运行autogen.sh脚本

代码语言:bash复制
./autogen.sh

这一步运行autogen.sh脚本,该脚本用于生成配置脚本所需的文件。

7.运行configure脚本

代码语言:bash复制
./configure

这一步运行configure脚本,该脚本用于检查系统环境并生成Makefile文件。

8. 编译源码

代码语言:bash复制
make -j

这一步使用make命令编译源码。-j选项表示使用多个线程进行编译,加快编译速度。

9. 安装Sysbench

代码语言:bash复制
make install

这一步使用make命令安装编译好的Sysbench。

完成以上步骤后,Sysbench将被安装在系统的默认路径下。可以通过运行sysbench --version命令来检查安装是否成功。

安装完成后,压测脚本默认会安装在 /usr/local/share/sysbench 目录下。

我们看看该目录的内容。

以下是列出的文件和文件夹的简要说明:

  • 文件夹

tests:这个文件夹包含了一些测试脚本和配置文件,用于执行各种性能测试。

  • Lua脚本文件

bulk_insert.lua:用于测试批量插入操作的性能。

oltp_common.lua:包含了一些通用的OLTP测试函数和变量。

oltp_delete.lua:用于测试删除操作的性能。

oltp_insert.lua:用于测试插入操作的性能。

oltp_point_select.lua:用于测试点查询操作的性能。

oltp_read_only.lua:用于测试只读操作的性能。

oltp_read_write.lua:用于测试读写混合操作的性能。

oltp_update_index.lua:用于测试更新索引操作的性能。

oltp_update_non_index.lua:用于测试更新非索引字段操作的性能。

oltp_write_only.lua:用于测试只写操作的性能。

select_random_points.lua:用于测试随机点查询操作的性能。

select_random_ranges.lua:用于测试随机范围查询操作的性能。

SysBench 用法讲解

性能基准测试

sysbench 命令语法如下:

代码语言:javascript复制
sysbench [options]... [testname] [command]
  • 命令中的testname是配置项名称。sysbench 支持的测试项包括:
    • oltp_*.lua 一系列OLTP类的数据库压测
    • fileio 文件系统层对压测
    • cpu 简单的CPU压测
    • memory 内存访问压测
    • threads 基于线程的调度器压测
    • mutex 一个POSIX mutex压测
  • command是 sysbench 要执行的命令,支持的选项有:prepareprewarmruncleanuphelp。注意,不是所有的测试项都支持这些选项。
  • options是配置项。sysbench 中的配置项主要包括以下两部分:

通用配置项

这部分配置项可通过 sysbench --help 查看。例如,

一些常见的通用配置项:

  • --threads=N:指定使用的线程数。
  • --time=N:指定测试持续时间(秒)。
  • --report-interval=N:指定报告间隔(秒),即每隔多少秒输出一次测试结果。
  • --percentile=N:指定输出结果的百分位数,默认为95。
  • --mysql-host=HOST:指定MySQL服务器的主机名或IP地址。
  • --mysql-port=N:指定MySQL服务器的端口号,默认为3306。
  • --mysql-user=USER:指定连接MySQL服务器的用户名。
  • --mysql-password=PASSWORD:指定连接MySQL服务器的密码。
  • --mysql-db=DB:指定要测试的MySQL数据库名称。

测试项相关的配置项。各个测试项支持的配置项可通过 sysbench testname help 查看。例如

代码语言:txt复制
sysbench memory help

SysBench 对 MySQL 进行 OLTP

oltp_read_write为例的四个标准步骤如下:

Prepare(准备)

创建测试数据库和表,并填充测试数据。

代码语言:javascript复制
sysbench --test=oltp_read_write --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=testdb --tables=10 --table-size=100000 prepare

解释

  • --test=oltp_read_write:指定测试类型为OLTP读写测试。
  • --db-driver=mysql:指定数据库驱动为MySQL。
  • --mysql-host=localhost:指定MySQL服务器的主机名或IP地址。
  • --mysql-port=3306:指定MySQL服务器的端口号。
  • --mysql-user=root:指定连接MySQL服务器的用户名。
  • --mysql-password=root:指定连接MySQL服务器的密码。
  • --mysql-db=testdb:指定要测试的MySQL数据库名称。
  • --tables=10:指定要创建的表的数量。
  • --table-size=100000:指定每个表的数据行数。

Prewarm(预热)

预热数据库缓存和磁盘I/O。

代码语言:javascript复制
sysbench --test=oltp_read_write --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=testdb --tables=10 --table-size=100000 prewarm

Run(运行)

执行OLTP基准测试。

代码语言:javascript复制
sysbench --test=oltp_read_write --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=testdb --tables=10 --table-size=100000 run

Cleanup(清理)

清理测试过程中创建的测试数据库和表。

代码语言:javascript复制
sysbench --test=oltp_read_write --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=testdb --tables=10 --table-size=10000 cleanup

通过以上四个步骤,可以使用Sysbench对MySQL数据库进行全面的OLTP基准测试,并根据测试结果进行针对性的优化。

分析 MySQL 测试结果

分析下 oltp_read_write 场景下的压测结果

代码语言:txt复制
Running the test with following options:
Number of threads: 1
Initializing random number generator from current time


Initializing worker threads...

Threads started!

SQL statistics:
    queries performed:
        read:                            1330 # 读操作的数量
        write:                           380 # 写操作的数量
        other:                           190 # 其它操作的数量
        total:                           1900 # 总的操作数量,total = read   write   other
    transactions:                        95     (9.40 per sec.) # 总的事务数(每秒事务数)
    queries:                             1900   (187.94 per sec.) # 总的操作数(每秒操作数)
    ignored errors:                      0      (0.00 per sec.) # 忽略的错误数(每秒忽略的错误数)
    reconnects:                          0      (0.00 per sec.) # 重试次数(每秒重试的次数)

General statistics:
    total time:                          10.1077s # 总的执行时间
    total number of events:              95 # 执行的 event 的数量

Latency (ms):
         min:                                  102.29 # 最小耗时
         avg:                                  106.38 # 平均耗时
         max:                                  131.12 # 最大耗时
         95th percentile:                      112.67 # 95% event 的执行耗时
         sum:                                10106.20 # 总耗时

Threads fairness:
    events (avg/stddev):           95.0000/0.00 # 平均每个线程执行 event 的数量
    # stddev 是标准差,值越小,代表结果越稳定。
    execution time (avg/stddev):   10.1062/0.00 # 平均每个线程的执行时间

输出中,重点关注三个指标:

  • 每秒事务数,即我们常说的 TPS(Transactions Per Second)。
  • 每秒操作数,即我们常说的 QPS(Queries Per Second)。
  • 95% event 的执行耗时。

TPS 和 QPS 反映了系统的吞吐量,越大越好。执行耗时代表了事务的执行时长,越小越好。在一定范围内,并发线程数指定得越大,TPS 和 Q入房QPS(Queries Per Second)和 TPS(Transactions Per Second)是衡量系统性能的两个重要指标,它们分别表示每秒处理的请求数量和每秒处理的事务数量。

  1. QPS(Queries Per Second):每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。
  2. TPS(Transactions Per Second):每秒事务数,是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

关系

  • 在某些情况下,QPS 和 TPS 可以是等价的,比如在某些简单的请求响应场景中,每个请求就是一个事务。
  • 但在复杂的系统中,一个事务可能包含多个请求,因此 TPS 通常会小于 QPS。例如,在一个电商网站中,一个事务可能包括浏览商品、添加购物车、下单、支付等多个步骤,每个步骤都可能产生多个请求。

注意事项

  • 在评估系统性能时,除了关注 TPS 和 QPS 外,还需要考虑其他因素,如响应时间、错误率、资源利用率等。
  • 95% event 的执行耗时是一个重要的性能指标,它表示 95% 的事件都在这个时间内完成。这个指标有助于了解系统在高负载下的性能表现,并帮助识别潜在的性能瓶颈。

SysBench 对服务器进行测试

sysbench 是一个多功能的基准测试工具,它可以用来测试服务器的 CPU、内存、磁盘 I/O 和数据库性能。

测试 CPU 性能

使用 sysbenchcpu 测试模式来评估 CPU 的性能:

代码语言:javascript复制
sysbench cpu --threads=<number_of_threads> run

其中 <number_of_threads> 是希望使用的线程数。这个测试会运行一系列的计算任务,并报告 CPU 的性能。

CPU speed:

  • events per second: 每秒事件数,这里是 2044.28。这个数字反映了 CPU 每秒可以处理的事件数量,数值越高,表示 CPU 性能越好。

General statistics:

  • total time: 总时间,这里是 10.2612 秒。这是整个测试运行的总时间。
  • total number of events: 事件总数,这里是 20980。这是在测试期间发生的事件总数。

Latency (ms):

  • min: 最小延迟,这里是 0.95 毫秒。这是所有事件中最短的响应时间。
  • avg: 平均延迟,这里是 235.00 毫秒。这是所有事件的平均响应时间。
  • max: 最大延迟,这里是 8812.24 毫秒。这是所有事件中最长的响应时间。
  • 95th percentile: 95% 的延迟,这里是 2082.91 毫秒。这意味着 95% 的事件的延迟都低于这个值。
  • sum: 延迟总和,这里是 4930323.48 毫秒。这是所有事件的延迟总和。

Threads fairness:

  • events (avg/stddev): 事件数(平均值/标准差),这里是 10.4900/13.18。这表示每个线程平均处理的事件数以及这些事件数的标准差。
  • execution time (avg/stddev): 执行时间(平均值/标准差),这里是 2.4652/3.30。这表示每个线程平均的执行时间以及这些执行时间的标准差。

从这些数据中,我们可以得出以下结论:

  • CPU 的性能表现良好,每秒可以处理超过 2000 个事件。
  • 总体来看,测试运行了 10.26 秒,期间发生了 20980 个事件。
  • 延迟方面,大部分事件的响应时间在 235 毫秒左右,但有一些极端情况下的延迟非常高,达到了 8.8 秒。
  • 在多线程公平性方面,每个线程处理的事件数和执行时间的平均值和标准差都在合理范围内。

测试内存性能

sysbench 提供了 memory 测试模式来测试 RAM 的性能:

代码语言:javascript复制
sysbench memory --memory-block-size=<block_size> --memory-total-size=<total_size> run

这里 <block_size> 是每次操作的内存块大小,而 <total_size> 是总共要操作的内存量。

选项

默认值

描述

--memory-block-size

1KB

内存块的大小,建议设置为 1MB。

--memory-total-size

100GB

要传输的数据的总大小。

--memory-scope

global

内存访问范围,可指定 global 或 local。

--memory-hugetlb

off

是否从 HugeTLB 池中分配内存,默认为 off。

--memory-oper

write

内存操作类型,可指定 read、write、none,默认为 write。

--memory-access-mode

seq

内存访问模式,可指定 seq(顺序访问)、rnd(随机访问),默认为 seq。

Running memory speed test with the following options:

  • block size: 块大小,这里是 1024KiB。
  • total size: 总大小,这里是 1024MiB。
  • operation: 操作类型,这里是写入(write)。
  • scope: 范围,这里是全局(global)。

Total operations: 1024 (14439.97 per second)

  • Total operations: 总操作数,这里是 1024。
  • per second: 每秒操作数,这里是 14439.97。

1024.00 MiB transferred (14439.97 MiB/sec)

  • Transferred: 转移的数据量,这里是 1024.00 MiB。
  • MiB/sec: 数据传输速率,这里是 14439.97 MiB/秒。

General statistics:

  • total time: 总时间,这里是 0.0691秒。
  • total number of events: 总事件数,这里是 1024。

Latency (ms):

  • min: 最小延迟,这里是 0.06毫秒。
  • avg: 平均延迟,这里是 0.07毫秒。
  • max: 最大延迟,这里是 0.13毫秒。
  • 95th percentile: 95%的延迟,这里是 0.08毫秒。
  • sum: 延迟总和,这里是 68.24毫秒。

Threads fairness:

  • events (avg/stddev): 事件数(平均值/标准差),这里是 1024.0000/0.00。
  • execution time (avg/stddev): 执行时间(平均值/标准差),这里是 0.0682/0.00。

测试磁盘 I/O 性能

sysbenchfileio 测试模式可以用来测试磁盘 I/O 性能:

代码语言:javascript复制
sysbench fileio --file-total-size=<total_size> --file-test-mode=<mode> --file-num=1 run

其中 <total_size> 是要创建的文件的总大小,<mode> 可以是 seqwr(顺序写入)、seqrd(顺序读取)、rndrd(随机读取)等不同的 I/O 模式

选项

默认值

描述

--file-num

128

需要创建的文件数。

--file-block-size

16384

数据块的大小,即 16KB。

--file-total-size

2GB

需要创建的文件总大小。

--file-test-mode

seqwr

测试模式,可指定 seqwr(顺序写)、seqrewr(顺序重写)、seqrd(顺序读)、rndrd(随机读)、rndwr(随机写)、rndrw(随机读写)。

--file-io-mode

sync

文件的操作模式,可指定 sync(同步 IO)、async(异步 IO)、mmap,默认为 sync。

--file-async-backlog

128

每个线程异步 IO 队列的长度。

--file-extra-flags

打开文件时指定的标志,可指定 sync、dsync、direct,默认为空,没指定。

--file-fsync-freq

100

指定持久化操作的频率,即每执行 100 个 IO 请求,则会进行一次持久化操作。

--file-fsync-all

off

在每次写入操作后执行持久化操作,默认为 off。

--file-fsync-end

on

在测试结束时执行持久化操作,默认为 on。

--file-fsync-mode

fsync

持久化操作的模式,可指定 fsync、fdatasync,默认为 fsync。

--file-merged-requests

0

允许合并的最多 IO 请求数,默认为0,不合并。

--file-rw-ratio

1.5

混合测试中的读写比例。

这段输出是来自 sysbench 工具的测试结果,sysbench 是一个多功能的基准测试工具,可以用来测试 CPU、内存、磁盘 I/O 和数据库的性能。下面是对这段输出的详细解释:

Extra file open flags: (none)

  • 1 files, 1GiB each: 创建 1 个文件,每个文件大小为 1GiB。
  • 1GiB total file size: 总文件大小为 1GiB。
  • Block size 16KiB: 块大小为 16KiB。
  • Periodic FSYNC enabled, calling fsync() each 100 requests: 启用周期性 FSYNC,每 100 个请求调用一次 fsync()。
  • Calling fsync() at the end of test, Enabled: 测试结束时调用 fsync(),已启用。
  • Using synchronous I/O mode: 使用同步 I/O 模式。
  • Doing sequential write (creation) test: 进行顺序写入(创建)测试。

File operations:

  • reads/s: 每秒读取次数,这里是 0.00。
  • writes/s: 每秒写入次数,这里是 10315.23。
  • fsyncs/s: 每秒 fsync() 调用次数,这里是 103.25。

Throughput:

  • read, MiB/s: 每秒读取的 MiB 数,这里是 0.00。
  • written, Mi克/s: 每秒写入的 MiB 数,这里是 161.18。

General statistics:

  • total time: 总时间,这里是 10.0031 秒。
  • total number of events: 总事件数,这里是 104232。

Latency (ms):

  • min: 最小延迟,这里是 0.01 毫秒。
  • avg: 平均延迟,这里是 0.10 毫秒。
  • max: 最大延迟,这里是 21.50 毫秒。
  • 95th percentile: 95% 的延迟,这里是 0.01 毫秒。
  • sum: 延迟总和,这里是 9956.08 毫秒。

Threads fairness:

  • events (avg/stddev): 事件数(平均值/标准差),这里是 104232.0000/0.00。
  • execution time (avg/stddev): 执行时间(平均值/标准差),这里是 9.9561/0.00。

测试数据库性能

如何使用 sysbench 对 MySQL 数据库进行基准测试。这里是一个简化的例子:

代码语言:javascript复制
sysbench oltp_read_write --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=<database> --tables=<number_of_tables> --table-size=<size> --threads=<number_of_threads> prepare
sysbench oltp_read_write --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=<database> --tables=<number_of_tables> --table-size=<size> --threads=<number_of_threads> run

在这个例子中,<host><port><user><password><database><number_of_tables><size> 都需要替换为实际的值。

SysBench 常见测试场景

  • 1. bulk_insert:批量插入操作。在 SysBench 中,批量插入可以通过设置插入操作的数量来实现。

这个命令执行了批量插入操作,插入了10万条记录,使用了16个线程,持续时间为60秒。

代码语言:txt复制
sysbench oltp_insert --table-size=100000 --threads=16 --time=60 run
  • 2. oltp_delete: OLTP 删除操作。测试数据库在删除数据时的性能。

这个命令执行了删除操作,对数据库中已有的10万条记录进行删除操作。

代码语言:txt复制
sysbench oltp_delete --table-size=100000 --threads=16 --time=60 run
  • 3. oltp_insert: OLTP 插入操作。测试数据库在插入数据时的性能。

这个命令测试了插入数据的性能,类似于 bulk_insert,但规模较小。

代码语言:txt复制
sysbench oltp_insert --table-size=100000 --threads=16 --time=60 run
  • 4. oltp_point_select: OLTP 点查询。测试数据库对单个记录的快速查询性能。

这个命令执行了点查询操作,随机选择记录并进行查询。

代码语言:txt复制
sysbench oltp_point_select --table-size=100000 --threads=16 --time=60 run
  • 5. oltp_read_only: 只读操作。测试数据库在只进行读取操作时的性能。

这个命令执行了只读操作,数据库只进行读取,不涉及写操作。

代码语言:txt复制
sysbench oltp_read_only --table-size=100000 --threads=16 --time=60 run
  • 6. oltp_read_write: 读写混合操作。测试数据库在读写混合负载下的性能。

这个命令执行了读写混合操作,包括查询和插入/更新/删除操作。

代码语言:txt复制
sysbench oltp_read_write --table-size=100000 --threads=16 --time=60 run
  • 7. oltp_update_index: 更新索引字段的操作。测试数据库在更新有索引字段时的性能。

这个命令执行了更新索引字段的操作,测试更新有索引字段的记录时的性能。

代码语言:txt复制
sysbench oltp_update_index --table-size=100000 --threads=16 --time=60 run
  • 8. oltp_update_non_index: 更新非索引字段的操作。测试数据库在更新没有索引的字段时的性能。

这个命令执行了更新非索引字段的操作,测试更新无索引字段时的性能。

代码语言:txt复制
sysbench oltp_update_non_index --table-size=100000 --threads=16 --time=60 run
  • 9. oltp_write_only: 仅写入操作。测试数据库在纯写入负载下的性能。

这个命令执行了写入操作,数据库只进行插入/更新/删除操作,不涉及读取。

代码语言:txt复制
sysbench oltp_write_only --table-size=100000 --threads=16 --time=60 run
  • 10. select_random_points: 随机点查询。测试数据库从表中随机选择记录进行查询的性能。

这个命令执行了随机点查询操作。

代码语言:txt复制
sysbench select_random_points --table-size=100000 --threads=16 --time=60 run
  • 11. select_random_ranges: 随机范围查询。测试数据库从表中随机选择一段连续记录进行查询的性能。

这个命令执行了随机范围查询操作,查询一个连续的记录范围。

代码语言:txt复制
sysbench select_random_ranges --table-size=100000 --threads=16 --time=60 run

SysBench 自定义脚本

要创建一个自定义的 SysBench 测试脚本,例如 goboy_select.lua,首先需要明确你想测试的具体内容。假设 goboy_select.lua 是一个测试数据库中随机选择一条记录的查询脚本,并将其打印出来。

goboy_select.lua 示例

代码语言:javascript复制
lua复制代码-- 定义全局命令行选项
sysbench.cmdline.options = {
    table_size = { type = "int", default = 10000, description = "Number of rows in the table" },
    select_column = { type = "string", default = "c", description = "Column to select" },
}

-- 初始化线程
function thread_init(thread_id)
    -- 连接到数据库
    db_connect()
end

-- 清理线程
function thread_done(thread_id)
    -- 断开数据库连接
    db_disconnect()
end

-- 自定义的点查询函数
function goboy_select(thread_id)
    -- 从1到table_size之间随机选择一个ID
    local id = math.random(1, sysbench.opt.table_size)
    
    -- 准备SELECT语句,选择指定的列
    local query = string.format("SELECT %s FROM sbtest WHERE id = %d", sysbench.opt.select_column, id)
    
    -- 执行查询
    local result = db_query(query)
    
    -- 处理查询结果,这里只是打印出来
    print("Selected ID: " .. id .. ", Value: " .. result)
end

-- 事件处理函数,每个事件周期内调用
function event(thread_id)
    goboy_select(thread_id)
end

goboy_select.lua解析

全局命令行选项 (sysbench.cmdline.options)

table_size: 代表表的总行数。默认值为 10000

select_column: 允许用户指定要查询的列。默认值为 c

线程初始化 (thread_init)

在每个线程启动时调用,用于建立与数据库的连接。这里调用了 db_connect() 函数。

线程清理 (thread_done)

在线程结束时调用,用于断开数据库连接。这里调用了 db_disconnect() 函数。

自定义点查询函数 (goboy_select)

goboy_select 函数是核心部分,它首先随机选择一个 id,然后根据用户指定的列(select_column),生成并执行 SELECT 语句。

执行查询后,查询结果会被简单地打印出来(print 函数)。

事件处理 (event)

每个事件周期内,event 函数会调用 goboy_select 函数,执行一次随机点查询。

goboy_select.lua 使用

运行自定义脚本:

代码语言:javascript复制
sysbench --lua=./goboy_select.lua --table_size=50000 --select_column="k" --threads=4 --time=60 run
  • --lua=./goboy_select.lua: 指定自定义的 Lua 脚本文件。
  • --table_size=50000: 设定表的总行数为 50000
  • --select_column="k": 指定要查询的列为 k
  • --threads=4: 使用 4 个线程。
  • --time=60: 测试持续时间为 60 秒。

扩展

  • 添加更多的查询逻辑: 可以扩展脚本,让它同时执行多个查询,或者执行更加复杂的查询。
  • 处理查询结果: 考虑将查询结果存储或进行进一步的处理,例如统计查询时间等。
  • 并发测试: 增加线程数或自定义事件间隔,以测试数据库在高并发情况下的表现。

通过这种方式,可以轻松创建适合自己测试需求的 SysBench 自定义脚本。

总结

随着信息技术的快速发展,软件系统需要处理的数据量和并发用户数呈现爆炸式增长。为了确保系统在高负载下的稳定性和性能,压力测试(压测)成为了一个关键的环节。

压测的目的

  1. 发现系统瓶颈:通过模拟大量用户并发访问,可以暴露出系统的性能瓶颈,如数据库连接池不足、网络带宽受限等。
  2. 评估系统稳定性:长时间的高负载测试可以检验系统在持续压力下的稳定性和可靠性。
  3. 优化系统性能:通过对压测结果的分析,可以针对性地进行系统优化,提高系统的吞吐量和响应速度。
  4. 容量规划:压测可以帮助确定系统的最大承载能力,为资源分配和扩展提供依据。

压测对于确保软件系统在高负载下的稳定性和性能至关重要。通过合理地使用 sysbench,可以帮助开发者和运维人员发现系统瓶颈、评估系统稳定性、优化系统性能和进行容量规划,从而为用户提供更好的服务体验。

0 人点赞