本文介绍如何使用OpenSearch Benchmark工具对PolarSearch进行性能基准测试,您可以按照本文介绍自行测试对比,快速了解各产品在真实负载场景下的搜索与写入性能。
测试工具
OpenSearch Benchmark(简称OSB)是OpenSearch官方开源的搜索引擎基准测试框架,前身为Elasticsearch Rally。它内置标准化的行业测试负载(workload),支持对任意兼容Elasticsearch/OpenSearch REST API的搜索引擎产品进行统一、可重复的基准测试,适合产品间横向性能对比。
测试环境
测试工具:OpenSearch Benchmark 2.1.0
配置环境:测试的ECS实例和PolarSearch集群需在同一地域、同一可用区和同一个VPC网络内。
ECS实例:
实例规格:ecs.c9i.8xlarge(32核128 GiB)
操作系统:Ubuntu 22.04
Python版本:3.10+
PolarSearch集群:
节点规格:8核 32 GB
节点个数:2个
参数配置:均使用开箱即用配置,不额外调整任何集群参数。
测试功能与版本
功能 | PolarSearch版本 | 实例规格 | 节点个数 |
PolarSearch | 3.0 | 8核32 GB | 2 |
PolarSearch | 1.0 | 8核32 GB | 2 |
测试负载
Workload | 基本信息 | 测试项目 |
基于1998年世界杯期间真实 Web 服务器访问日志构建,数据集包含约2.47亿条日志记录。 | index-append数据写入、term查询、range时间范围查询、aggregation聚合 | |
基于2015年纽约出租车行程数据构建。 | index-append数据写入、term查询、range时间范围查询、geodistance地理位置查询、aggregations聚合 | |
基于GeoNames地理信息数据库构建,数据集取自2017年4月的全球地名导出文件(allCountries),包含约1,140万条全球地名兴趣点记录。 | term + phrase精确/全文查询、aggregations聚合、decay_geo_gauss_function_score地理能力、painless_static脚本评分、desc_sort_population排序查询 |
测试场景
写入性能测试(Indexing)
测试将完整数据批量写入集群,评估各功能版本在不同并发写入客户端数(bulk_indexing_clients)下的写入吞吐量。
测试采用
append-no-conflicts-index-onlytest procedure,该procedure仅执行索引创建和数据写入,不包含搜索操作。每轮测试均从空索引开始。测试的并发写入客户端数依次为:1、2、4、8、16、32。
搜索性能测试(Searching)
在写入完成后,使用
--include-tasks参数指定搜索任务列表,在已有数据上直接执行搜索测试,不重复导入数据。测试的并发搜索客户端数(search_clients)依次为:1、2、4、8、16、32,target_throughput设置为0(全速压测模式)。
安装 OpenSearch Benchmark
OpenSearch Benchmark要求Python版本需为3.8及以上版本。
执行以下命令安装 OpenSearch Benchmark。
pip install opensearch-benchmark执行以下命令验证安装是否成功。
opensearch-benchmark --version
测试方法
准备工作
获取PolarSearch的访问地址、用户名及密码,确认网络连通性:
curl -u <user>:<password> http://<endpoint>/_cluster/health?pretty返回结果说明如下:
"status": "green" :表示集群健康。
"status": "yellow":表示所有主分片已分配,但部分副本分片尚未分配(例如节点离线)。此时集群仍可读写,但高可用性有所降低。检查方法:
# 检查分片分配情况 curl -u <user>:<password> -XGET "http://<endpoint>/_cat/shards?v"# 查看未分配分片详情 curl -u <user>:<password> -XGET "http://<endpoint>/_allocation/explain""status": "red":表示存在未分配的主分片,集群部分数据不可用,不建议在此状态下执行压测。
执行性能测试
执行以下命令运行性能测试。
opensearch-benchmark run \
--workload="<workload>" \
--client-options="basic_auth_user:<user>,basic_auth_password:<password>,verify_certs:false" \
--target-hosts="<endpoint>" \
--pipeline=benchmark-only \
--results-file="path/to/result_file.md" \
--kill-running-processes \
--workload-params="number_of_replicas:<index replica数量>,number_of_shards:<index shard数量>,bulk_indexing_clients:<bulk_indexing_clients>,search_clients:<search_clients>,target_throughput:0"
# 可选参数
# --test-procedure="<需要执行的workload流程>"
# --include-tasks="<workload中需要执行的task>"通用命令行参数说明如下:
参数 | 含义 |
--workload | 测试负载名称。例如, |
--test-procedure | 测试流程名称。写入测试可使用 说明 您可通过 |
--include-tasks | 若包含此参数,则仅执行指定的job。例如,可用于跳过索引删除、索引创建和数据写入阶段,直接在已有数据上运行搜索测试。 |
--client-options | 集群访问认证信息。 说明
|
--target-hosts | 被测集群的访问地址。 |
--pipeline=benchmark-only | 告知OpenSearch Benchmark,性能测试使用您提供的PolarSearch集群。 |
--results-file | 测试结果输出路径,结果以Markdown格式保存。 |
--kill-running-processes | 启动前自动清理上一轮残留的OpenSearch Benchmark进程,避免进程冲突。 |
--workload-params | 以逗号分隔的键值对,用于向workload的Jinja2模板注入运行时参数,覆盖workload中定义的默认值。 |
workload参数说明如下:
参数 | 含义 |
number_of_replicas | 索引副本数。 |
number_of_shards | 索引主分片数。 |
bulk_indexing_clients | 并发写入客户端数。 |
search_clients | 并发搜索客户端数,在搜索测试中生效。 |
target_throughput:0 | 关闭请求速率限制,以全速压测模式运行,测量集群的搜索吞吐量上限。 |
测试结果
每轮测试完成后,OpenSearch Benchmark会在终端输出结果汇总表,并将详细结果写入--results-file指定的文件。主要指标含义如下:
指标 | 含义 |
Mean Throughput | 测试期间的平均吞吐量,单位为ops/s(每秒完成的请求数)。 在 |
p50 Latency | 50%分位响应时间(中位数),即一半请求的响应时间低于此值,反映正常请求的典型延迟。 |
p90 / p99 Latency | 90%/99%分位响应时间,反映长尾请求的延迟,是衡量服务稳定性的重要指标。值越低,表示极端情况下的延迟抖动越小。 |
Service Time | 请求从发出到收到响应的实际处理时间(不含排队等待时间),反映集群的纯处理耗时。同样包含p50、p90、p99等分位服务时间指标。 |
Error Rate | 测试期间的请求失败率。正常测试结果应为0%,若出现非零值,说明集群在当前负载下已出现错误(如熔断、超时等),该组数据的参考价值降低。 |
详细测试结果,请参见PolarSearch 1.0性能测试结果与PolarSearch 3.0性能测试结果。