背景

  秒杀是我们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. JavaScript 语法——字面量,变量,操作符,语句,关键字,注释,函数,字符集

    JavaScript 是一个程序语言. 语法规则定义了语言结构. 它是一个轻量级,但功能强大的编程语言.   ㈠JavaScript 字面量 在编程语言中,一般固定值称为字面量,如 3.14. ⑴数字 ...

  2. C# 2.0

    序言 泛型 为什么需要泛型? 分部类型 分部类和方法 partial 匿名方法 使用Delegate的时候很多时候没必要使用一个普通的方法,因为这个方法只有这个Delegate会用,并且只用一次,这时 ...

  3. 51 Nod 1068 Bash游戏v3

    1068 Bash游戏 V3  题目来源: Ural 1180 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 有一堆石子共有N个.A B两个人轮流 ...

  4. 计蒜客 window画图

    在 Windows 的"画图"工具里,可以绘制各种各样的图案.可以把画图当做一个标准的二维平面,在其上先后绘制了 nn 条颜色互不相同的线段. 输出格式 输出 qq 行,每行一个整 ...

  5. 广工2017校赛-F-- tmk找三角

    http://gdutcode.sinaapp.com/problem.php?cid=1056&pid=5 Description 有一棵树,树上有只tmk.他在这棵树上生活了很久,对他的构 ...

  6. Jmeter -- 添加用户自定义变量

    步骤: 1. 添加用户自定义变量元件(线程组->配置原件->用户自定义变量) Add --> Config Element --> User Defined Variables ...

  7. [CSP-S模拟测试]:你相信引力吗(单调栈)

    题目传送门(内部题124) 输入格式 第一行一个整数$n$代表环的长度. 第二行$n$个整数表示每个冰锥的高度. 输出格式 一行一个整数表示有多少对冰锥是危险的. 样例 样例输入1: 51 2 4 5 ...

  8. [CSP-S模拟测试]:五子棋(模拟)

    题目传送门(内部题122) 输入格式 输入文件第一行为一个正整数$n$,表示双方总共下了多少步棋. 接下来$n$行,输入文件每行两个正整数.第$i$行的两个数$x,y$表示第$i$步的棋子下在了第$x ...

  9. Java并发编程的艺术笔记(五)——Java中的锁

    一.Lock接口的几个功能: 显示的获取和释放锁 尝试非阻塞的获取锁 能被中断的获取锁 超时获取锁 使用方式: Lock lock = new ReentrantLock(); lock.lock() ...

  10. Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1099 bytes) in

    解释是可用内存已耗尽,这关系到PHP的memory_limit的设置问题. 我在网上看到,有两种方法解决 1.修改php.ini memory_limit = 128 这种方法需要重启服务器,很显然, ...