本文介紹如何使用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效能測試結果。