25.4.3.13 Управление памятью узла данных
Все выделение памяти для узла данных выполняется при запуске узла. Это гарантирует, что узел данных может работать стабильно без использования памяти подкачки, чтобы NDB можно было использовать для приложений с чувствительной к задержке (режим реального времени) работой. При запуске узла данных выделяются следующие типы памяти:
Память данных
Общая глобальная память
Буферы журналов отката
Буферы задач
Буферы отправки
Кэш страниц для записей данных на диске
Память транзакций схемы
Память транзакций
Буфер журнала отмены
Память запросов
Объекты блоков
Память схемы
Структуры данных блоков
Память длинного сигнала
Буферы обмена памяти общего пользования
Менеджер памяти NDB, который регулирует большую часть памяти узла данных, обрабатывает следующие ресурсы памяти:
Память данных (
DataMemory)Буферы журналов отката (
RedoBuffer)Буферы задач
Буферы отправки (
SendBufferMemory,TotalSendBufferMemory,ExtraSendBufferMemory)Кэш страниц записей данных на диске (
DiskPageBufferMemory,DiskPageBufferEntries)Память транзакций (
TransactionMemory)Память запросов
Записи доступа к диску
Буферы файлов
Каждый из этих ресурсов настраивается с выделенной областью памяти и максимальной областью памяти. Выделенная область памяти может использоваться только этим ресурсом и не может быть совмещена с другими ресурсами; данный ресурс никогда не может выделять больше памяти, чем разрешено для этого ресурса. Ресурс, у которого нет максимального размера памяти, может расширяться, используя всю общую память в менеджере памяти.
Размер общей глобальной памяти для этих ресурсов контролируется параметром конфигурации SharedGlobalMemory (по умолчанию: 128 МБ).
Память данных всегда выделяется и никогда не получает память из общей памяти. Она контролируется с помощью параметра конфигурации DataMemory, максимальный размер которого составляет 16384 ГБ. DataMemory хранит записи, включая хеш-индексы (приблизительно 15 байт на строку), упорядоченные индексы (10-12 байт на строку на индекс) и заголовки строк (16-32 байта на строку).
Буферы журналов отката также используют только выделенную память; это контролируется параметром конфигурации RedoBuffer, который устанавливает размер буфера журнала отката на поток LDM. Это означает, что фактическое количество используемой памяти равно значению этого параметра, умноженному на количество потоков LDM в узле данных.
Буферы задач используют только выделенную память; размер этой памяти рассчитывается NDB на основе количества потоков различных типов.
Буферы отправки имеют выделенную часть, но также могут выделять дополнительные 25% общей глобальной памяти. Выделенный размер буфера отправки рассчитывается в два этапа:
Используется значение параметра конфигурации
TotalSendBufferMemory(значение по умолчанию отсутствует) или сумма отдельных буферов отправки, используемых всеми отдельными подключениями к узлу данных. Узел данных подключен ко всем другим узлам данных, ко всем узлам API и ко всем узлам управления. Это означает, что в кластере с 2 узлами данных, 2 узлами управления и 10 узлами API каждый узел данных имеет 13 подключений к узлам. Поскольку значение по умолчанию дляSendBufferMemoryдля подключения узла данных составляет 2 МБ, это составляет 26 МБ в общей сложности.Чтобы получить общий выделенный размер буфера отправки, к значению, полученному на предыдущем шаге, добавляется значение параметра конфигурации
ExtraSendBufferMemory, если таковое имеется (значение по умолчанию 0).
Другими словами, если TotalSendBufferMemory установлено, размер буфера отправки равен TotalSendBufferMemory
+ ExtraSendBufferMemory; в противном случае размер буфера отправки равен ([.number of node
connections] * SendBufferMemory) +
ExtraSendBufferMemory
Кэш страниц для записей данных на диске использует только выделенный ресурс; размер этого ресурса контролируется параметром конфигурации DiskPageBufferMemory (значение по умолчанию 64 МБ). Также выделяется память для записей страниц диска размером 32 КБ; количество таких записей определяется параметром конфигурации DiskPageBufferEntries (значение по умолчанию 10).
Память транзакций имеет выделенную часть, которая либо рассчитывается NDB, либо задается явно с помощью параметра конфигурации TransactionMemory; память транзакций также может использовать неограниченное количество общей глобальной памяти. Память транзакций используется для всех операционных ресурсов, обрабатывающих транзакции, сканирования, блокировки, буферов сканирования и операций триггеров. Она также содержит строки таблиц по мере их обновления до следующего сохранения, прежде чем следующие записи запишутся в память данных.
Ресурсы выделяются из общего ресурса памяти транзакций и также могут использовать ресурсы из общей глобальной памяти. Размер этого ресурса можно контролировать с помощью единственного параметра конфигурации TransactionMemory.
Выделенную память для буферов журнала отмены можно установить, используя параметр конфигурации InitialLogFileGroup. Если буфер журнала отмены создается в рамках оператора SQL CREATE LOGFILE GROUP, память берется из памяти транзакций.
Некоторые ресурсы, связанные с метаданными для ресурсов данных на диске, также не имеют выделенной части и используют только общую глобальную память. Таким образом, общая глобальная память разделяется между буферами отправки, памятью транзакций и метаданными ресурсов данных на диске.
Если TransactionMemory не задан, он рассчитывается на основе следующих параметров:
Когда TransactionMemory задано явно, ни один из перечисленных параметров конфигурации не используется для расчета размера памяти. Кроме того, параметры MaxNoOfConcurrentIndexOperations, MaxNoOfFiredTriggers, MaxNoOfLocalOperations и MaxNoOfLocalScans несовместимы с TransactionMemory и не могут быть установлены одновременно с ним; если TransactionMemory установлено, а любой из этих четырех параметров также установлен в файле конфигурации config.ini, сервер управления не может запуститься.
Параметры MaxNoOfConcurrentIndexOperations, MaxNoOfFiredTriggers, MaxNoOfLocalOperations и MaxNoOfLocalScans устарели; ожидайте их удаления в будущих версиях MySQL NDB Cluster.
Ресурс памяти транзакций содержит большое количество пулов памяти. Каждый пул памяти представляет тип объекта и содержит набор объектов; каждый пул включает зарезервированную часть, выделенную пулу при запуске; эта зарезервированная память никогда не возвращается в общую глобальную память. Зарезервированные записи находятся с помощью структуры данных, имеющей только один уровень для быстрого поиска, что означает, что необходимо зарезервировать определенное количество записей в каждом пуле. Количество зарезервированных записей в каждом пуле оказывает некоторое влияние на производительность и выделение зарезервированной памяти, но обычно необходимо только в некоторых очень сложных случаях, чтобы явно задать размеры резервирования.
Размер зарезервированной части пула можно контролировать, установив следующие параметры конфигурации:
Для любого из перечисленных параметров, который не задан явно в config.ini, значение резервирования рассчитывается как 25% от соответствующего максимального значения. Например, если не задано, ReservedConcurrentIndexOperations рассчитывается как 25% от MaxNoOfConcurrentIndexOperations, а ReservedLocalScans рассчитывается как 25% от MaxNoOfLocalScans.
Если ReservedTransactionBufferMemory не задан, он рассчитывается как 25% от TransactionBufferMemory.
Количество зарезервированных записей относится к каждому узлу данных; эти записи распределяются между потоками, обрабатывающими их (потоки LDM и TC) на каждом узле. В большинстве случаев достаточно установить только TransactionMemory, чтобы позволить количеству записей в пулах управляться этим значением.
MaxNoOfConcurrentScans ограничивает количество одновременных сканирований, которые могут быть активными в каждом потоке TC. Это важно для защиты от перегрузки кластера.
MaxNoOfConcurrentOperations ограничивает количество операций, которые могут быть активными одновременно при обновлении транзакций. (Простые чтения не влияют на этот параметр.) Это число необходимо ограничивать, так как для обработки сбоев узлов требуется предварительно выделить память, и ресурс должен быть доступен для обработки максимального количества активных операций в одном потоке TC при столкновении с сбоями узлов. Крайне важно, чтобы MaxNoOfConcurrentOperations был установлен в одно и то же значение на всех узлах (это проще всего сделать, установив значение один раз в разделе [ndbd
default] файла глобальной конфигурации config.ini). Хотя его значение можно увеличить с помощью поэтапной перезагрузки (см. Раздел 25.6.5, «Выполнение поэтапной перезагрузки кластера NDB»), уменьшать его таким образом не считается безопасным из-за возможности сбоя узла во время поэтапной перезагрузки.
Можно ограничить размер одной транзакции в NDB Cluster через параметр MaxDMLOperationsPerTransaction. Если этот параметр не установлен, размер одной транзакции ограничен MaxNoOfConcurrentOperations, так как этот параметр ограничивает общее количество одновременных операций на поток TC.
Размер памяти схемы контролируется следующим набором параметров конфигурации:
Количество узлов и количество потоков LDM также сильно влияют на размер памяти схемы, так как количество разделов в каждой таблице и каждом разделе (и его фрагментных репликах) необходимо представить в памяти схемы.
Кроме того, при запуске выделяется ряд других записей. Они относительно небольшие. Каждый блок в каждом потоке содержит объекты блоков, которые используют память. Размер этой памяти также обычно невелик по сравнению с другими структурами памяти узла данных.
© 2025 Oracle
Licensed under the GPLv2 License.