Для систем векторного поиска, обрабатывающих сотни миллионов векторов, поддержание задержки на уровне миллисекунд требует хранения большого количества высокоразмерных векторных индексов в памяти. В отличие от традиционных реализаций Elasticsearch или OpenSearch, которые сильно полагаются на JVM heap memory, CSS vector search engine построен на C++ и использует off-heap memory, что обеспечивает более высокую производительность. При отсутствии эффективного управления жизненным циклом крупномасштабные развертывания могут столкнуться с: out of memory (OOM), если неактивные (или холодные) индексы накапливаются и занимают слишком много памяти; или нестабильной задержкой запросов из‑за частого «swap-in and swap-out» кэшированных сегментов индекса. Чтобы решить эту проблему, CSS vector database реализует комплексный набор политик управления off-heap memory, обеспечивая стабильную производительность поиска при высокой нагрузке. Эти политики включают: мониторинг в реальном времени пороговых значений использования памяти; предварительную загрузку индексов для снижения высокой задержки первого запроса; и динамическое освобождение кэша через автоматическое очистку кэша на основе заранее определённых периодов простоя или порогов использования.
CSS vector database делит физическую память кластера на JVM heap memory и off-heap memory. Политики управления off-heap memory следующие:
Для устранения узких мест производительности проверьте использование off-heap memory и коэффициент попаданий в кэш на каждом узле кластера.
Выполните следующую команду для мониторинга состояния кэша:
GET /_vector/stats
Пример ответа:
{"_nodes" : { # Node information"total" : 1, # Total number of nodes"successful" : 1, # Number of successful nodes"failed" : 0 # Number of failed nodes},"cluster_name" : "css-d3a7", # Cluster name"cpu_circuit_breaker_triggered" : false, # Whether circuit breaking is triggered"nodes" : {"cAHmVUZTR9ON7t6jxcDCkg" : { # Node UUID"cpu_cache_capacity_reached" : false, # Whether the off-heap memory usage of the current node reaches the upper limit"cpu_eviction_count" : 0, # Number of segment-level cache swap-outs on the current node"cpu_hit_count" : 0, # Number of segment-level cache hits on the current node"cpu_load_exception_count" : 0, # Number of segment-level index loading failures on the current node"cpu_load_success_count" : 0, # Number of segment-level index loading successes on the current node"cpu_miss_count" : 0, # Number of segment-level cache misses on the current node"cpu_query_memory_usage" : 0, # Off-heap memory usage on the current node, in KB"cpu_total_load_time" : 0 # Total time loading segments to the off-heap memory on the current node, in ms}}}
Предварительно загрузите часто используемые или недавно добавленные индексы в off-heap memory, чтобы снизить высокую задержку первого запроса (поскольку данные необходимо загрузить с диска).
Выполните следующую команду для предварительной загрузки указанного индекса:
PUT /_vector/warmup/{index_name}
Parameter | Type | Default Value | Description |
|---|---|---|---|
index_name | String | N/A | Указывает один или несколько векторных индексов.
|
Пример ответа:
{"_shards" : {"total" : 1,"successful" : 1,"failed" : 0}}
Когда данные часто обновляются или ресурсы памяти становятся ограниченными, вы можете включить автоматическую очистку кэша, чтобы автоматически выгружать неактивные сегменты и освобождать off-heap память, обеспечивая стабильную производительность запросов при высокой нагрузке.
Выполните следующую команду, чтобы включить автоматическое удаление сегментов, превысивших период простоя:
PUT _cluster/settings{"persistent": {"native.cache.expiry.enabled": "true","native.cache.expiry.time": "30m"}}
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
native.cache.expiry.enabled | Boolean | false | Определяет, следует ли включать автоматическую очистку кэша. При включении неактивные сегменты автоматически удаляются, когда истекает их период простоя. Значение может быть: |
native.cache.expiry.time | String | 24h | Период простоя для выселения неактивных сегментов. Формат значения: число + единица
Пример: 24h (24 часа) и 30m (30 минут). |
Когда off-heap memory достигает своей емкости, система автоматически управляет данными с помощью процесса «swap-in and swap-out». Однако частый, высокообъёмный оборот кэша может влиять на производительность запросов. После удаления индексов или переключения нагрузок вы можете вручную освободить off-heap memory, занятые неактивными сегментами индексов, чтобы обеспечить производительность запросов для индексов горячих данных.
PUT /_vector/clear/cache
PUT /_vector/clear/cache/{index_name}
Пример ответа:
{"acknowledged" : "true"}