6

[数据库]000 - 🍳Sysbench 数据库压力测试工具

 3 years ago
source link: https://segmentfault.com/a/1190000038731788
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

000 - :egg:Sysbench 数据库压力测试工具

EVzqmez.png!mobile

  • sysbench 是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘 I/O 、线程、数据库的性能测试。目前支持的数据库有 MySQLOraclePostgreSQL 。以下操作都将以支持 MySQL 数据库为例进行。

1. Linux 上安装 sysbench 工具

  • 安装方式有两种,一种是通过 yum / apt 等来安装,另一种自己下载源码包来安装,笔者这里采用的是 centos ,采用 yum 安装
  • sysbench 的源码包下载地址: http://sourceforge.net/projects/sysbench ,采用源码安装的可转这里
  • 通过 yum 安装如下:

    • 设置 yum repo 仓库

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash

  • 安装

sudo yum -y install sysbench

  • 安装完检查是否成功

sysbench --version

aAZ3iuv.png!mobile

2. 数据库测试用例准备

  • 我们这里测试的是 MySQL ,首先我们在数据库创建一个专门用来测试的库 test_db

iuQrAzA.png!mobile

  • 通过 sysbench 创建20个测试表,每个表中创建100万数据,再通过10个线程对测试库发起访问,持续5分钟,对其进行压测

3. sysbench 构建表与数据

  • 执行下面命令准备数据

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.10 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable prepare

  • 上面命令的参数说明:

    • --db-driver=mysql : 表示数据库的驱动类型,我们使用的是 MySQL 所以填 mysql ,如果使用 Oracle 则填写相应的 oracle
    • --time=300 : 这个参数表示持续访问的时间 300秒
    • --threads=10 : 表示使用10个线程模拟并发访问
    • --report-interval=1 : 表示每隔一秒输出以此压测情况
    • --mysql-host=192.168.56.10 --mysql-port=3306 --mysql-user=root --mysql-password=root : 这一块的配置,就是基本的数据库链接信息,指定数据库 IP ,端口,账号密码
    • --mysql-db=test_db --tables=20 --table_size=1000000 : 这三个参数设置,表示指定测试的库为 test_db , 同时在这个库中构建20个表,并且每个表中构建出 100万条测试数据,表的名字会类似 sbtest1 , sbtest2 这种格式
    • oltp_read_write : 表示执行 oltp 数据库的读写测试
    • --db-ps-mode=disable : 禁止 ps 模式
    • prepare : 表示按照命令设置去构建出我们的数据,也就是对前面所有命令的执行方案

4. 全方位测试

1. 综合读写测试

  • 测试数据库的综合读写 TPS ,使用 oltp_read_write 模式

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.10 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable run

注意:命令最后不再是 之前的 prepare,这里是 run ,表示运行压测,前面的是准备数据

  • 效果

6fYja2.png!mobile

  • 上面是直接输出到控制台,我们也可以将其全部记录在文件中,通过管道, | tee /tmp/mysysbench.log 整个命令如下:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.10 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable run | tee /tmp/mysysbench.log

2. 只读性能测试

  • 测试数据库的只读性能,使用 oltp_read_only 模式,命令如下:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.10 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_only --db-ps-mode=disable run

  • 结果:

ZrE3InM.png!mobile

  • 如果要输出到文件如上

3. 删除性能测试

  • 测试数据库的删除性能,使用模式: oltp_delete ,命令如下:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.10 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_delete --db-ps-mode=disable run

4. 更新索引字段测试

  • 测试数据库的更新索引字段的性能,使用模式: oltp_update_index , 命令如下:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.10 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_update_index --db-ps-mode=disable run

5. 更新非索引字段测试

  • 测试数据库中更新非索引字段的性能,使用模式: oltp_update_non_index , 命令如下:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.10 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_update_non_index --db-ps-mode=disable run

6. 插入性能测试

  • 测试数据库的数据插入性能,使用模式: oltp_insert ,命令如下:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.10 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_insert --db-ps-mode=disable run

7. 写入性能测试

  • 测试数据库的写入性能,使用模式: oltp_write_only , 命令如下:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.10 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_write_only --db-ps-mode=disable run

8. 清理数据

  • 前面命令进行了各种测试,在测试完之后我们可以通过下面的 cleanup 命令来清除构建的测试数据

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.10 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable cleanup

9. 压测结果分析

  • 通过上面的命令我们可以全方位的得到测试的结果,我们直接每个一秒输出一次结果,在控制台会输出类似下面的东西:

[ 31s ] thds: 10 tps: 350.35 qps: 5575.50 (r/w/o: 4874.81/0.00/700.69) lat (ms,95%): 36.89 err/s: 0.00 reconn/s: 0.00

  • 我们来解释一下其中的含义,首先 [31s] 表示这是在第31秒的时候输出的一段压测统计结果,其他字段如下:

    • thds:10 : 表示当前有 10 个线程正在压测
    • tps:350.35 : 表示当前每秒执行了 350.35 个事务
    • qps:5575.50 : 表示当前每秒可以执行 5575.50 个请求
    • (r/w/o: 4874.81/0.00/700.69) : 表示在每秒 5575.50 个请求中,有 4874.81 个读请求, 0.00 个写请求, 700.69 个其他请求,其实就是对 qps 的细化
    • lat (ms,95%): 36.89 :表示 95% 的请求的延迟都在36.89 毫秒以下
    • err/s: 0.00 reconn/s: 0.00 :表示有0个请求失败,发生了0次的网络重连
  • 在压测结束后会输出一个总的压测结果,如下:

3yIfu2n.png!mobile

  • 其中的参数的解释:

IfINZbQ.png!mobile

10. 常用监控命令

  • 在压测过程中我们要时刻关注服务器的 CPU 、磁盘 I/O 、网络负载等信息,一旦发现任何一个超出一定负荷,则不适合再继续加大线程数来压测了
  • 一定要注意,压测的过程是要保证机器各项指标在正常范围内的最大负载,而不是我们不断的增大 sysbench 的线程数,不关系其他指标,这样即使机器每秒抗住了很高的 qps ,但是这时候的机器已经是满负荷运行了,内存, cpu ,网络带宽等都几乎被打满,这种情况机器随时可能挂掉,这时候的测压就没有什么代表性了,因为你不可能在生产者让它达到这样的负荷

观察 CPU 的的负荷

  • Linux 下最常见的命令就是 top 命令,可以输出详细的情况,如下:

vYvm6b7.png!mobile

  • 对于上面的输出,我们详细来分析一下,首先看第一行的输出

top - 16:24:21 up 13:41, 4 users, load average: 0.11, 3.10, 3.72

  • 16:24:21 : 表示当前的时间
  • up 13:41 :表示已经运行了多长时间
  • 4 users :当前机器有几个用户在使用
  • load average: 0.11, 3.10, 3.72 :这是核心。表示 CPU 在 一分钟、五分钟、十五分钟 内的平均负载情况,简单解释一下,假设我们是一个四核的 CPU ,此时如果我们的 CPU 负载是 0.15 ,那么表示这四个核心中连一个核心都没使用满,表明整体比较空闲;如果整个负载是1,则表示四个核中有一个已经使用的比较繁忙了,但是其他三个还是比较空闲的;如果负载是4,则说明当前四个核心都处于跑满的状态,如果负载大于四,假设6,那说明四核的 CPU 被超负荷使用也无法处理完当前的任务,有很多线程与要等待 CPU 资源
  • 后面有内存的使用情况,

KiB Mem : 498684 total, 6216 free, 366620 used, 125848 buff/cache

  • 498684 total : 总的内存,差不多 490M
  • 6216 free :当前可用内存, 6M
  • 366620 used :已使用内存
  • 125848 buff/cache :用于 IO 缓冲的内存

磁盘IO检测

  • 在检测 CPU 和内存使用的同时,我们还需要检测磁盘的使用状况,包括 IO 吞吐量, IOPS 等信息
  • 主要通过 dstat 命令来查看,如果系统没有装可以通过 yum install dstat 进行安装
  • 执行 dstat -d 命令,可以看到如下:

i2y2QzR.png!mobile

上面显示的内存可以看到存储的IO吞吐量的详细数据,每秒读 19M 数据,每秒写 6521K 的数据,这个吞吐量并不是很高,一般普通的机械硬盘可以到达上百 MB 的读写量

  • 使用命令 dstat -r 来查看 IOPS 的情况,如下:

Y3YVNrA.png!mobile

如上面结果可以看到,读写分别的 IOPS 的值, 也就是说随即磁盘读取/写入每秒多少次 ,通常来说磁盘的读写每秒在两三百次是可接受的

网卡流量检测

  • 同样我们可以通过 dstat -n 来查看网卡的具体流量情况,如下:

ZRZBvur.png!mobile

可以看到上面所示,网卡每秒接收和发送的数据量。通常来说如果我们电脑是千兆网卡,那么每秒钟网卡的总流量也就在 100M 左右,甚至更低

本文由AnonyStar 发布,可转载但需声明原文出处。

欢迎关注微信公账号 :云栖简码 获取更多优质文章

更多文章关注笔者博客 : 云栖简码 i-code.online


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK