locust压测rpc协议
这里主要是google的grpc接口进行压测的一个栗子。
Locust是以HTTP为主要目标构建的。
但是,通过编写钩子触发器request_success
和 request_failure
事件的自定义客户端,可以轻松扩展到任何基于请求/响应的系统的负载测试 。
我们知道locust默认内部只封装httplocust;使用的是requests中的session进行了封装;
那么问题来了,如果我想测试其它协议怎么办,比如websocket , grpc等等。
以grpc为例:
在开始之前,需要了解的几点:
1>self.client: locust协议入口实例,我们只要重写一个实例给client即可。
2>以下两个钩子事件,用来收集报告信息,否则写好后执行你会发现收集不到性能数据
events.request_failure.fire()
events.request_success.fire()
具体步骤:
1>编写GrpcClient类(主要用来替换掉self.client的http实例)
import time
import grpc
from grpctest.snowid import snowid_pb2,snowid_pb2_grpc
from locust import (TaskSet,task,events,Locust)
from gevent._semaphore import Semaphore all_locusts_spawned = Semaphore()
all_locusts_spawned.acquire() def on_hatch_complete(**kwargs):
all_locusts_spawned.release() events.hatch_complete += on_hatch_complete class GrpcClient(object):
"""重写self.client"""
def __init__(self):
self.ht = '172.17.31.220'
self.pt = '' def connect(self):
"""grpc实例"""try:
#记录开始时间
start_time = int(time.time()) #创建链接
self.conn = grpc.insecure_channel(self.ht +':'+self.pt)
self.cl = snowid_pb2_grpc.snowidStub(channel=self.conn)
#参数实例
args = snowid_pb2.GenerateSnowidRequest()
args.uniqId = 10000 #此参数现在未起作用,可以为任意数字 #调用
res = self.cl.generateSnowid(args)
total_time = int((time.time() - start_time) * 1000)
if res.errCode != 0:
raise Exception
events.request_success.fire(
request_type='grpc',
name=r'/generateSnowid',
response_time=total_time,
response_length=0
)
except Exception as e:
total_time = int((time.time() - start_time) * 1000)
events.request_failure.fire(
request_type='grpc',
name='/generateSnowid',
response_time=total_time,
exception=e
) return res
注意:该类中定义了,grpc的常用调用操作;最主要是events.request_failure.fire和events.request_success.fire这两个用来收集性能数据,如果不写
报告收集不到性能数据。
上边代码只是以grpc举例,其它协议也一样,只要注意收集性能数据就可以。当然也可以不写在这里。这个看代码怎么写了。
2>重写一个HttpLocust类,我们这里叫做GrpcLocust类
class GrpcLocust(Locust):
def __init__(self, *args, **kwargs):
super(GrpcLocust, self).__init__(*args, **kwargs)
self.client = GrpcClient()
注意:GrpcLocust从Locust继承; 这里主要是将self.client重新实例成,我们第一部写好的GrpcClient实例。
这样一来我们通过self.client.xxxx就可以使用其方法
3>编写TaskSet类
class GrpcTask(TaskSet):
"""压测任务"""
def on_start():
all_locusts_spawned.wait()
@task
def generateSnowid(self):
#grpc接口响应数据
res = self.client.connect()
# print('errCode:{}'.format(res.errCode))
# print('result:{}'.format(res.result))
# print('errMsg:{}'.format(res.errMsg))
注意:
此类就是任务类,跟http的写法一样,只是这里用的self.client.xxxx已经变成了我们自已重写的Grpc类,将原来的requests http替换了。
另外在TaskSet类中可以定义def on_start():方法来定义,执行压测任务,最先执行的方法。这个是重写taskset中的on_start方法。
4>编写站点类
class WebsiteUser(GrpcLocust):
task_set = GrpcTask
min_wait = 5000
max_wait = 9000
注意:站点类从第二步中的locust继承
到这里代码编写完成,直接到cmd命令行执行
locust -f supperdiancan.py --no-web -c 10 -r 3 --run-time 10s
参数:
-f locust_file.py文件(locust任务文件)
-c 指定要生成的Locust用户数
-r 每秒生成的用户数
-n 用于0.8用于-n
指定请求数
--run-time 或-t 指定测试的运行时间
注意:以上是以非web执行,当然你也可以用web执行。
以下是结果,从上可以看到,已经收集到了,请求数据。
Name # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------------
grpc /generateSnowid 22559 0(0.00%) 484 0 1007 | 480 673.60
--------------------------------------------------------------------------------------------------------------------------------------------
Total 22559 0(0.00%) 673.60 Percentage of the requests completed within given times
Name # reqs 50% 66% 75% 80% 90% 95% 98% 99% 100%
--------------------------------------------------------------------------------------------------------------------------------------------
grpc /generateSnowid 22559 480 640 740 790 890 950 980 990 1000
--------------------------------------------------------------------------------------------------------------------------------------------
Total 22559 480 640 740 790 890 950 980 990 1000
locust压测rpc协议的更多相关文章
- locust压测websocket协议
Locust是以HTTP为主要目标构建的. 但是,通过编写触发器request_success和 request_failure事件的自定义客户端,可以轻松扩展到任何基于请求/响应的系统的负载测试 . ...
- Locust压测结果准确性验证
最近闲着没事做,就重新研究了一下基于python语言的Locust性能测试框架 发现在压测的过程中,虽然设置了100并发,但是通过实际监控,完全看不到100并发压测的效果 通过代码AOP日志监控接口的 ...
- python设置socket的超时时间(可能使用locust压测千级并发的时候要用到,先记录在此)
在使用urllib或者urllib2时,有可能会等半天资源都下载不下来,可以通过设置socket的超时时间,来控制下载内容时的等待时间. 如下python代码 import socket timeou ...
- jmeter压测tcp协议接口:java.net.SocketException: Software caused connection abort: socket write error
tcp接口,试压过程中,部分请求报如下错误: java.net.SocketException: Software caused connection abort: socket write erro ...
- 软件性能测试分析与调优实践之路-JMeter对RPC服务的性能压测分析与调优-手稿节选
一.JMeter 如何通过自定义Sample来压测RPC服务 RPC(Remote Procedure Call)俗称远程过程调用,是常用的一种高效的服务调用方式,也是性能压测时经常遇到的一种服务调用 ...
- 分布式压测系列之Jmeter4.0第一季
1)Jmeter4.0介绍 jmeter是个纯java编写的开源压测工具,apache旗下的开源软件,一开始是设计为web测试的软件,由于发展迅猛,现在可以压测许多协议比如:http.https.so ...
- locust接口压测
前言: locust是完全基于python,是一个简单易用的分布式负载测试工具 Locust特性 使用Python编写模拟用户行为的代码,无需繁琐的配置 分布式可扩展,能够支持上百万用户 自带Web界 ...
- 性能工具之Jmeter压测Hprose RPC服务
概述 Hprose(High Performance Remote Object Service Engine),国人开发的一个远程方法调用的开源框架.它是一个先进的轻量级的跨语言跨平台面向对象的高性 ...
- 性能工具之Jmeter压测Thrift RPC服务
概述 Thrift是一个可互操作和可伸缩服务的框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, ...
随机推荐
- entityframework单例模式泛型用法
public class yms_Entity<T> where T :DbContext { private static T _instance; public static read ...
- Mapreduce中maptask过程详解
一.Maptask并行度与决定机制 1.一个job任务的map阶段的并行度默认是由该任务的大小决定的: 2.一个split切分分配一个maprask来并行处理: 3.默认情况下,split切分的大小等 ...
- F#周报2019年第11期
新闻 Bolero:WebAssembly中的F# 尝试WebAssembly里的F# JetBrains的fsharp-support 2019.1 ML.NET 0.11发布 Outreachy内 ...
- [Python]Python中的浅复制与深复制
看python的文档,发现list有copy方法,描述说效果同a[:]. 感觉有点惊讶,之前一直以为a[:]执行的是深复制. test了一下,发现确实如果a中存在可变对象,如list/set/dict ...
- 4 Values whose Sum is 0 [POJ2785] [折半搜索]
题意 给你长度为n四个数列,每个数列选一个数使总和为4,有多少种选法(不同选法仅当起码有一个元素的下标不同) 输入 第一行,n 下面n行,每行四个数,代表ai,bi,ci,di 输出 选法数量 样例输 ...
- PYQT窗口可视化编程
1.用PYQT的Qt设计师设计完程序UI后,将其转换为UI.py脚本. 转换步骤见帖:http://www.cnblogs.com/doudongchun/p/3694765.html 2.在同目录下 ...
- 认识vim 编辑器
vim编辑器 vim编辑器的重点是光标的移动,模式切换,删除,查找,替换,复制,撤销命令的使用. vim 有三种模式: 命令模式,编辑模式,末行模式 vim打开方式: 语法: vim 文件路径 vim ...
- Ubuntu 安装 Redis和phpredis扩展
服务器Ubuntu16.04 环境php7.0+Apache /****************************开始安装Redis****************************/ 1 ...
- Spring Boot @EnableWebMvc 与 mvc 配置
注意: 1.小心使用 @EnableWebMvc 注解 根据官方文档,尽量不要使用 @EnableWebMvc 注解,因为它会关闭默认配置. ① 你希望关闭默认配置,自己完全重新实现一个 @Enab ...
- PHP 可以获取客户端哪些访问信息---来自网页转载
php是一种弱类型的程序语言,但是最web的 在程序语言中有系统全局函数: $_SERVER <?php echo "".$_SERVER['PHP_SELF'];#当前正在 ...