记一次大促前全链路压力测试

记一次大促前全链路压力测试

基础概念

  1. 压力测试:不断地给系统施压,模拟在高并发情况下系统的响应情况,观察CPU、I/O、磁盘、内存、网络的表现,从而发现系统的瓶颈和缺陷。压力测试一般选择的是生产环境PRD,对于电商系统来说,为了避免影响用户的正常购买,一般选择凌晨进行。
  2. TPS:Transactions Per Second,每秒事务数,是衡量系统性能的重要指标。一个事务是用户发出具体事务请求到服务器返回事务执行结果的一个过程。
  3. QPS:Queries Per Second,每秒请求数,是衡量系统性能的重要指标。一个事务中可以包含多个请求。

压测前准备

  1. 关闭熔断机制:压测时服务响应势必变慢,可能出现多次失败的情况,如果开启熔断会影响整个服务
  2. 关闭缓存锁:大流量压测使用的是少量会员号多次操作的形式,如果开启缓存锁,会被拦截下来
  3. 将日志从INFO降为ERROR:压测数据不应该记录到INFO日志

监控对象

  1. MySQL、MyCat、Redis、web服务器(JBoss)的CPU、I/0、网络、内存、磁盘等指标
  2. 全链路响应时间
  3. 全链路异常数及类型
  4. Redis热点缓存

异常告警分析

  1. 90%的异常是内部RPC框架抛出的TimeOutException,是由于远程调用速率高于其他接口响应速率造成的。
  2. 6%的异常是java.util.concurrent.RejectedExecutionException,这是由于线程池压力过大,空闲队列和最大线程都被请求填满后,会调用线程池的Abort饱和策略,拒绝任务,抛出异常
  3. 此外还检测到了一个DeadLockException,数据库发生了死锁,但是由于隔离界别是RC,所以排除了Gap锁的可能性,没有定位到具体SQL,但是猜测只可能是两个SQL持有资源并循环等待,解决方法就是优化SQL——尽可能在一个事务中将可能需要操作的资源先加锁,而不是要用的时候才去请求

结果

TPS6000、QPS10000的时候,MySQL的CPU和I/0使用率都到达了50%,响应时间大概在500ms。
TPS8000的时候(每分钟50W请求),MySQL的CPU和I/0使用率都到达了70%,响应时间达到了800ms。
TPS8000的时候(每分钟50W请求),JBoss的内存使用率峰值达到了98%,说明GC策略不够优秀,应该要进行调优。

-------------本文结束感谢您的阅读-------------

本文标题:记一次大促前全链路压力测试

文章作者:DragonBaby308

发布时间:2019年07月30日 - 12:53

最后更新:2019年09月22日 - 10:14

原始链接:http://www.dragonbaby308.com/stress-test/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%