mysql压测实战

Wesley13
• 阅读 635

1、安装压测工具

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

2、执行压测命令

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

命令解释:

  1. --db-driver=mysql:这个很简单,就是说他基于mysql的驱动去连接mysql数据库,你要是oracle,或者sqlserver,那 自然就是其他的数据库的驱动了
  2. --time=300:这个就是说连续访问300秒
  3. --threads=10:这个就是说用10个线程模拟并发访问
  4. --report-interval=1:这个就是说每隔1秒输出一下压测情况
  5. --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user:这一大串,就 是说连接到哪台机器的哪个端口上的MySQL库,他的用户名和密码是什么
  6. --mysql-db=test_db --tables=20 --table_size=1000000:这一串的意思,就是说在test_db这个库里,构造20个测试 表,每个测试表里构造100万条测试数据,测试表的名字会是类似于sbtest1,sbtest2这个样子的
  7. oltp_read_write:这个就是说,执行oltp数据库的读写测试
  8. --db-ps-mode=disable:这个就是禁止ps模式 最后有一个prepare,意思是参照这个命令的设置去构造出来我们需要的数据库里的数据,他会自动创建20个测试表,每个表 里创建100万条测试数据,所以这个工具是非常的方便的。

测试数据库的综合读写TPS,使用的是oltp_read_write模式(大家看命令中最后不是prepare,是run了,就是运行压测):

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

mysql压测实战

对测试输出日志进行解释[ 300s ] thds: 10 tps: 291.54 qps: 5792.65 (r/w/o: 4051.45/1158.13/583.07) lat (ms,95%): 77.19 err/s: 0.00 reconn/s: 0.00

    [300s] ,整个压测过程第三百秒

    thds:10 , 这个意思就是有10个线程在压测 

    tps:291.54,  这个意思就是每秒执行了291.54 个事务

    qps: 5792.65 ,这个意思就是每秒可以执行5792.65个请

    (r/w/o: 4051.45/1158.13/583.07)  ,这个意思就是说,在每秒5792.65个请求中,有4051.45个请求是读请求,1158.13个请 求是写请求,583.07个请求是其他的请求,就是对QPS进行了拆解 

    lat (ms,95%): 77.19 ,这个意思就是说,95%的请求的延迟都在77.19毫秒以下 

    err/s: 0.00 reconn/s: 0.00  这两个的意思就是说,每秒有0个请求是失败的,发生了0次网络重连

这个压测结果会根据每个人的机器的性能不同有很大的差距(真机 i5 9300H 1T SSD  16GB RAM,当前压测虚拟机配置 4核4GB RAM 40GB ROM配置),你要是机器性能特别高,那你可以开很多的并发线程去压测,比 如100个线程,此时可能会发现数据库每秒的TPS有上千个,如果你的机器性能很低,可能压测出来你的TPS才二三十个,QPS 才几百个,这都是有可能的。
另外在完成压测之后,最后会显示一个总的压测报告,我把解释写在下面了:

SQL statistics:
    queries performed:
        read:                            1181852           // 这就是说在300s的压测期间执行了118万多次的读请求 
        write:                           337672             // 这是说在压测期间执行了33万多次的写请求
        other:                           168836            // 这是说在压测期间执行了16万多次的其他请求 
        total:                           1688360           // 这是说一共执行了168万多次的请求
    transactions:                        84418  (281.37 per sec.)          // 这是说一共执行了8.4万多个事务,每秒执行281.37多个事务
    queries:                             1688360 (5627.36 per sec.)       // 这是说一共执行了168万多次的请求,每秒执行5600+请求 
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

//下面就是说,一共执行了300s的压测,执行了8.4万+的事务 

General statistics:
    total time:                          300.0253s
    total number of events:              84418

Latency (ms):
         min:                                    6.90                        // 请求中延迟最小的是6.9ms 
         avg:                                   35.54                      // 请求中延迟平均是35.54ms
         max:                                  287.21                    //请求中延迟最大是287.21ms
         95th percentile:                       77.19               //95%的请求延迟都在77.19ms以内
         sum:                              2999805.01                

Threads fairness:
    events (avg/stddev):           8441.8000/46.41
    execution time (avg/stddev):   299.9805/0.01

测试数据库的只读性能,使用的是oltp_read_only模式(大家看命令中的oltp_read_write已经变为oltp_read_only了):

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

测试数据库的删除性能,使用的是oltp_delete模式:

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

测试数据库的更新索引字段的性能,使用的是oltp_update_index模式:

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

测试数据库的更新非索引字段的性能,使用的是oltp_update_non_index模式

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

测试数据库的插入性能,使用的是oltp_insert模式

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

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

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.115.101 --mysql-port=3306 --mysql-user=test_user --mysql-password=123456 --mysql-db=test_db --tables=20 --table_size=1000000 oltp_write_only --db-ps-mode=disable run
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这