写作目的
最近看到一句话是MySQL的TPS是4000,这句话是不严谨的,因为没有说服务器的配置。所以自己买了个服务器做了一个压测。希望自己对数据有一个概念。 注意:服务器不同结果不同,结果不具有普适性。
服务器配置
配置 | 参数 |
CPU | 2核 |
内存 | 4G |
MySQL | 5.7 |
Linux | 7.5 |
MySQL安装
2)docker安装MySQL
docker run --name mysql-6-20220702 -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
MySQL压测实践
压测工具的安装sysbench
执行 下载命令
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
安装
sudo yum -y install sysbench
查看版本
sysbench --version
构造测试表和数据
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable prepare
参数 | 含义 |
–db-driver=mysql | 这个很简单,就是说他基于mysql的驱动去连接mysql数据库,你要是oracle,或者sqlserver,那自然就是其他的数据库的驱动了 |
–time=300 | 这个就是说连续访问300秒 |
–threads=10 | 这个就是说用10个线程模拟并发访问 |
–report-interval=1 | 这个就是说每隔1秒输出一下压测情况 |
–mysql-host=127.0.0.1 | 这是你要连接的sql服务连接 |
–db-driver=mysql | 这个很简单,就是说他基于mysql的驱动去连接mysql数据库,你要是oracle,或者sqlserver,那自然就是其他的数据库的驱动了 |
–mysql-port=3306 | 数据端口 |
–mysql-user=test_user | 数据库用户名 |
–mysql-password=test_user | 数据库密码 |
–mysql-db=test_db | 哪个数据库进行压测,需要手动创建库 |
–tables=20 | 压测数据库创建多少张表 |
–table_size=1000000 | 压测数据库每张表插入多少数据 |
oltp_read_write | 执行oltp数据库的读写测试 |
–db-ps-mode=disable | 禁止ps模式(不知道干嘛的) |
prepare | 参照这个命令的设置去构造出来我们需要的数据库里的数据,他会自动创建20个测试表,每个表里创建100万条测试数据 |
执行上面命令完毕后数据库中会有这样的命令
压测结果解读DEMO
从10个线程开始压,压10秒,同时读写操作
sysbench --db-driver=mysql --time=10 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable run
[ 1s ] thds: 10 tps: 131.73 qps: 2668.44 (r/w/o: 1868.11/526.90/273.43) lat (ms,95%): 99.33 err/s: 0.00 reconn/s: 0.00
参数 | 含义 |
thds: 10 | 有10个线程在压测 |
tps: 131.73 | 每秒执行了131.73个事务 |
qps: 2668.44 | 每秒可以执行2668.44个请求 |
(r/w/o: 1868.11/526.90/273.43) | 在每秒2668.44个请求中,有1868.11个请求是读请求,526.90个请求是写请求,273.43个请求是其他的请求,就是对QPS进行了拆解l |
at (ms,95%): 99.33 err/s | 95%的请求的延迟都在 99.33毫秒以下 |
0.00 reconn/s: 0.00 | ,每秒有0个请求是失败的,发生了0次网络重连 |
SQL statistics: queries performed: read: 11438// 这就是说在10s的压测期间执行了11438次的读请求 write: 3268// 这是说在压测期间执行了3268次的写请求 other: 1634// 这是说在压测期间执行了1634次的其他请求 total: 16340// 这是说一共执行了16340次的请求 transactions: 817( 75.2 per sec. ) // 这是说一共执行了817个事务,每秒执行75.2个事务 queries: 16340( 1503.92 per sec. )// 这是说一共执行了16340次的请求,每秒执行1503.92 请求 ignored errors: 0 (0.00 per sec.) reconnects: 0 (0.00 per sec.)
General staticstics: total time: 10.0052s //一共执行了10s的压测 total number of events: 817 //一共执行了817个事务
Latency (ms): min: 13.21 // 请求中延迟最小的是13.21 ms avg: 132.31 // 所有请求平均延迟是132.31 ms max: 4675.90 // 延迟最大的请求是4675.90 ms 95th percentile: 287.38 // 95%的请求延迟都在287ms以内 sum: 108097.91 //总共耗时108097.91 ms
增压结果对比
从10个线程发压,一直看到QPS和RT有明显波动时停止
线程数 | QPS | TPS | RT(95%) |
10 | 3813 | 191 | 170ms |
20 | 3506 | 175 | 215ms |
30 | 4312 | 215 | 272ms |
40 | 3802 | 190 | 427ms |
50 | 3386 | 169 | 1304ms |
从上面表格中可以看出,在我这个服务器2核4G内存下MySQL的QPS峰值是4300,TPS为215,RT为300ms。