Управление памятью
В этом разделе кратко описаны классификация памяти и методы управления памятью в Selena.
Классификация памяти
Описание:
| Метрика | Название | Описание |
|---|---|---|
| process | Общая используемая память BE | |
| query_pool | Память, используемая для выполнения запросов | Состоит из двух частей: память, используемая на уровне выполнения, и память, используемая на уровне хранения. |
| load | Память, используемая для загрузки данных | Обычно MemTable |
| table_meta | Память метаданных | Schema, метаданные Tablet, метаданные RowSet, метаданные Column, ColumnReader, IndexReader |
| compaction | Compaction многоверсионной памяти | compaction, которая происходит после завершения импорта данных |
| snapshot | Память снимков | Обычно используется для clone, малое потребление памяти |
| column_pool | Память пула столбцов | Запрос на освобождение кэша столбцов для ускорения работы со столбцами |
| page_cache | Собственный PageCache BE | По умолчанию отключён, пользователь может включить его, изменив файл BE |
Конфигурация, связанная с памятью
- Конфигурация BE
| Название | По умолчанию | Описание |
|---|---|---|
| vector_chunk_size | 4096 | Количество строк в chunk |
| mem_limit | 90% | Верхний предел памяти процесса BE. Вы можете установить его как процент ("80%") или физический лимит ("100G"). Жёсткий лимит по умолчанию составляет 90% от размера памяти сервера, а мягкий лимит — 80%. Вам необходимо настроить этот параметр, если вы хотите развернуть Selena вместе с другими сервисами, интенсивно использующими память, на одном сервере. |
| disable_storage_page_cache | false | Логическое значение для управления отключением PageCache. Когда PageCache включён, Selena кэширует недавно просканированные данные. PageCache может значительно улучшить производительность запросов при частом повторении похожих запросов. true указывает на отключение PageCache. Используйте этот элемент вместе с storage_page_cache_limit для ускорения производительности запросов в сценариях с достаточными ресурсами памяти и большим объёмом сканирования данных. Значение по умолчанию этого элемента было изменено с true на false начиная с Selena v1.5.2. |
| write_buffer_size | 104857600 | Лимит ёмкости одного MemTable, при превышении которого выполняется сброс на диск. |
| load_process_max_memory_limit_bytes | 107374182400 | Верхний предел ресурсов памяти, которые могут быть заняты всеми процессами загрузки на узле BE. Его значение — меньшее из mem_limit * load_process_max_memory_limit_percent / 100 и load_process_max_memory_limit_bytes. Если этот порог превышен, запускается flush и обратное давление. |
| load_process_max_memory_limit_percent | 30 | Максимальный процент ресурсов памяти, которые могут быть заняты всеми процессами загрузки на узле BE. Его значение — меньшее из mem_limit * load_process_max_memory_limit_percent / 100 и load_process_max_memory_limit_bytes. Если этот порог превышен, запускается flush и обратное давление. |
| default_load_mem_limit | 2147483648 | Если лимит памяти на принимающей стороне достигнут для одного экземпляра импорта, запускается сброс на диск. Это необходимо изменить с помощью переменной сессии load_mem_limit для вступления в силу. Этот параметр является изменяемым, когда включена Event-based Compaction Framework. |
| max_compaction_concurrency | -1 | Максимальный параллелизм compaction (как Base Compaction, так и Cumulative Compaction). Значение -1 указывает, что ограничение на параллелизм не накладывается. |
| cumulative_compaction_check_interval_seconds | 1 | Интервал проверки compaction |
- Переменные сессии
| Название | По умолчанию | Описание |
|---|---|---|
| query_mem_limit | 0 | Лимит памяти запроса на каждом узле BE |
| load_mem_limit | 0 | Лимит памяти одной задачи импорта. Если значение равно 0, берётся exec_mem_limit |
Просмотр использования памяти
- mem_tracker
//Просмотр общей статистики памяти
<http://be_ip:be_http_port/mem_tracker>
// Просмотр детальной статистики памяти
<http://be_ip:be_http_port/mem_tracker?type=query_pool&upper_level=3>
- tcmalloc
<http://be_ip:be_http_port/memz>
------------------------------------------------
MALLOC: 777276768 ( 741.3 MiB) Bytes in use by application
MALLOC: + 8851890176 ( 8441.8 MiB) Bytes in page heap freelist
MALLOC: + 143722232 ( 137.1 MiB) Bytes in central cache freelist
MALLOC: + 21869824 ( 20.9 MiB) Bytes in transfer cache freelist
MALLOC: + 832509608 ( 793.9 MiB) Bytes in thread cache freelists
MALLOC: + 58195968 ( 55.5 MiB) Bytes in malloc metadata
MALLOC: ------------
MALLOC: = 10685464576 (10190.5 MiB) Actual memory used (physical + swap)
MALLOC: + 25231564800 (24062.7 MiB) Bytes released to OS (aka unmapped)
MALLOC: ------------
MALLOC: = 35917029376 (34253.1 MiB) Virtual address space used
MALLOC:
MALLOC: 112388 Spans in use
MALLOC: 335 Thread heaps in use
MALLOC: 8192 Tcmalloc page size
------------------------------------------------
Call ReleaseFreeMemory() to release freelist memory to the OS (via madvise()).
Bytes released to the OS take up virtual address space but no physical memory.
Память, запрашиваемая этим методом, является точной. Однако некоторая память в Selena зарезервирована, но не используется. TcMalloc подсчитывает зарезервированную память, а не используемую.
Здесь Bytes in use by application относится к памяти, которая в данный момент используется.
- metrics
curl -XGET http://be_ip:be_http_port/metrics | grep 'mem'
curl -XGET http://be_ip:be_http_port/metrics | grep 'column_pool'
Значение metrics обновляется каждые 10 секунд. Возможно отслеживать некоторые статистики памяти со старыми версиями.