Облачная платформаAdvanced

Управление кэшем векторного поиска

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Для систем векторного поиска, обрабатывающих сотни миллионов векторов, поддержание задержки на уровне миллисекунд требует хранения большого количества высокоразмерных векторных индексов в памяти. В отличие от традиционных реализаций 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. В этом случае запросы могут испытывать высокую задержку.
  • После того как данные находятся в 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}
Table 1 Описание параметра

Parameter

Type

Default Value

Description

index_name

String

N/A

Указывает один или несколько векторных индексов.

  • Один индекс: введите имя индекса, например, my_index.
  • Несколько индексов: введите несколько имен индексов и используйте запятую (,) для их разделения, например, my_index1,my_index2.
  • Подстановочный символ: используйте подстановочный символ (*) для сопоставления нескольких индексов. Например, myindex* указывает все индексы, имя которых начинается с myindex.

Пример ответа:

{
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
}
}

Настройка политики автоматической очистки кэша

Когда данные часто обновляются или ресурсы памяти становятся ограниченными, вы можете включить автоматическую очистку кэша, чтобы автоматически выгружать неактивные сегменты и освобождать off-heap память, обеспечивая стабильную производительность запросов при высокой нагрузке.

Выполните следующую команду, чтобы включить автоматическое удаление сегментов, превысивших период простоя:

PUT _cluster/settings
{
"persistent": {
"native.cache.expiry.enabled": "true",
"native.cache.expiry.time": "30m"
}
}
Таблица 2 Описание параметра

Параметр

Тип

Значение по умолчанию

Описание

native.cache.expiry.enabled

Boolean

false

Определяет, следует ли включать автоматическую очистку кэша. При включении неактивные сегменты автоматически удаляются, когда истекает их период простоя.

Значение может быть:

  • true: Включает автоматическую очистку кэша.
  • false: Отключает автоматическую очистку кэша.

native.cache.expiry.time

String

24h

Период простоя для выселения неактивных сегментов.

Формат значения: число + единица

  • Число: натуральное число
  • Единица: s (second), m (minute), h (hour) или d (day)

Пример: 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"
}