性能测试工具Locust

846 阅读2分钟

Locus介绍

Locust是一个易于使用,可编写脚本且可扩展的性能测试工具。

使用常规Python代码定义用户的行为,而不是使用笨拙的UI或特定于域的语言(DSL)。

这使得Locust可以无限扩展,并且对开发人员非常友好。

在模拟有效并发方面,Locust的优势在于其摒弃了进程和线程,完全基于事件驱动,使用gevent提供的非阻塞IO和coroutine来实现网络层的并发请求,因此即使是单台 压测机器,也能产生数千并发请求数;再加上对分布式运行的支持,理论上来说,Locust能在使用较少压力机的前提下支持极高并发数的测试。

Locust具有用户友好的Web界面,可实时显示测试进度和测试结果。

Locus安装

Locus的安装地址如下:Locus安装。最新版的Locus(1.5.1)需要Python3.6以上。

简单示例

一个测试Web接口的例子如下:

import msgpack
from locust import HttpUser, task, between

class GamePlayer(HttpUser):
	wait_time = between(0.1, 0.2)

	@task(1)
	def get_players_info(self):
		body = {
			"hostnum2pids": {65001: ["YJZM6Ov5QQtwYZJX"]},
			"fields": [],
		}
		data = msgpack.packb(body)
		self.client.post("/redis_player/get_players_info", data=data)

	@task(3)
	def set_player_info(self):
		body = {
			"pid": "YIDjvlHpKkIpDcpE",
			"info": {'head': {'head': 1}, 'base': {'school': 1}}
		}
		data = msgpack.packb(body)
		self.client.post("/redis_player/set_player_info", data=data)

Locus用一个HttpUser对象,管理客户端的行为。

字段wait_time表示连续两个行为之间的时间间隔。如果没有定义该字段,则在一个行为结束时,立刻执行下一个行为。

修饰符@task定义每个客户端需要执行的任务。参数表示任务的权重。如上述两个任务权重分别为1、3,则两个任务被执行的比例为1:3。

运行

  1. 如果启动的locust文件名为locustfile.py并位于当前工作目录中,可以直接执行如下命令:

locust

  1. 如果Locust文件位于子目录下且名称不是locustfile.py,可以使用-f命令启动上面的示例locust文件:

locust -f filepath/filename.py

  1. 如果要运行分布在多个进程中的Locust,通过指定-master以下内容来启动主进程 :

locust -f filepath/filename.py --master

  1. 如果要启动任意数量的从属进程,可以通过-salve命令来启动locust文件:

locust -f my_locustfile.py --worker --master-host=192.168.0.14

  1. 采用docker-compose形式执行:
  • locustfile.py所在目录,编写docker-compose.yml文件
version: '3'

services:
  master:
    image: locustio/locust
    ports:
     - "8089:8089"     
    volumes:
      - ./:/mnt/locust
    command: -f /mnt/locust/locustfile.py --master -H http://master:8089 --web-host=0.0.0.0
  
  worker:
    image: locustio/locust
    volumes:
      - ./:/mnt/locust
    command: -f /mnt/locust/locustfile.py --worker --master-host master
  • locustfile.py所在目录,执行docker-compose目录

docker-compose up --scale worker=2

结果展示

Locust通过WebUI的形式,展示压测结果。原版的统计结果,包括了常见的平均响应时间、每秒请求次数、响应时间百分位数。

可以在原来基础上,方便地进行二次开发。

localhost_8089_stats_report.png