locust壓測rpc協議

這裏主要是google的grpc接口進行壓測的一個栗子。html

Locust是以HTTP爲主要目標構建的。web

可是,經過編寫鉤子觸發器request_success和 request_failure事件的自定義客戶端,能夠輕鬆擴展到任何基於請求/響應的系統的負載測試 。api

咱們知道locust默認內部只封裝httplocust;使用的是requests中的session進行了封裝;websocket

那麼問題來了,若是我想測試其它協議怎麼辦,好比websocket  , grpc等等。session

 

以grpc爲例:socket

 

在開始以前,須要瞭解的幾點:性能

1>self.client: locust協議入口實例,咱們只要重寫一個實例給client便可。測試

2>如下兩個鉤子事件,用來收集報告信息,不然寫好後執行你會發現收集不到性能數據ui

events.request_failure.fire()
events.request_success.fire()

 

具體步驟:google

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 = '50073'

    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
相關文章
相關標籤/搜索