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, ...
随机推荐
- 使用kubeadm创建kubernets集群
参考: http://docs.kubernetes.org.cn/459.html https://blog.csdn.net/gui951753/article/details/833169 ...
- 2018山东省赛sequence
2018山东省赛sequence因为必须要删除一个数,所以可以计算每个数删除的代价,从而选取代价最小的进行删除如果一个数大于它前面的所有数的最小值而小于次小值,删除最小值的代价就要+1:如果一个数本身 ...
- Java开发人员必须掌握的Linux命令-学以致用(5)
================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...
- XVII Open Cup named after E.V. Pankratiev. GP of Siberia, Division 1
1. Ski race 枚举枚举倍数判断即可.时间复杂度$O(n\log m)$. #include<cstdio> #include<algorithm> using nam ...
- C++ STL常用容器浅析
首先要理解什么是容器,在C++中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对象的指针,这种对象类型就叫做容器.简单来说 容器就是包含其他类的对象们的对象,当然这种(容器) ...
- phpstorm设置篇
1.设置全局字体编码: File->settings->Editor->File Encodings 进入这个页面后,有个Global Encoding , 默认是 UTF8 ,如果 ...
- Egret--添加一个精灵事件
class Hello extends egret.DisplayObjectContainer{ //入口函数 private onAddStage(event:egret.Event){ //打开 ...
- css margin使用技巧
margin使用技巧: (1)设置元素水平居中:margin:x auto; (2)margin负值让元素位移及边框合并 水平居中:auto 代码: <!DOCTYPE html> < ...
- phantomjs 中文文档
phantomjs 中文文档 转载 入门教程:转载 http://www.cnblogs.com/front-Thinking/p/4321720.html 1.介绍 简介 PhantomJS是一 ...
- 转 InnoDB Error Handling
14.20.4 InnoDB Error Handling Error handling in InnoDB is not always the same as specified in the SQ ...