数据库压力测试

一、前言

在前面的压力测试过程中,主要关注的是对接口以及服务器硬件性能进行压力测试,评估请求接口和硬件性能对服务的影响。但是对于多数Web应用来说,整个系统的瓶颈在于数据库。

原因很简单:Web应用中的其他因素,例如网络带宽、负载均衡节点、应用服务器(包括CPU、内存、硬盘、连接数等)、缓存,都很容易通过水平的扩展(俗称加机器)来实现性能的提高。而对于MySQL,由于数据一致性的要求,无法通过增加机器来分散向数据库写数据带来的压力;虽然可以通过前置缓存(Redis等)、读写分离、分库分表来减轻压力,但是与系统其它组件的水平扩展相比,受到了太多的限制。

二、常见的数据库压测指标

数据库压力测试

与接口压测指标类似,数据库相关指标如下:

  • TPS/QPS:衡量吞吐量。
  • 响应时间:包括平均响应时间、最小响应时间、最大响应时间、时间百分比等,其中时间百分比参考意义较大,如前95%的请求的最大响应时间。。
  • 并发量:同时处理的查询请求的数量。

三、使用sysbench进行数据库压测

1、基本介绍

sysbench是跨平台的基准测试工具,支持多线程,支持多种数据库;主要包括以下几种测试:

  • cpu性能
  • 磁盘io性能
  • 调度程序性能
  • 内存分配及传输速度
  • POSIX线程性能
  • 数据库性能(OLTP基准测试)

该工具可以自动帮你在数据库里构造出来大量的数据,你想要多少数据,就自动给你构造出来多少条数据。同时还可以模拟几千个线程并发的访问数据库,模拟使用各种各样的 SQL 语句,包括模拟出来各种事务提交到你的数据库里去,甚至可以模拟出几十万的 TPS 去压测数据库。

2、安装sysbench:

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

3、基于 sysbench 构造测试表和测试数据:

  • 首先需要在自己的数据库里创建好一个测试库,我们可以取个名字叫做 test,同时创建好对应的测试账号,可以叫做 root,密码是 123456,让这个用户有权限可以访问 test。
  • 基于 sysbench 构建 20 个测试表,每个表里有 100 万条数据,接着使用 100 个并发线程去对这个数据库发起访问,连续访问 5 分钟,也就是 300 秒。命令如下:
sysbench --db-driver=mysql --time=300 --threads=100 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=test --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable prepare

4、执行测试:

(1)测试数据库的综合读写 TPS,使用的是 oltp_read_write 模式:

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

(2)测试数据库的只读性能,使用的是 oltp_read_only模式:

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

(3)测试数据库的写入性能,使用的是 oltp_write_only 模式:

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

使用上面的命令,sysbench 工具会根据你的指令构造出各种各样的 SQL 语句去更新或者查询你的 20 张测试表里的数据,同时监测出你的数据库的压测性能指标,最后完成压测之后,可以执行 cleanup 命令,清理数据。

5、压测结果分析:

按照我们上面的命令,我们是让它每隔 1 秒都会输出一次压测报告的,此时它每隔一秒会输出类似下面的一段东西:

[ 10s ] thds: 100 tps: 500 qps: 5000 (r/w/o: 3500/1000/500) lat (ms, 95%): 20 err/s: 0.00 reconn/s: 0.00
  • thds:100,这个意思就是有 100 个线程在压测
  • tps:500,这个意思就是每秒执行了 500 个事务
  • qps:5000,这个意思就是每秒可以执行 5000 个请求
  • (r/w/o: 3500/1000/500):这个意思就是说,在每秒 5000 个请求中,有 3500 个请求是读请求,1000 个请求是写请求,500 个请求是其他的请求,就是对 QPS 进行了拆解
  • lat (ms, 95%):20,这个意思就是说,95% 的请求的延迟都在 20 毫秒以下
  • err/s: 0.00 reconn/s: 0.00:这两个的意思就是说,每秒有 0 个请求是失败的,发生了 0 次网络重连

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/7706

(0)
郭靖的头像郭靖
上一篇 2023年3月21日 下午4:41
下一篇 2023年3月22日 下午4:38

相关推荐

  • root用户无法访问Mysql数据库问题的解决

    在使用Centos系统远程访问Mysql数据库的时候,系统提示报如下错误: 经过验证以下方案可以解决问题: 1.首先停止mysql服务器 2.无权限启动mysql服务 3..登录mysql 4..重新载入权限 5.. 选择系统数据库mysql 6..查询系统表user中的用户 7.向root用户赋值权限

    2023年6月20日
    1.0K00
  • MYSQL中的COLLATE是什么?

    在mysql中执行show create table <tablename>指令,可以看到一张表的建表语句,example如下: 大部分字段我们都能看懂,但是今天要讨论的是COLLATE关键字。这个值后面对应的utf8_unicode_ci是什么意思呢?面试的时候用这个题目考一考DBA,应该可以难倒一大部分人。 COLLATE是用来做什么的? 使用ph…

    2022年8月28日
    1.3K00
  • 解决远程连接MySQL报错:2003 – Can‘t connect to MySQL server on ‘X.X.X.X‘ (10060 “Unknown error“)问题

    问题先看报错: 2003 – Can’t connect to MySQL server on ‘X.X.X’ (10060 “Unknown error”)。 意思是服务器远程连接出错:未知错误。 解决方案:遇到这个问题,首先想到的是权限不够。那咱就给它赋权。 首先登录MySQL数据库:mysql -u用户名 -p密码; 然后:use mysq…

    2023年7月27日
    1.0K00
  • MySQL 如何查找删除重复行?

    如何查找重复行 第一步是定义什么样的行才是重复行。多数情况下很简单:它们某一列具有相同的值。本文采用这一定义,或许你对“重复”的定义比这复杂,你需要对sql做些修改。本文要用到的数据样本: 前面两行在day字段具有相同的值,因此如何我将他们当做重复行,这里有一查询语句可以查找。查询语句使用GROUP BY子句把具有相同字段值的行归为一组,然后计算组的大小。 …

    2023年4月25日
    75300
  • sqlserver数据库出现可疑错误修复方法

    1、主数据库出现可疑修复方法:sql 第一种方法:数据库 当数据库发生这种操做故障时,能够按以下操做步骤可处理此要领,打开数据库里的Sql查询编辑器窗口,运行如下的命令: 编辑器 ?修改数据库为紧急模式sqlserver  ALTER DATABASE 数据库名 SET EMERGENCYspa ?使数据库变为单用户模式日志  …

    2023年2月18日
    1.1K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信