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.