-->

Locust --- 平台负载性能测试工具

2020-09-20 14:58发布

Locust 是一款 依赖 Python 的 开源平台系统负载性能测试工具,我接触到这个项目缘起于2018年为河南移动项目服务期间,那时我需要带我的团队对业务环境中引入的开源软件做品质控制管理工作,需要借助测试工具对软件产品的持久可用性及持续高负载能力做评估。

在负载测试行当里,常用的负载测试工具有 Apache JMeter 、HP Mercury LoadRunnner 、WebLOAD、Loadster、Loadstorm、Load impact 、OpenSTA ,此外还有 NeoLoad 、kylinTOP /Micro Focus QALoad 、Micro Focus SilkPerformer 、Web Bench 、ApacheBench 、Siege 、Web Polygraph 、kylinPET 等。

谨慎地说,Locust 也是一个老牌儿的系统负载性能测试工具,这个项目已经存在了大约 10 年时间,当前的项目地址为 https://github.com/locustio/locust 。

Locust 官网(https://www.locust.io/)对这个项目的介绍为:

An open source load testing tool.
Define user behaviour with Python code, and swarm your system with millions of simultaneous users.

据此可知,Locust 是基于事件触发的模拟行为,可以模拟百万计的并发用户访问。但它需要用 Python 脚本定义事件行为,因此需要为它准备 必要的 Python 环境。同时,Locust 还支持分布式部署。我在为河南移动项目服务期间,采用的 Python 版本是 Python 2.7 ,当前可以用 Python 3.8 作为运行时环境(Runtime Environment)。

在项目文档中,Locust 有两种部署方式:用 pip 进行在线安装和源代码部署安装。官方推荐用 pip进行在线安装:

pip install locust

python -m pip install locustio

但出于安全审计考虑,不建议修改服务器中的既定环境变量,也不建议直接连接公网进行在线安装软件。建议报 Locust 项目的源代码传到目标服务器上,按需进行环境配置和从内网镜像站进行隔离部署:

[googlebigtable@localhost Data]$ git clone https://github.com/locustio/locust.git
Cloning into 'locust'...
remote: Enumerating objects: 109, done.
remote: Counting objects: 100% (109/109), done.
remote: Compressing objects: 100% (55/55), done.
remote: Total 11302 (delta 74), reused 71 (delta 54), pack-reused 11193
Receiving objects: 100% (11302/11302), 4.20 MiB | 18.00 KiB/s, done.
Resolving deltas: 100% (7891/7891), done.
[googlebigtable@localhost Data]$ ls
ArchLinuxScripts initOSaliYUM.sh mountDisk.txt qt-opensource-linux-x64-5.9.2.run
aria2 install-frps.sh ngrok-one-key-install tools.sh
epel-release-latest-7.noarch.rpm installNotepadqq.doc notepadqq VMwareTools-10.3.10-13959562.tar.gz
frp kcp-server onekey-install-shell vmware-tools-distrib
game-server locust openmediavault-omvextrasorg_latest_all4.deb yunwei
google-chrome-stable_current_x86_64.rpm lost+found PVEforSoftwareRouter.doc
[googlebigtable@localhost Data]$ cd locust && python setup.py install

查看 Locust 安装结果:

pip show locust

locust -V
查看 Locust 的使用帮助:

locust -help

文件 setup.py 中定义了 部署 当前版本 Locust 所依赖的组件,如:

[googlebigtable@localhost Data]$ cat locust/setup.py

-- coding: utf-8 --

import ast
import os
import re
import sys

from setuptools import find_packages, setup

ROOT_PATH = os.path.abspath(os.path.dirname(file))

parse version from locust/init.py

_version_re = re.compile(r"version\s+=\s+(.*)")
_init_file = os.path.join(ROOT_PATH, "locust", "init.py")
with open(_init_file, "rb") as f:
version = str(ast.literal_eval(_version_re.search(f.read().decode("utf-8")).group(1)))

setup(
name="locust",
version=version,
install_requires=[
"gevent>=1.5.0",
"flask>=1.1.2",
"Werkzeug>=1.0.1",
"requests>=2.9.1",
"msgpack>=0.6.2",
"pyzmq>=16.0.2",
"geventhttpclient>=1.4.4",
"ConfigArgParse>=1.0",
"psutil>=5.6.7",
"Flask-BasicAuth>=0.2.0",
],
test_suite="locust.test",
tests_require=[
"cryptography",
"mock",
"pyquery",
],
)

必须组件及其功能:

gevent:在Python中实现协程的第三方库,使gevent可以获取极高的并发能力。

flask:Python下的一个Web开发框架。

requests:支持HTTP/HTTPs请求访问的库。

msgpack-python:一种二进制序列化格式,主要提供MessagePack数据序列化及反序列化的方法。

pyzmq:主要用来实现Locust的分布式模式运行,可以把Locust运行在多个进程或多个机器(分布式)。

在较旧的 Locust 版本中,还会用到一个 用来封装 Python 2和Python 3 的兼容库,组件名叫 “ six ”。

关于生产环境中软件的隔离部署:

一 再内部管理网中搭建一个 YUM源或APT源或DNF源;

二 把自己环境中的必须软件及相应的依赖组件放到内网软件源中并定时更新软件源索引数据库

三 在部署软件时把安装源指向内网软件源服务器

最简单的做法就是用一台 JumpBox 定时对阿里或华为或网易的软件站做镜像,经安全扫描后克隆到内网软件源服务器。

关于 Locust 负载测试工具,也可用 docker 封装镜像后 在 Kubernetes 或 Rancher 或 OpenShift 上运行。

标签: