背景

  秒杀是我们ServiceComb开源团队以领域驱动设计(DDD)为背景,从零开始构建一个微服务架构的示例项目;在《秒杀开发历程》系列博文中提到它作为一个高并发压力场景的应用,采用了CQRS模式构建,因此我们将使用JMeter来对其进行性能评估。

制定用户行为模型

  因为秒杀的场景在现实生活中非常常见,所以用户行为模型非常容易设计:

  1. 客户不停的刷秒杀活动,直到刷出一个正在进行的秒杀活动;
  2. 刷出了秒杀活动后,马上请求秒杀优惠券;
  3. 无论是否成功,客户会稍后查询一次自己已经拥有的优惠券确定优惠券是否进入自己的账号。

  我们还需要一个管理员用户,隔一段时间就创建发布秒杀活动,当然活动包含的优惠券数量将会远少于客户的数量。      用户行为模型在JMeter中体现为脚本逻辑,完成的脚本逻辑如下:

  脚本文件已经托管至秒杀项目中,可直接获取:

git clone https://github.com/ServiceComb/seckill
cd seckill/performance-test/script

性能测试环境

  我们调来了两台云服务器进行性能测试,角色和配置如下:

秒杀服务器配置

  承载秒杀示例所有的微服务和中间件,包括四个微服务(Admin、Command、Event和Query)、两个数据库(ReadDB和WriteDB)和一个Message Broker(ActiveMQ)。

配置项 配置值
CPU Intel Xeon E5-2690 3.0GHz * 16
MEM 64GB
OS Ubuntu 16.04.2 LTS

  为了能够便于配置和启动示例系统,我们采用《秒杀开发历程(三)》中的一键启动模式拉起所有的服务,因此Docker升级为当前最新版17.06.2-ce,能够支持配置Container使用CPU和内存的大小限制,以Admin微服务为例:   

  admin-service:
mem_limit: 4096m
cpu_count: 4
cpu_percent: 50
image: "seckill-admin-service:0.2.0-SNAPSHOT"
hostname: admin-service
links:
- "mysql-write-db:write_db.servicecomb.io"
environment:
- JAVA_OPTS=-Dspring.profiles.active=prd -Dendpoints.shutdown.enabled=true
ports:
- "8081:8081"

加压机配置

  加压机与秒杀服务器处于同一网络环境中,配置如下:    | 配置项 | 配置值 | | —- | —————————— | | CPU | Intel Xeon E5-2690 3.0GHz * 16 | | MEM | 32GB | | OS | Ubuntu 16.04.2 LTS |

启动测试

  我们设定测试场景为200客户,每隔1秒启动一个新客户;1个管理员每隔10秒发布1个秒杀活动,一共发布160次,每个秒杀活动包含50张优惠券,即一共投放8000张优惠券。整个测试持续半个小时。      现在,我们切换到性能测试脚本目录下,执行下面的命令启动测试:   

jmeter -n -t seckill.jmx -l log.jtl

测试结果

  测试完毕后通过下面的命令分析测试结果日志数据,请将替换为你的本地目录:

jmeter -g log.jtl -o <report folder>

  我们需要先验证测试结果的正确性,查看数据统计图:

  其中秒杀的失败率在96.45%,原因是Query对于活动的秒杀活动采用的是0.5秒刷新缓存的策略,在活动中的优惠券被秒杀一空下架前,短暂的时间内仍然能够查询到这个活动;架构中采用的CQRS模式只能保证最终一致性,并不能保证实时一致性。      成功秒杀的次数为225264 - 217264 = 8000,正好等于我们设定的优惠券投放量,其他事务的失败率均为0%,因此测试结果正确。

吞吐能力

  秒杀整体吞吐能力如下图:

  可以看到查询活跃的秒杀活动(刷券)事务处理量最高,稳定在4000左右,其他因为业务比例的原因较低,去掉查询活跃的秒杀活动事务后如下图:

  秒杀和优惠券查询之间的差值是由于存在秒杀失败造成的,我们的用户行为模型是无论秒杀成功与否都会进行一次优惠券查询。

响应时间

  事务的响应时间我们可以看下面两个图:

  75%的事务处理时间都在10ms以下,整体平均响应时间处于50ms以下。

瓶颈分析

  依据执行过程中对于测试资源的观察,加压机CPU使用率基本已满(200线程并发),服务器CPU使用率低于20%,其他资源使用率很低。

总结

  通过这次性能测试,我们得知秒杀示例在使用一台普通服务器配置能够达到总体5000以上的TPS还能够保持较低的资源使用率,表现出良好的性能;未来我们会将秒杀示例部署在K8S群集中并配置弹性伸缩进行压力测试,您可以阅读我们《在Kubernetes集群中使用JMeter对Company示例进行压力测试》这篇文章展望。

出处:https://servicecomb.incubator.apache.org/cn/docs/performance-test-on-seckill-with-jmeter/

(转)使用JMeter对秒杀示例进行性能测试的更多相关文章

  1. 性能测试--Jmeter之wordpress示例

    Jmeter之wordpress示例 WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理 ...

  2. Jmeter初步使用二--使用jmeter做一个简单的性能测试

    经过上一次的初步使用,我们懂得了Jmeter的安装与初步使用的方法.现在,我们使用Jmeter做一个简单的性能测试.该次测试,提交的参数不做参数化处理,Jmeter各元件使用将在介绍在下一博文开始介绍 ...

  3. JMeter之Http协议接口性能测试

    一.不同角色眼中的接口 1.1,开发人员眼中的接口    1.2,测试人员眼中的接口 二.Http协议基本介绍 2.1,常见的接口协议 1.:2. :3. :4.:5.: 6. 2.2,Http协议栈 ...

  4. 基于Jmeter跟Jenkins的自动化性能测试的一站式解决方案(转)

    www.MyException.Cn  网友分享于:2015-08-26  浏览:0次   基于Jmeter和Jenkins的自动化性能测试的一站式解决方案 作者: Yu, Qingguo Shen, ...

  5. Jmeter+maven+Jenkins构建云性能测试平台(mark 推荐)

    转自:http://www.cnblogs.com/victorcai0922/archive/2012/06/20/2555502.html Jmeter+maven+Jenkins构建云性能测试平 ...

  6. Jmeter接口测试图文示例

    Jmeter接口测试图文示例 以getObjectByCode接口为例,用jmeter2.13来进行接口测试. 测试前准备: 测试工具及版本:jmeter 2.13 r1665067(须包含__MD5 ...

  7. 【JMeter4.0学习(二)】之搭建openLDAP在windows8.1上的安装配置以及JMeter对LDAP服务器的性能测试脚本开发

    目录: 概述 安装测试环境 安装过程 配置启动 配置搭建OpenLDAP 给数据库添加数据 测试查询刚刚插入的数据 客户端介绍 JMeter建立一个扩展LDAP服务器的性能测试脚本开发 附:LDAP学 ...

  8. (转)在Kubernetes集群中使用JMeter对Company示例进行压力测试

    背景 压力测试是评估应用性能的一种有效手段.此外,越来越多的应用被拆分为多个微服务而每个微服务的性能不一,有的微服务是计算密集型,有的是IO密集型. 因此,压力测试在基于微服务架构的网络应用中扮演着越 ...

  9. 如何使用jmeter做一个功能的性能测试

    一.为什么又再次写类似的文章? 在博客园和公号写文章,已经快两年了,所以自然在公号和博客园都能联系到我的. 也就是几天前,有个人加我微信,对于总有人加我好友,我已经觉得不奇怪了,为什么呢? 加我好友的 ...

随机推荐

  1. Centos 7误删Yum,如何补救???

    1. 查看centos 的版本号 cat /etc/redhat-release 2. 进入阿里云源站地址:http://mirrors.aliyun.com/  找到对应的版本号 3.下载相应的yu ...

  2. Vue.use() 方法

    1.本人在学习Vue时,会用到 Vue.use() .例如:Vue.use(VueRouter).Vue.use(MintUI).但是用 axios时,就不需要用 Vue.use(axios),就能直 ...

  3. python生成二维码图片

    依赖Pillow库. import qrcode # 简单用法 img = qrcode.make('Hello World!') img.save('qr_code.png') # 高级用法 qr ...

  4. 【Winform-ComboBox】实现ComboBox下拉框与数据库的绑定

    实现效果如下: 1.设计窗体 下拉框的名称cmbName 2.连接数据库 DBHelper类代码: class DBHelper { /// <summary> /// 创建静态连接字符串 ...

  5. 21.django中间件源码阅读

    回顾: 关于里面的源码流程大家可以全看视频,因为代码的跳动性很大,而且会多次调用通过一方法,所以关于中间源码的部分去找个视频看一看,我写的不是很清楚. # 1 cookie session # 2 f ...

  6. LA 2797

    题目链接 题意:训练指南283页: #include <iostream> #include <cstdio> #include <cstring> #includ ...

  7. LA 3263 好看的一笔画 欧拉几何+计算几何模板

    题意:训练指南260 #include <cstdio> #include <cstring> #include <algorithm> #include < ...

  8. MergeActors技巧

    打开界面 MergeActors的界面在Window>DeveloperTools>MergeActors 启用合并材质的方法 使用Use specific LOD Level 一种特殊情 ...

  9. HDU4587--TWO NODES(无向图割点,暴力出奇迹)这是我见过的时间最长的题。。。

    TWO NODES Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  10. SpringMVC配置多个自定义拦截器

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...