infinilabs/loadgenLoadgen是一款专为Elasticsearch或通用HTTP服务器设计的轻量级负载生成器,用于性能基准测试。它具备高并发处理能力,支持模板化参数动态生成和基准端流量控制,轻量级且无依赖,可快速部署以评估服务器在不同负载下的响应性能。
Loadgen通过YAML配置文件(默认loadgen.yml)定义测试参数,核心包含variables(变量定义)和requests(请求定义)两个节点。典型配置示例:
yamlvariables: - name: ip type: file path: test/ip.txt # 从文件加载变量 - name: user type: file path: test/user.txt - name: id type: sequence # 自增数字变量 - name: uuid type: uuid # UUID生成变量 - name: now_local type: now_local # 本地时间变量 requests: - request: method: GET basic_auth: username: elastic password: pass url: http://localhost:8000/medcl/_search body: '{ "query": {"match": { "name": "$[[user]]" }}}' # 使用变量
variables节点定义动态参数,通过name标识,在请求中使用$[[变量名]]引用。支持的变量类型说明:
| 类型 | 描述 |
|---|---|
| file | 从外部文本文件加载,每行一个值,随机选取 |
| sequence | 自增数字类型,从0开始逐次递增 |
| range | 范围数字类型,需通过from和to参数定义取值范围(如from:10, to:20) |
| uuid | 生成UUID格式字符串(如c3qj9123r0okahraiej0) |
| now_local | 当前时间(本地时区),格式YYYY-MM-DD HH:MM:SS |
| now_utc | 当前时间(UTC时区),格式YYYY-MM-DD HH:MM:SS |
| now_unix | 当前Unix时间戳(秒级) |
文件类型变量示例:
创建test/user.txt文件,每行一个值:
medcl elastic admin
请求中通过$[[user]]随机引用上述值之一。
requests节点按顺序定义待执行的HTTP请求,支持固定参数和模板化参数请求。支持的请求属性包括:
method:HTTP方法(GET/POST等)basic_auth:基础认证信息(username和password)url:请求URL(支持变量引用)body:请求体(支持变量引用)body_repeat_times:请求体重复次数(用于批量请求)查询请求示例:
yamlrequests: - request: method: GET basic_auth: username: elastic password: pass url: http://localhost:8000/medcl/_search?q=name:$[[user]] # URL中引用变量
通过命令行参数控制测试执行行为,执行loadgen --help查看完整参数:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| -c | int | 1 | 并发线程数 |
| -compress | bool | false | 是否启用gzip压缩请求 |
| -config | string | "loadgen.yml" | 配置文件路径(默认当前目录下的loadgen.yml) |
| -d | int | 5 | 测试持续时间(秒),默认5秒 |
| -debug | bool | false | 调试模式,发生错误时触发panic并退出 |
| -l | int | -1 | 限制总请求数(-1表示无限制) |
| -log | string | "info" | 日志级别,可选:trace, debug, info, warn, error |
| -r | int | -1 | 每秒最大请求数(固定QPS),-1表示不限制 |
| -v | bool | false | 显示版本信息 |
假设镜像名称为infinilabs/loadgen,通过以下命令运行(需挂载本地配置文件到容器内):
bash# 基础用法:运行30秒,100并发线程,启用gzip压缩 docker run -v $(pwd)/loadgen.yml:/app/loadgen.yml infinilabs/loadgen -d 30 -c 100 -compress # 限制QPS为200,日志级别debug docker run -v $(pwd)/loadgen.yml:/app/loadgen.yml infinilabs/loadgen -d 60 -c 50 -r 200 -log debug # 限制总请求数为***,使用自定义配置文件 docker run -v $(pwd)/custom-config.yml:/app/custom-config.yml infinilabs/loadgen -config custom-config.yml -l *** -c 80
典型测试输出示例:
5253 requests in 32.756483336s, 524.61KB sent, 2.49MB received [Loadgen Client Metrics] Requests/sec: 175.10 Request Traffic/sec: 17.49KB Total Transfer/sec: 102.34KB Avg Req Time: 5.711022ms Fastest Request: 440.448µs Slowest Request: 3.624302658s Number of Errors: 0 Status 200: 5253
注意:Loadgen结果为累积统计值,可能存在一定误差。建议结合Kibana仪表板实时监控Elasticsearch的CPU、内存、IO等关键指标。
通过body_repeat_times参数复制多次请求体,生成批量请求:
yamlrequests: - request: method: POST url: http://localhost:8000/_bulk # Elasticsearch bulk API body_repeat_times: 1000 # 随机复制请求体1000次生成批量数据 body: "{ \"index\" : { \"_index\" : \"medcl-y4\",\"_type\":\"doc\", \"_id\" : \"$[[uuid]]\" } }\n{ \"id\" : \"$[[id]]\",\"field1\" : \"$[[user]]\",\"ip\" : \"$[[ip]]\" }\n"
使用-l参数限制总请求数,结合单请求单文档配置,生成固定数量文档:
bash# 配置文件中每个请求生成1个文档,通过-l控制总数量 docker run -v $(pwd)/loadgen.yml:/app/loadgen.yml infinilabs/loadgen -l 50000 -c 100
使用sequence类型变量作为文档ID,实现有序增长:
yamlvariables: - name: id type: sequence # 自增数字变量(0,1,2,...) requests: - request: method: POST url: http://localhost:8000/medcl-test/_bulk body_repeat_times: 1 body: "{ \"index\" : { \"_index\" : \"medcl-test\", \"_id\" : \"$[[id]]\" } }\n{ \"id\" : \"$[[id]]\" }\n" # ID与文档字段同步
通过runtime_variables(请求级共享)和runtime_body_line_variables(文档级独立)实现变量复用,如路由值与文档字段关联:
yamlvariables: - name: suffix type: range from: 10 to: 15 # 随机生成10-15的数字 requests: - request: method: POST runtime_variables: batch_no: id # 整个请求批次共享一个batch_no runtime_body_line_variables: routing_no: uuid # 每个文档独立的routing_no url: http://localhost:8000/_bulk body_repeat_times: 10 # 生成10个文档 body: "{ \"create\" : { \"_index\" : \"test-$[[suffix]]\", \"routing\" : \"$[[routing_no]]\" } }\n{ \"batch_number\" : \"$[[batch_no]]\", \"routing_no\" : \"$[[routing_no]]\" }\n"
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务