这里主要是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协议的更多相关文章

  1. locust压测websocket协议

    Locust是以HTTP为主要目标构建的. 但是,通过编写触发器request_success和 request_failure事件的自定义客户端,可以轻松扩展到任何基于请求/响应的系统的负载测试 . ...

  2. Locust压测结果准确性验证

    最近闲着没事做,就重新研究了一下基于python语言的Locust性能测试框架 发现在压测的过程中,虽然设置了100并发,但是通过实际监控,完全看不到100并发压测的效果 通过代码AOP日志监控接口的 ...

  3. python设置socket的超时时间(可能使用locust压测千级并发的时候要用到,先记录在此)

    在使用urllib或者urllib2时,有可能会等半天资源都下载不下来,可以通过设置socket的超时时间,来控制下载内容时的等待时间. 如下python代码 import socket timeou ...

  4. jmeter压测tcp协议接口:java.net.SocketException: Software caused connection abort: socket write error

    tcp接口,试压过程中,部分请求报如下错误: java.net.SocketException: Software caused connection abort: socket write erro ...

  5. 软件性能测试分析与调优实践之路-JMeter对RPC服务的性能压测分析与调优-手稿节选

    一.JMeter 如何通过自定义Sample来压测RPC服务 RPC(Remote Procedure Call)俗称远程过程调用,是常用的一种高效的服务调用方式,也是性能压测时经常遇到的一种服务调用 ...

  6. 分布式压测系列之Jmeter4.0第一季

    1)Jmeter4.0介绍 jmeter是个纯java编写的开源压测工具,apache旗下的开源软件,一开始是设计为web测试的软件,由于发展迅猛,现在可以压测许多协议比如:http.https.so ...

  7. locust接口压测

    前言: locust是完全基于python,是一个简单易用的分布式负载测试工具 Locust特性 使用Python编写模拟用户行为的代码,无需繁琐的配置 分布式可扩展,能够支持上百万用户 自带Web界 ...

  8. 性能工具之Jmeter压测Hprose RPC服务

    概述 Hprose(High Performance Remote Object Service Engine),国人开发的一个远程方法调用的开源框架.它是一个先进的轻量级的跨语言跨平台面向对象的高性 ...

  9. 性能工具之Jmeter压测Thrift RPC服务

    概述 Thrift是一个可互操作和可伸缩服务的框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, ...

随机推荐

  1. C#使用FileSystemWatcher控件实现的文件监控功能示例

    本文实例讲述了C#使用FileSystemWatcher控件实现的文件监控功能.分享给大家供大家参考,具体如下: FileSystemWatcher 可以使用FileSystemWatcher组件监视 ...

  2. express 遇到问题 - Error: Can't set headers after they are sent

    在node配合mongodb,链接数据库,查询所有数据2步操作,都有响应数据返回是会出现 Error: Can't set headers after they are sent,的报错 故障原因:引 ...

  3. 为什么很多应用都安装在/usr/local目录下?

    首先,Linux的官方文档FHS对该目录的说明:http://www.linuxbase.org/betaspecs/fhs/fhs/ch04s09.html The /usr/local hiera ...

  4. centos中安装配置nginx完成之后主机无法访问

    原因 VMware中安装centos7,安装配置完成nginx后,主机无法访问.虚拟机没有放行Nginx默认端口80. 解决办法 首先:开启 web 端口 firewall-cmd --permane ...

  5. 【C++ 实验六 继承与派生】

    实验内容 1. 某计算机硬件系统,为了实现特定的功能,在某个子模块设计了 ABC 三款芯片用于 数字计算.各个芯片的计算功能如下: A 芯片:计算两位整数的加法(m+n).计算两位整数的减法(m-n) ...

  6. 双向数据绑定原生js

    let data = {} const input = document.getElementsByClassName('input')[0]; Object.defineProperty(data, ...

  7. Python基础 之for循环嵌套实例

    一.在控制台中输出以下字符样式: """ *****                       *****                       *****&qu ...

  8. 不让浏览器缓存index.html

    参考文档:https://www.2cto.com/ask/question/4598 location = /index.html { add_header Cache-Control " ...

  9. @ConfigurationProperties注解取消location属性

    当我正在自学如何自定义properties配置文件,为了防止不必要的麻烦,重新创建了一个新的properties文件 fu.properties 然后在自定义的配置类中引入fu.properties/ ...

  10. checkPathValidity 检查所有agent的corridor的m_path是否有效

    在checkPathValidity(检查所有agent的corridor的m_path是否有效) 如果是无效的要进行重新设置并且设置replan 首先获得第一个polygon,m_path[0] 这 ...