OpenSearch 正确计算 knn 索引大小
OpenSearch compute knn index size properly
我在 AWS 中使用 OpenSearch 服务进行研究。
任务:我想计算索引中 N 条记录的索引大小。
输入:我在 AWS [r6g.4xlarge.search] 中只有一个节点,内存为 128。索引定义为:
{
"settings": {
"index": {
"knn": True,
"knn.space_type": "cosinesimil",
'number_of_replicas': 0,
'refresh_interval': -1,
'translog.flush_threshold_size': '10gb',
}
},
"mappings": {
"properties": {
"vector": {
"type": "knn_vector",
"dimension": 512
},
"keyword1": {
"type": "keyword"
},
"keyword2": {
"type": "keyword"
}
}
}
}
我看到在强制合并 + 刷新后我有 5 个段。
KNN 统计数据如下:
{"_nodes": {"total": 1, "successful": 1, "failed": 0}, "cluster_name": "NAME",
"circuit_breaker_triggered": false, "nodes": {
"ID": {"miss_count": 7, "graph_memory_usage_percentage": 34.527355,
"graph_query_requests": 475, "graph_memory_usage": 16981999,
"cache_capacity_reached": false, "graph_index_requests": 5,
"load_exception_count": 0, "load_success_count": 7, "eviction_count": 0,
"indices_in_cache": {
"INDEX_NAME": {"graph_memory_usage_percentage": 34.527355,
"graph_memory_usage": 16981999,
"graph_count": 5}},
"script_query_errors": 0, "script_compilations": 0,
"script_query_requests": 0, "graph_query_errors": 0, "hit_count": 468,
"graph_index_errors": 0, "knn_query_requests": 95,
"total_load_time": 57689947272, "script_compilation_errors": 0}}}
我发现在我的情况下所需的内存量是 OpenSearch:1.1 * (4 * 维度 + 8 * M) 字节。其中 dimension=512, M=16 这给我每条记录 0.0000023936。现在我在索引中有 7885767 个文档,它占用了 16981999 = ±16GB - 32% 的可用内存。所以比公式说的还要少
但是如果我计算可用内存,它会给我 ~50GB,例如 128GB RAM。根据 AWS 文档 (check the bottom line),OpenSearch 本身最多占用 32 GB,因此还剩 96 GB。 你能告诉我如何编写公式来正确估计索引中的文档数量吗?
答案很简单。如果你只使用 knn 搜索(像我一样)你可以简单地增加这个参数来调整你机器的最大 RAM knn.memory.circuit_breaker.limit
settings
我在 AWS 中使用 OpenSearch 服务进行研究。
任务:我想计算索引中 N 条记录的索引大小。
输入:我在 AWS [r6g.4xlarge.search] 中只有一个节点,内存为 128。索引定义为:
{
"settings": {
"index": {
"knn": True,
"knn.space_type": "cosinesimil",
'number_of_replicas': 0,
'refresh_interval': -1,
'translog.flush_threshold_size': '10gb',
}
},
"mappings": {
"properties": {
"vector": {
"type": "knn_vector",
"dimension": 512
},
"keyword1": {
"type": "keyword"
},
"keyword2": {
"type": "keyword"
}
}
}
}
我看到在强制合并 + 刷新后我有 5 个段。
KNN 统计数据如下:
{"_nodes": {"total": 1, "successful": 1, "failed": 0}, "cluster_name": "NAME",
"circuit_breaker_triggered": false, "nodes": {
"ID": {"miss_count": 7, "graph_memory_usage_percentage": 34.527355,
"graph_query_requests": 475, "graph_memory_usage": 16981999,
"cache_capacity_reached": false, "graph_index_requests": 5,
"load_exception_count": 0, "load_success_count": 7, "eviction_count": 0,
"indices_in_cache": {
"INDEX_NAME": {"graph_memory_usage_percentage": 34.527355,
"graph_memory_usage": 16981999,
"graph_count": 5}},
"script_query_errors": 0, "script_compilations": 0,
"script_query_requests": 0, "graph_query_errors": 0, "hit_count": 468,
"graph_index_errors": 0, "knn_query_requests": 95,
"total_load_time": 57689947272, "script_compilation_errors": 0}}}
我发现在我的情况下所需的内存量是 OpenSearch:1.1 * (4 * 维度 + 8 * M) 字节。其中 dimension=512, M=16 这给我每条记录 0.0000023936。现在我在索引中有 7885767 个文档,它占用了 16981999 = ±16GB - 32% 的可用内存。所以比公式说的还要少
但是如果我计算可用内存,它会给我 ~50GB,例如 128GB RAM。根据 AWS 文档 (check the bottom line),OpenSearch 本身最多占用 32 GB,因此还剩 96 GB。 你能告诉我如何编写公式来正确估计索引中的文档数量吗?
答案很简单。如果你只使用 knn 搜索(像我一样)你可以简单地增加这个参数来调整你机器的最大 RAM knn.memory.circuit_breaker.limit
settings