Workload parameters
출처: 문서
본문
워크로드 파라미터
워크로드 파라미터를 사용하면 워크로드 파일을 직접 수정하지 않고도 워크로드 동작을 커스터마이즈할 수 있어요. 런타임에 파라미터를 전달해서 벌크 크기, 샤드 수, 인덱스 이름, 검색 설정 같은 항목들을 제어할 수 있답니다.
OpenSearch Benchmark 워크로드는 Jinja2 템플릿을 사용해요. --workload-params 플래그로 파라미터를 전달하면, OpenSearch Benchmark가 실행 전에 이를 워크로드 JSON 파일에 주입해요.
예를 들어 워크로드의 index.json에는 다음과 같은 설정이 들어 있을 수 있어요:
{
"settings": {
"index.number_of_shards": {% raw %}{{ number_of_shards | default(1) }}{% endraw %},
"index.number_of_replicas": {% raw %}{{ number_of_replicas | default(0) }}{% endraw %}
}
}
--workload-params='{"number_of_shards": 3}'로 벤치마크를 실행하면, OpenSearch Benchmark가 {% raw %}{{ number_of_shards | default(1) }}{% endraw %}를 3으로 바꿔줘요. 오버라이드하지 않은 파라미터는 기본값을 그대로 사용해요.
파라미터 전달하기
파라미터는 다음과 같은 방법으로 전달할 수 있어요.
JSON 파일(파라미터가 많을 때 권장)
파라미터를 담은 JSON 파일을 만들어요:
{
"number_of_shards": 3,
"number_of_replicas": 1,
"bulk_size": 5000,
"target_index_name": "my_index"
}
{% include copy.html %}
그다음 다음과 같이 참조해요:
opensearch-benchmark run --workload=geonames --workload-params=my-params.json
{% include copy.html %}
인라인 JSON
명령줄에서 파라미터를 직접 전달해요:
opensearch-benchmark run --workload=geonames --workload-params='{"number_of_shards": 3, "bulk_size": 5000}'
{% include copy.html %}
쉼표로 구분된 키-값 쌍
키-값 쌍을 전달하려면 다음 형식을 사용해요:
opensearch-benchmark run --workload=geonames --workload-params="number_of_shards:3,bulk_size:5000"
{% include copy.html %}
쉼표로 구분하는 형식은 문자열 값만 지원해요. 숫자, 불리언 값, 중첩 객체에는 JSON 파일이나 인라인 JSON을 사용하세요. {: .note}
파라미터 우선순위
같은 파라미터가 여러 소스에서 정의되면, OpenSearch Benchmark는 다음 순서(우선순위가 높은 것부터)로 적용해요:
--workload-params(CLI 플래그): 다른 모든 값을 오버라이드해요.- 워크로드 템플릿 기본값: 워크로드 JSON 파일의
{% raw %}{{ var | default(value) }}{% endraw %}표현식에 지정된 기본값(예:{% raw %}{{ number_of_shards | default(1) }}{% endraw %}). - 정의되지 않음: 기본값도 지정되지 않고 파라미터도 제공되지 않으면, OpenSearch Benchmark가 템플릿 렌더링 오류를 발생시켜요.
템플릿 문법
이 섹션에서는 워크로드 파일에서 가장 많이 쓰이는 템플릿 패턴을 설명해요.
기본값이 있는 변수
default 필터를 사용하면 파라미터가 제공되지 않을 때의 대체(fallback) 값을 지정할 수 있어요. 예를 들어 --workload-params에 bulk_size가 제공되지 않으면, 이 표현식은 5000으로 평가돼요:
{% raw %}{{ bulk_size | default(5000) }}{% endraw %}
{% include copy.html %}
불리언 값
불리언 값에는 tojson 필터를 사용해서 올바른 JSON 출력을 보장하세요. 예를 들어 다음 표현식은 "false"가 아니라 false(따옴표 없음)로 평가돼요:
{% raw %}{{ query_cache_enabled | default(false) | tojson }}{% endraw %}
{% include copy.html %}
문자열 값
문자열 변수는 따옴표로 감싸요:
{% raw %}"{{ conflicts | default('random') }}"{% endraw %}
{% include copy.html %}
조건부 섹션
{% raw %}{% if %}{% endraw %} 블록을 사용하면 파라미터가 정의되어 있는지 여부나 파라미터 값에 따라 섹션을 포함하거나 제외할 수 있어요.
정의된 경우에만 필드 포함하기
다음 템플릿은 target-throughput 필드를 조건부로 포함해요. --workload-params로 target_throughput이 제공되지 않으면, 렌더링 결과에서 해당 필드 전체가 생략돼요:
{% raw %}{% if target_throughput is defined %}
"target-throughput": {{ target_throughput }},
{% endif %}{% endraw %}
{% include copy.html %}
대체 값을 위한 if/else
{% raw %}{% else %}{% endraw %}를 사용하면 대체 값을 제공할 수 있어요. 예를 들어 --workload-params에서 use_zstd가 true로 설정되면, 렌더링 결과에서 source-file 파라미터가 documents.json.zst로 설정돼요. 그렇지 않으면 source-file이 documents.json.bz2로 설정돼요:
{% raw %}{% if use_zstd %}
"source-file": "documents.json.zst",
{% else %}
"source-file": "documents.json.bz2",
{% endif %}{% endraw %}
{% include copy.html %}
조건부로 인덱스 필드 추가하기
이 패턴은 vectorsearch 워크로드 템플릿에서 선택적 필드를 정의할 때 흔히 사용돼요. {% raw %}{%- endif %}{% endraw %}(대시 포함)는 뒤따르는 공백과 줄바꿈 문자를 제거해서 빈 줄이 생기는 것을 막고, 잘못된 JSON 형식(후행 쉼표나 어긋난 구조 같은)을 방지해요:
"properties": {
{% raw %}{% if id_field_name is defined and id_field_name != "_id" %}
"{{ id_field_name }}": {
"type": "keyword"
},
{%- endif %}{% endraw %}
"embedding": {
"type": "knn_vector",
"dimension": {% raw %}{{ target_index_dimension }}{% endraw %}
}
}
{% include copy.html %}
버전 기반 조건문
일부 워크로드는 distribution_version에 따라 동작을 조정해요. 이 값은 OpenSearch Benchmark가 대상 클러스터에 맞춰 자동으로 설정해요. 이 패턴을 사용하면 버전별 연산이나 설정을 조건부로 포함시켜 하나의 워크로드가 여러 OpenSearch 버전을 지원할 수 있어요:
{% raw %}{% if distribution_version is not defined %}
{% set distribution_version = "2.11.0" %}
{% endif %}
{% if distribution_version.split('.') | map('int') | list >= "2.19.1".split('.') | map('int') | list %}
{# Include features available in 2.19.1+ #}
{% endif %}{% endraw %}
{% include copy.html %}
for 루프
{% raw %}{% for %}{% endraw %} 루프를 사용하면 반복되는 구조를 생성할 수 있어요:
{% raw %}{% for i in range(1, 101) %}
{
"name": "query-{{ i }}",
"operation-type": "search",
"body": { ... }
},
{% endfor %}{% endraw %}
{% include copy.html %}
정수 변환
파라미터가 반드시 정수여야 한다면 int 필터를 사용하세요:
{% raw %}{{ target_index_dimension | default(768) | int }}{% endraw %}
{% include copy.html %}
외부 파일 포함하기
워크로드는 보통 가독성을 위해 여러 파일로 나눠 구성돼요. {% raw %}{{ benchmark.collect }}{% endraw %} 헬퍼는 렌더링 시점에 여러 JSON 파일을 하나의 워크로드 정의로 합쳐줘요.
헬퍼 임포트하기
benchmark.collect를 사용하는 모든 workload.json은 파일 상단에서 이를 임포트해야 해요:
{% raw %}{% import "benchmark.helpers" as benchmark with context %}{% endraw %}
{% include copy.html %}
with context 절은 모든 워크로드 파라미터가 포함된 파일들에서 사용 가능하도록 보장해요.
연산과 테스트 프로시저 수집하기
일반적인 workload.json은 연산과 테스트 프로시저를 별도 파일에 위임해요:
{% raw %}{% import "benchmark.helpers" as benchmark with context %}{% endraw %}
{
"version": 2,
"description": "My workload",
"indices": [ ... ],
"corpora": [ ... ],
"operations": [
{% raw %}{{ benchmark.collect(parts="operations/*.json") }}{% endraw %}
],
"test_procedures": [
{% raw %}{{ benchmark.collect(parts="test_procedures/*.json") }}{% endraw %}
]
}
{% include copy.html %}
parts 인자는 glob 패턴을 받아요. operations/*.json 패턴은 operations/ 디렉터리의 모든 JSON 파일과 일치하며, 그 내용을 쉼표로 구분해서 포함시켜요. 이렇게 하면 연산과 테스트 프로시저 정의가 별도 파일에 정의되는 동안 메인 workload.json은 간결하게 유지돼요.
공유 파트로 스케줄 구성하기
테스트 프로시저는 공통 스케줄 조각을 재사용할 수 있어요. 예를 들어 vectorsearch 워크로드에는 test_procedures/common/ 아래에 공유 스케줄이 있어요:
test_procedures/
common/
index-only-schedule.json
search-only-schedule.json
force-merge-schedule.json
vespa-search-only-schedule.json
default.json
{% include copy.html %}
default.json의 테스트 프로시저는 이 파트들로 스케줄을 구성해요:
{
"name": "no-train-test",
"default": true,
"schedule": [
{% raw %}{{ benchmark.collect(parts="common/index-only-schedule.json") }}{% endraw %},
{% raw %}{{ benchmark.collect(parts="common/force-merge-schedule.json") }}{% endraw %},
{% raw %}{{ benchmark.collect(parts="common/search-only-schedule.json") }}{% endraw %}
]
}
{% include copy.html %}
수집된 각 파일에는 하나 이상의 스케줄 항목이 들어 있어요. 그 파일들 속의 {% raw %}{{ target_index_name }}{% endraw %} 같은 파라미터는 명령줄에서 전달한 동일한 --workload-params로 해석돼요. with context 임포트가 모든 파라미터를 포함된 파일들로 전파하기 때문이에요.
인덱스 바디 파일
인덱스 정의의 body 필드는 매핑과 설정을 담은 별도 JSON 파일을 참조해요:
"indices": [
{
"name": "geonames",
"body": "index.json"
}
]
{% include copy.html %}
index.json 파일도 다른 워크로드 파일과 마찬가지로 Jinja2 템플릿이라 파라미터를 사용할 수 있어요:
{
"settings": {
"index.number_of_shards": {% raw %}{{ number_of_shards | default(1) }}{% endraw %}
},
"mappings": { ... }
}
{% include copy.html %}
사용 가능한 파라미터 확인하기
워크로드가 지원하는 파라미터를 보려면 info 명령을 사용하세요. 이 명령은 워크로드의 테스트 프로시저와 함께 설정 가능한 파라미터 및 기본값 목록을 보여줘요:
opensearch-benchmark info --workload=geonames
{% include copy.html %}
워크로드 소스를 직접 살펴볼 수도 있어요. 파라미터는 워크로드 JSON 파일에서 {% raw %}{{ variable_name | default(value) }}{% endraw %} 형태로 나타나요. 주요 워크로드 파일은 다음과 같아요:
workload.json-- 최상위 워크로드 정의.index.json-- 인덱스 설정과 매핑.test_procedures/default.json-- 테스트 프로시저 스케줄._operations/default.json-- 연산 정의.
공통 파라미터
다음 파라미터는 대부분의 공식 워크로드에서 지원돼요.
| 파라미터 | 설명 | 기본값 |
|---|---|---|
number_of_shards |
생성되는 인덱스의 프라이머리 샤드 수. | 1 |
number_of_replicas |
생성되는 인덱스의 레플리카 수. | 0 |
bulk_size |
벌크 요청당 문서 수. | 5000 또는 10000 |
bulk_indexing_clients |
동시 벌크 인덱싱 클라이언트 수. | 8 |
ingest_percentage |
수집할 문서 코퍼스의 비율. | 100 |
target_throughput |
클라이언트당 초당 목표 연산 수. | 제한 없음 |
search_clients |
동시 검색 클라이언트 수. | 1 |
cluster_health |
진행 전에 요구되는 클러스터 헬스 상태. | green |
source_enabled |
_source 필드 저장 여부. |
true |
벡터 검색 워크로드 파라미터
vectorsearch 워크로드는 벡터 검색 벤치마킹을 위한 추가 파라미터를 지원해요.
| 파라미터 | 설명 | 기본값 |
|---|---|---|
target_index_name |
벡터 인덱스 이름. | target_index |
target_field_name |
벡터 필드 이름. | target_field |
target_index_dimension |
벡터 차원 수. | 768 |
target_index_space_type |
거리 측정 방식. 유효한 값은 l2, innerproduct, cosinesimil이에요. |
다양함 |
target_index_body |
인덱스 설정 파일의 경로. | indices/faiss-index.json |
target_index_bulk_size |
벌크 요청당 문서 수. | 500 |
target_index_bulk_index_data_set_format |
코퍼스 형식. 유효한 값은 hdf5와 bigann이에요. |
hdf5 |
target_index_bulk_index_data_set_corpus |
코퍼스 이름(예: cohere-1m). |
다양함 |
target_index_bulk_indexing_clients |
동시 인덱싱 클라이언트 수. | 10 |
target_index_max_num_segments |
force merge 이후의 세그먼트 수. | 1 |
hnsw_ef_construction |
HNSW 그래프 구축 시 탐색 계수. | 256 |
hnsw_ef_search |
HNSW 검색 시 탐색 계수. | 256 |
query_k |
검색할 최근접 이웃 수. | 100 |
query_count |
실행할 쿼리 수. 모든 쿼리를 실행하려면 -1을 사용하세요. |
-1 |
query_data_set_format |
쿼리 벡터 형식. 유효한 값은 hdf5와 bigann이에요. |
hdf5 |
query_data_set_corpus |
쿼리 벡터 코퍼스 이름. | 다양함 |
search_clients |
동시 검색 클라이언트 수. | 1 |
neighbors_data_set_corpus |
재현율 평가에 사용되는 정답(ground-truth) 이웃 코퍼스. | 다양함 |
neighbors_data_set_format |
이웃 데이터셋 형식. | hdf5 |
벡터 검색 파라미터 파일 예시
다음 예시는 vectorsearch 워크로드를 위한 완전한 파라미터 파일이에요:
{
"target_index_name": "vector_1m",
"target_field_name": "embedding",
"target_index_body": "indices/faiss-index.json",
"target_index_primary_shards": 1,
"target_index_replica_shards": 0,
"target_index_dimension": 768,
"target_index_space_type": "innerproduct",
"target_index_bulk_size": 500,
"target_index_bulk_index_data_set_format": "hdf5",
"target_index_bulk_index_data_set_corpus": "cohere-1m",
"target_index_bulk_indexing_clients": 10,
"target_index_max_num_segments": 1,
"hnsw_ef_construction": 200,
"hnsw_ef_search": 256,
"query_k": 100,
"query_data_set_format": "hdf5",
"query_data_set_corpus": "cohere-1m",
"query_count": 10000,
"search_clients": 1,
"neighbors_data_set_corpus": "cohere-1m",
"neighbors_data_set_format": "hdf5"
}
{% include copy.html %}
이 파라미터 파일을 사용하려면 params.json으로 저장한 뒤 --workload-params 플래그로 벤치마크를 실행하세요:
opensearch-benchmark run \
--pipeline=benchmark-only \
--workload-path=/path/to/vectorsearch \
--workload-params=params.json \
--target-hosts=localhost:9200
{% include copy.html %}