一、压测环境
在构造测试数据前,先确定服务器的内核,以便构造数据的时候不要无脑构造~~~
本次压测的服务器为32核64G的liunx客户机,将根据CPU、内存、磁盘IO、网络宽带等因素去测试该机器到底可以抗每秒几千甚至每秒几万的并发请求。
(如何看测试机多少核?
查看物理CPU的个数 #cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
查看逻辑CPU的个数 #cat /proc/cpuinfo |grep "processor"|wc -l
查看CPU是几核 #cat /proc/cpuinfo |grep "cores"|uniq
)
解析:有俩个物理cpu,每个物理cpu有16核,64=逻辑cpu的个数。
说白了就是你这个cpu给用户看来,他相当于多少个独立的运算单元。
二、压测工具
sysbench ,具体安装见 压测数据库1 文章
三、基于sysbench构造测试表和测试数据
进入执行sysbench命令需要在安装的目录下执行 /usr/bin/sysbench-1.0.20/src/lua$,不然可能报错找不到路径;
1.构造测试表
`sysbench /usr/share/sysbench/oltp_common.lua --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.100.122 --mysql-port=3306 --mysql-user=root --mysql-password=你的服务器密码 --mysql-db=sca1.6 --tables=20 --table_size=1000000 --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 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user: 这一大串,是说连接到哪台机器的哪个端口上的MySQL库,它的用户名和密码是什么
–mysql-db=test_db --tables=20 --table_size=1000000:这一串的意思,是说在test_db这个库里,构造20个测试表,每个测试表里构造100万条测试数据,测试表的名字会是类似于sbtest1,sbtest2这个样子的
–db-ps-mode=disable:这个就是禁止ps模式
最后的 prepare:意思是参照这个命令的设置去构造出来我们需要的数据库里的数据,它会自动创建20个测试表,每个表里创建100万条数据。
我们压测的时候,基于这个这个服务器是32核64G,可以构造数据 100w 300w 500w 700w 100w往上压
2.压测读写数据库的TPS
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.100.122 --mysql-port=3306 --mysql-user=root --mysql-password=xxxx --mysql-db=sca1.6 --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable run >> ./mysysbench_write.log
解析:oltp_read_write:综合读写(如果测试时间过短,测读写最容易模仿人的真实操作)
prepare换成run: 执行操作 >> ./mysysbench_write.log:输出日志到这个log
》》输出日志报告解析**:
[ 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 次网络重连
SQL statistics:
queries performed:
read: 0 // 这是说在压测期间没有执行过读请求
write: 138128 // 这是说在压测期间执行了13万多次的写请求
other: 69064 // 这是说在压测期间执行了6万多次的其他请求
total: 207192 // 这是说一共执行了20万多次的请求
transactions: 34532 (115.09 per sec.) // 这是说一共执行了3万多个事务,每秒执行115多个事务
queries: 207192 (690.53 per sec.) // 这是说一共执行了20万多次的请求,每秒执行690+请求
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
// 下面是说,一共执行了300s的压测,执行了3万+的事务
General statistics:
total time: 300.0446s
total number of events: 34532
Latency (ms):
min: 0.63 // 请求中延迟最小的是0.63ms
avg: 86.88 // 所有请求平均延迟是86.88ms
max: 2699.73 // 延迟最大的请求是2699.73ms
95th percentile: 325.98 // 95%的请求延迟都在325.98ms以内
sum: 3000118.57 // 总的延迟耗时
Threads fairness:
events (avg/stddev): 3453.2000/83.49
execution time (avg/stddev): 300.0119/0.02
3.测试数据库的只读性能
sysbench oltp_read_only.lua --db-driver=mysql --time=600 --threads=30 --report-interval=1 --mysql-host=192.168.100.122 --mysql-port=3306 --mysql-user=root --mysql-password=xxx --mysql-db=sca1.6 --tables=20 --table_size=5000000 --db-ps-mode=disable run >> ./mysysbench_write2.log
解析:oltp_read_only.lua 只读操作
4.测试数据库的删除性能
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.100.249 --mysql-port=3306 --mysql-user=root --mysql-password=xxxx --mysql-db=sca1.6 --tables=20 --table_size=1000000 oltp_delete --db-ps-mode=disable run
解析: oltp_delete 只删除
5.测试数据库的更新索引字段的性能
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.100.249 --mysql-port=3306 --mysql-user=root --mysql-password=sectrend@xyc --mysql-db=sca1.6_lny --tables=20 --table_size=20000 oltp_update_index --db-ps-mode=disable run
6.测试数据库的更新非索引字段的性能
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.100.249 --mysql-port=3306 --mysql-user=root --mysql-password=xxx --mysql-db=sca1.6 --tables=20 --table_size=1000000 oltp_update_non_index --db-ps-mode=disable run
**7.测试数据库的插入性能
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.100.249 --mysql-port=3306 --mysql-user=root --mysql-password=xxx --tables=20 --table_size=1000000 oltp_insert --db-ps-mode=disable run
8.清理数据
1.sysbench /usr/share/sysbench/oltp_common.lua --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.100.122 --mysql-port=3306 --mysql-user=root --mysql-password=xxxx --mysql-db=sca1.6 --tables=20 --table_size=1000000 --db-ps-mode=disable cleanup
每次构造一遍测试表的数据,用完都要清理数据
四、压测过程中的机器性能观察指标:
1.cpu的指标
超负荷的运转,不能继续提高线程的数量和增加数据库的QPS,合理范围平均负载值<=2
测试数据运行中使用 top 命令查看
top - 03:40:04 up 62 days(机器已经运行了多长时间), 1:27, 4 users(当前有4个用户在使用), load average: 0.13, 0.09, 0.09(CPU在1分钟、5分钟、15分钟内的负载情况)
- 内存的指标
内存的使用率最多在70%-80%
测试数据运行中使用 top命令查看
KiB Mem : 26375305+total当前机器总内存的内存使用情况, 17388044 free已经使用情况, 4010260 used空闲情况, 24235475+buff/cache用作OS内核的缓冲区
KiB Mem : 26375305+total当前机器总内存的内存使用情况, 17388044 free已经使用情况, 4010260 used空闲情况, 24235475+buff/cache用作OS内核的缓冲区
3.磁盘io的指标
观察IO吞吐量和IOPS读写速度;
IO要做到一般情况下每秒钟上200MB的读写数据量
IOPS每秒达200-300次,不能往上加线程数,反之读写速度太低,也会导致内存里的脏数据刷回磁盘的效率不高;
4.网卡的流量指标
千兆网卡每秒总流量在100mb左右
五、压测目的
把数据库的QPS提高到最大,找到数据库压测的时候最合理的一个极限QPS值。