memory_controller_config

Внутри узлов YDB работают множество различных компонентов, использующих память. Большинству из них требуется фиксированное количество памяти, но некоторые из них могут гибко варьировать объём используемой памяти, тем самым улучшая производительность всей системы. Если компоненты YDB выделяют больше памяти, чем физически доступно, операционная система, вероятно, завершит весь процесс YDB, что крайне нежелательно. Цель контроллера памяти — позволить YDB избегать ситуаций с нехваткой памяти, при этом эффективно используя имеющийся её объём.

Примеры компонентов, управляемых контроллером памяти:

  • Общий кеш: хранит недавно доступные страницы данных, считанные из распределённого хранилища, чтобы уменьшить количество операций ввода-вывода с диска и ускорить получение данных.
  • MemTable: содержит данные, которые ещё не были записаны в SST.
  • KQP: хранит промежуточные результаты обработки запросов.
  • Кеши аллокатора: хранят блоки памяти, которые были освобождены, но ещё не возвращены операционной системе.

Лимиты памяти могут быть настроены для контроля общего использования памяти, обеспечивая эффективную работу базы данных в рамках доступных ресурсов.

Жёсткий лимит памяти

Жёсткий лимит памяти определяет общее количество памяти, доступное для процесса YDB.

По умолчанию жёсткий лимит памяти для процесса YDB равен лимиту памяти, указанному в его cgroups.

В окружениях без лимита памяти cgroups значение жёсткого лимита памяти по умолчанию равно общему объёму доступной памяти хоста. Эта конфигурация позволяет базе данных использовать все доступные ресурсы, но может привести к конкуренции за ресурсы с другими процессами на том же хосте. Хотя контроллер памяти пытается учесть это внешнее потребление, такое использование не рекомендуется.

Жёсткий лимит памяти также может быть задан в конфигурации. Обратите внимание, что процесс базы данных всё равно может превысить этот лимит. Поэтому настоятельно рекомендуется использовать лимиты памяти cgroups в производственных окружениях для строгого контроля памяти.

Большинство других лимитов памяти можно настроить либо в абсолютных байтах, либо в процентах относительно жёсткого лимита памяти. Использование процентов удобно для управления кластерами с узлами разной ёмкости. Если указаны как абсолютные лимиты в байтах, так и процентные лимиты, контроллер памяти использует комбинацию обоих (максимум для нижних лимитов и минимум для верхних лимитов).

Пример секции memory_controller_config с указанным жёстким лимитом памяти:

memory_controller_config:
  hard_limit_bytes: 16106127360

Мягкий лимит памяти

Мягкий лимит памяти определяет опасный порог, который процесс YDB не должен превышать при нормальных обстоятельствах.

Если мягкий лимит превышен, YDB постепенно уменьшает размер общего кеша до нуля. В таком случае следует как можно скорее добавить больше узлов баз данных в кластер или снизить лимиты памяти для отдельных компонентов.

Целевое использование памяти

Целевое использование памяти определяет порог использования памяти процессом YDB, который считается оптимальным.

Гибкие размеры кешей рассчитываются в соответствии с их пределами, чтобы поддерживать потребление памяти процессом вблизи этого значения.

Например, в базе данных, которая расходует немного памяти на выполнение запросов, кеши используют память вблизи этого порога, а остальная память остаётся свободной. Если выполнение запросов начинает потреблять больше памяти, кеши начинают сокращать свои размеры до минимального порога.

Лимиты памяти для отдельных компонентов

Внутри YDB существует два разных типа компонентов.

Первый тип компонентов, или кеш-компоненты, функционируют как кеши, например, храня последние использованные данные. Каждый кеш-компонент имеет минимальный и максимальный пороговые значения лимита памяти, что позволяет ему динамически изменять свою ёмкость в зависимости от текущего потребления памяти процессом YDB.

Второй тип компонентов, или компоненты-активности, выделяют память для конкретных задач, таких как выполнение запросов или процесс компактизации. Каждый компонент-активность имеет фиксированный лимит памяти. Также существует дополнительный общий лимит памяти для таких компонентов, из которого они пытаются получить необходимую память.

Многие другие вспомогательные компоненты и процессы работают параллельно с процессом YDB, потребляя память. В настоящее время эти компоненты не имеют каких-либо лимитов памяти.

Лимиты памяти для кеш-компонентов

К кеш-компонентам относятся:

  • Общий кеш;
  • MemTable.

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

Минимальный порог лимита памяти кеш-компонентов не резервируется, что означает, что память остаётся доступной до тех пор, пока она не будет фактически использована. Однако, как только эта память заполнена, компоненты обычно сохраняют данные, действуя в рамках своего текущего лимита памяти. Таким образом, ожидается, что сумма минимальных лимитов памяти кеш-компонентов будет меньше целевого использования памяти.

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

Пример секции memory_controller_config с указанными лимитами общего кеша:

memory_controller_config:
  shared_cache_min_percent: 10
  shared_cache_max_percent: 30

Лимиты памяти для компонентов-активностей

К компонентам-активностям относятся:

  • KQP.

Лимит памяти для каждого из компонентов-активностей указывает максимальное количество памяти, которое он может попытаться использовать. Однако, чтобы предотвратить превышение процессом YDB мягкого лимита памяти, общее потребление компонентов-активностей ограничивается дополнительным лимитом, называемым лимитом памяти для активностей. Если общее использование памяти активными компонентами превышает этот лимит, любые дополнительные запросы на память будут отклонены.

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

Существуют и другие компоненты-активности, которые в настоящее время не имеют каких-либо индивидуальных лимитов памяти.

Пример секции memory_controller_config с указанным лимитом для KQP:

memory_controller_config:
  query_execution_limit_percent: 25

Параметры конфигурации

Каждый параметр конфигурации применяется в контексте одного узла базы данных.

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

Это ограничение можно выразить в упрощённой форме:

shared_cache_min_percent+mem_table_min_percent+activities_limit_percent<soft_limit_percentshared\_cache\_min\_percent + mem\_table\_min\_percent + activities\_limit\_percent < soft\_limit\_percent

Или в детализированной форме:

Max(shared_cache_min_percenthard_limit_bytes/100,shared_cache_min_bytes)+Max(mem_table_min_percenthard_limit_bytes/100,mem_table_min_bytes)+Min(activities_limit_percenthard_limit_bytes/100,activities_limit_bytes)<Min(soft_limit_percenthard_limit_bytes/100,soft_limit_bytes)Max(shared\_cache\_min\_percent * hard\_limit\_bytes / 100, shared\_cache\_min\_bytes) + Max(mem\_table\_min\_percent * hard\_limit\_bytes / 100, mem\_table\_min\_bytes) + Min(activities\_limit\_percent * hard\_limit\_bytes / 100, activities\_limit\_bytes) < Min(soft\_limit\_percent * hard\_limit\_bytes / 100, soft\_limit\_bytes)

Параметры Значение по умолчанию Описание
hard_limit_bytes CGroup memory limit /
Память хоста
Жёсткий лимит использования памяти.
soft_limit_percent /
soft_limit_bytes
75% Мягкий лимит использования памяти.
target_utilization_percent /
target_utilization_bytes
50% Целевое использование памяти.
activities_limit_percent /
activities_limit_bytes
30% Лимит памяти для активностей.
shared_cache_min_percent /
shared_cache_min_bytes
20% Минимальный порог для лимита памяти общего кеша.
shared_cache_max_percent /
shared_cache_max_bytes
50% Максимальный порог для лимита памяти общего кеша.
mem_table_min_percent /
mem_table_min_bytes
1% Минимальный порог для лимита памяти MemTable.
mem_table_max_percent /
mem_table_max_bytes
3% Максимальный порог для лимита памяти MemTable.
query_execution_limit_percent /
query_execution_limit_bytes
20% Лимит памяти для KQP.
Предыдущая
Следующая