利用locust进行压测,检验一下之前搭建的性能监控平台
不写一行代码,搭建性能监控平台:https://www.cnblogs.com/fccyccf/articles/13161975.html
小试牛刀:
本次压测对象:
t3-要素服务(要素服务是为了为各个系统提供原被告要素表的系统,主要流程就是填写原被告要素表,同步至各系统)
服务器:xxx.xx.xx.xx(服务器资源不足,这里只是为了试验一下,得记录一下服务器本身状态,红框里就是本次要压测的对象)
locust脚本:(由于该项目的流程很简单,我就直接用locust写了脚本来压测,这里贴一下脚本)
有对locust感兴趣的可以自行了解一下,之前我也有发关于locust的帖子,但是locust更新的挺快的,之前的一些语法有些已经被弃用了...
from idna import unicode from locust import HttpLocust, TaskSet, task, User, HttpUser, between import json import uuid import os import time class MyTasks(TaskSet): header = {"Content-Type": "application/json", "systemid": "yanpan", "authcode": "7ef54175f9d97b7ed26aeb2b5f121f40"} ygdatas = json.load(open('ygys.json', 'r', encoding='UTF-8')) #原告要素表 bgdatas = json.load(open('bgys.json', 'r', encoding='UTF-8')) #被告要素表 def get_bh(self): bh = ''.join(str(uuid.uuid4()).split('-')) # 通过python生成uuid return bh def get_bhAJ(self): bhAj = ''.join(str(uuid.uuid4()).upper().split('-')) #通过python生成uuid return bhAj #获取要素填写的前端页面(为了使场景更真实一点) def GetYsui(self): self.client.get('http://xxx.xx.xx.xx:8000/lhjf-yg?ygsf=2&systemid=yanpan&authcode=7ef54175f9d97b7ed26aeb2b5f121f40&ay=9015&ssdw=1&jbfy=2400&bhAj=298C0D590F06D08DD773BAF9C7C49049&dsr=FD63B3C0D12A78A58DCF6D6A6C4D4A78&gldsr=&sfkbj=1&dc=1&dy=1&zc=1&bc=1&qrtj=1&gbgwdt=1&fymc=%E6%B9%96%E5%8D%97%E7%9C%81%E9%AB%98%E7%BA%A7%E4%BA%BA%E6%B0%91%E6%B3%95%E9%99%A2001&ah=%EF%BC%882018%EF%BC%89%E6%B9%98%E6%B0%91%E5%88%9D696%E5%8F%B7&time=1593599607909&ywlx=30100',headers=self.header) #填写原告要素表 def Writeygysb(self, ygdatas): # 填写原告要素表 self.GetYsui() time.sleep(1) self.client.post("http://xxx.xx.xx.xx:8000/yaosu/api/v1/ys", headers=self.header, data=ygdatas) #填写被告要素表 def Writebgysb(self, bgdatas): # 填写被告要素表 self.GetYsui() time.sleep(1) self.client.post("http://xxx.xx.xx.xx:8000/yaosu/api/v1/ys", headers=self.header, data=bgdatas) #清除库里由于压测添加的脏数据 def delete(self, bhAJ): params1 = {"bhAj": bhAJ, "ssdw": "1"} self.client.delete(f'http://xxx.xx.xx.xx:8888/api/v1/ys?{bhAJ}&ssdw=1',params=params1, headers=self.header) params2 = {"bhAj": bhAJ, "ssdw": "2"} self.client.delete(f'http://xxx.xx.xx.xx:8888/api/v1/ys?{bhAJ}&ssdw=2',params=params2, headers=self.header) @task #压测任务,将流程串联起来(获取前端页面-填写原被告要素表-清楚脏数据【这里清楚脏数据替代了同步的操作】) def YsPressureTest(self): # 填写原告要素表 bh = self.get_bh() bhAj = self.get_bhAJ() self.ygdatas["bhAj"] = bhAj self.ygdatas["bh"] = bh self.bgdatas["bhAj"] = bhAj self.bgdatas["bh"] = bh ygdatas = json.dumps(self.ygdatas) bgdatas = json.dumps(self.bgdatas) self.Writeygysb(ygdatas) self.Writebgysb(bgdatas) self.delete(bhAj) class RunLoadTests(HttpUser): ''' 创建运行类 ''' tasks = [MyTasks] wait_time = between(5, 10) #每个用户5-10秒内执行一遍流程 if __name__=="main": os.system("locust -f test_load.py --web-host=127.0.0.1 --host=xxx.xx.xx.xx")
运行脚本开始压测:
看看压测情况走势:
再看看服务器资源:
二者结合是可以看到一些结论的:
从请求来分析:在用户量达到900前,随着用户量的增加,每秒的请求数跟随着增加,但是响应时间并没随着增加。但是当用户数量达到1000时,开始出现失败的请求,响应时间也激增,且随着时间向后,失败的请求增多,呈驼峰状。这说明用户量达到1000时(忽略服务器因素,本来就不是正式的性能测试),要素服务不再稳定。
从服务器状态来分析:压测开始时,服务器cpu资源占用一直是上升状态,用户量达到1000时达到峰值且有大幅度波动,可能与失败的请求有关,内存也有涨幅,但是较为稳定。网络速度的上传下载也是随着用户量的增加一直增加着,在用户量达到1000时达到峰值。同时也能看到磁盘的写入写出(数据库也在此服务器上)。
当然这只是简单的进行了一个分析,这毕竟不是专门的性能测试。grafana的仪表盘的数据也没有进行一些调整,让数据更加清晰。