在Linux环境下测试一下数据库以及缓存在优化前后的负载情况,总结一下过程。
压测工具:JMETE
运行环境
本来想在虚拟机上运行java程序以及数据库,不过压测下虚拟机承载不了太高的并发,硬件有限,只能将java应用运行在Windows系统上,而MySQL、redis、rabbitmq运行在虚拟机上,由于优化主要在数据库这方面,在Linux下用top命令观察CPU负载和程序占用资源来测试优化效果。
程序运行环境:
Windows(一个双核CPU、8G运存):主程序
虚拟机Linux(一个双核CPU、2G内存):MySQL、Redis、RabbitMQ
JMete压力测试
准备工作:
- JMete配置
- 设计方法生成5000个测试用户(更加接近真实场景)
- 将不同优化方法的测试程序jar包都上传到Linux运行并分别测试
测试模块:
- 秒杀的过程
1、检验用户是否登陆以及有效性(token)
2、是否还有库存、是否出现重复秒杀(查询)
3、生成订单(插入)
测试数据:
-
模拟用户 5000 个(一个储存5000个用户及token的数据文件放到Jmete中进行测试)
-
1000个线程并发访问循环10次
-
秒杀商品种类1种、库存为50个
压力测试1:
应用样本:除了用户访问的token进行了缓存,其他数据都没有进行缓存,查询库存与订单表和下订单操作都是直接访问底层MySQL数据库,没有对超卖进行优化操作。
结果:吞吐量199.7/s、负载超标
吞吐量199.7
出现了超卖情况…
压力测试2
应用样本:对token缓存、对已下订单缓存,查询库存和下订单操作直接访问数据库,加入防超卖优化。
结果:吞吐量325.6/s、负载超标
从top命令中可以看到,系统负载上升到了2.55,我的虚拟环境是一个双核CPU,这样的负载已经超标了,而且MySQL虽然占用资源比Redis笑了,但占用资源依然不小
吞吐量达到了325.6/s,比上次提高了
这次没有出现超卖情况
压力测试3
应用样本:对token缓存,对已下订单缓存、对库存缓存、对数据库下订单操作使用RabbitMQ消息队列进行消峰,有防超卖优化
结果:吞吐量832.6/s、负载没超标
MySQL占用资源比之前小了很多,负载也降到1以下了
吞吐量有明显提高,达到了832.6/s
同样没有出现超卖情况
总结:
由于机器性能有限,可能测试效果不是很准确和明显,但在测试的过程也能看出优化效果,且整个测试过程中让我发现了一些隐藏的问题并及时解决了(减库存和下订单过程不同步)。
实验结果方面:在直接访问MySQL的情况下,吞吐量和CPU负载都不太理想,将某些数据缓存后吞吐量上去了一些,但CPU负载依然很高,将数据全部缓存并用消息队列中间件消峰后,吞吐量增长很多且负载降下来了许多,整个系统更加稳定。