背景

  秒杀是我们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. python查询mysql数据(3)

    python查询mysql数据(3) """数据查询""" import pymysql import datetime from pymy ...

  2. buuctf@ciscn_2019_en_2

    from pwn import * context.log_level='debug' io=process('./ciscn_2019_en_2') libc=ELF('./libc.so') el ...

  3. 2019春Python程序设计练习5(0416--0422)

    6-1 6-1.使用函数求特殊a串数列和 (30 分)   给定两个均不超过9的正整数a和n,要求编写函数fn(a,n) 求a+aa+aaa++⋯+aa⋯aa(n个a)之和,fn须返回的是数列和 函数 ...

  4. luoguP1041 传染病控制 x

    P1041 传染病控制 题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染 ...

  5. 局域网 ARP 欺骗原理详解

    局域网 ARP 欺骗原理详解 ARP 欺骗是一种以 ARP 地址解析协议为基础的一种网络攻击方式, 那么什么是 ARP 地址解析协议: 首先我们要知道, 一台电脑主机要把以太网数据帧发送到同一局域网的 ...

  6. Hadoop监控指标项

    配置 修改$HADOOP_HOME/etc/hadoop/hadoop-env.sh # 在配置namenode和datanode时都会有用到JMX_OPTS的代码,是为了减少重复提取出的公共代码 e ...

  7. sqlmap自动注入 --REQUEST

    --delay=“参数” 每次http(s)请求之间的延迟时间,浮点数,单位为秒,默认无延迟 --timeout=“参数” 请求超时,浮点数,默认为30秒 --retries=“参数” http(s) ...

  8. Feature Engineering and Feature Selection

    首先,弄清楚三个相似但是不同的任务: feature extraction and feature engineering: 将原始数据转换为特征,以适合建模. feature transformat ...

  9. Maven项目解决Remove '@override' annotation终极方案

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

  10. 套接字选项 之 SO_REUSEADDR && SO_REUSEPORT

    说明 本文下面内容基本上是截取自stackoverflow,针对这两个选项,在另外一篇文章中做了总结,请移步<Linux TCP套接字选项 之 SO_REUSEADDR && S ...