Spec-Zone.ru › MySQL 8.4

17.5.1 Пул буфера

Пул буфера — это область в оперативной памяти, где InnoDB кеширует данные таблиц и индексов по мере их доступа. Пул буфера позволяет получать доступ к часто используемым данным непосредственно из памяти, что ускоряет обработку. На выделенных серверах часто до 80% физической памяти выделяется под пул буфера.

Для повышения эффективности операций чтения с большой нагрузкой пул буфера разделен на страницы, которые потенциально могут содержать несколько строк. Для повышения эффективности управления кэшем пул буфера реализован как связанный список страниц; данные, которые редко используются, вытесняются из кэша с использованием модифицированного алгоритма наименее часто используемого (LRU).

Знание того, как использовать пул буфера для сохранения часто используемых данных в памяти, является важным аспектом настройки MySQL.

Алгоритм LRU пула буфера

Пул буфера управляется как список с использованием модифицированного алгоритма LRU. Когда требуется место для добавления новой страницы в пул буфера, наименее недавно используемая страница вытесняется, а новая страница добавляется в середину списка. Эта стратегия вставки в середину рассматривает список как два подсписка:

  • В начале — подсписок новых (“молодых”) страниц, к которым недавно обращались

  • В конце — подсписок старых страниц, к которым обращались менее недавно

Рисунок 17.2 Список пула буфера

Content is described in the surrounding text.

Алгоритм сохраняет часто используемые страницы в новом подсписке. Старый подсписок содержит менее часто используемые страницы; эти страницы являются кандидатами на .

По умолчанию алгоритм работает следующим образом:

  • 3/8 пула буфера выделяется для старого подсписка.

  • Середина списка — граница, где хвост нового подсписка встречается с началом старого подсписка.

  • Когда InnoDB считывает страницу в пул буфера, он первоначально вставляет её в середину (начало старого подсписка). Страница может быть считана, потому что она требуется для операции, инициированной пользователем, такой как SQL-запрос, или как часть операции, выполняемой автоматически InnoDB.

  • Обращение к странице в старом подсписке делает её “молодой”, перемещая её в начало нового подсписка. Если страница была считана, потому что она была необходима для операции, инициированной пользователем, первое обращение происходит немедленно, и страница становится молодой. Если страница была считана из-за операции предварительного чтения, первое обращение не происходит немедленно и может вообще не произойти до вытеснения страницы.

  • По мере работы базы данных страницы в пуле буфера, к которым не обращаются, «стареют», перемещаясь к концу списка. Страницы как в новом, так и в старом подсписках стареют, когда другие страницы становятся новыми. Страницы в старом подсписке также стареют по мере вставки новых страниц в середину. В конечном итоге страница, которая остаётся неиспользуемой, достигает конца старого подсписка и вытесняется.

По умолчанию страницы, прочитанные запросами, немедленно перемещаются в новый подсписок, что означает, что они остаются в пуле буфера дольше. Сканирование таблицы, выполненное для операции mysqldump или оператора SELECT без предложения WHERE, например, может загрузить большое количество данных в пул буфера и вытеснить эквивалентное количество более старых данных, даже если новые данные никогда не будут использоваться. Аналогично, страницы, загруженные фоновым потоком предварительного чтения и используемые только один раз, перемещаются в начало нового списка. Эти ситуации могут перемещать часто используемые страницы в старый подсписок, где они становятся объектом вытеснения. Дополнительную информацию об оптимизации этого поведения см. в разделе 17.8.3.3 «Защита пула буфера от сканирования» и разделе 17.8.3.4 «Настройка предварительной выборки из пула буфера InnoDB (предварительное чтение)».

InnoDB Стандартный вывод монитора содержит несколько полей в разделе BUFFER POOL AND MEMORY, касающихся работы алгоритма LRU пула буфера. Дополнительные сведения см. в разделе о мониторинге пула буфера с помощью стандартного монитора InnoDB.

Настройка пула буфера

Вы можете настроить различные аспекты пула буфера для повышения производительности.

  • В идеале вы устанавливаете размер пула буфера как можно больше, оставляя достаточно памяти для других процессов на сервере, чтобы они выполнялись без чрезмерной подкачки. Чем больше пул буфера, тем больше InnoDB ведет себя как база данных в оперативной памяти, читая данные с диска один раз, а затем обращаясь к данным из памяти при последующих чтениях. См. раздел 17.8.3.1 «Настройка размера пула буфера InnoDB».

  • На 64-разрядных системах с достаточным объемом оперативной памяти вы можете разделить пул буфера на несколько частей, чтобы свести к минимуму конкуренцию за структуры памяти между параллельными операциями. Подробности см. в разделе 17.8.3.2 «Настройка нескольких экземпляров пула буфера».

  • Вы можете сохранять часто используемые данные в памяти, независимо от внезапных скачков активности от операций, которые загружают в пул буфера большое количество данных, к которым редко обращаются. Подробности см. в разделе 17.8.3.3 «Защита пула буфера от сканирования».

  • Вы можете контролировать, как и когда выполнять запросы предварительного чтения, чтобы асинхронно загружать страницы в пул буфера в предвидении их будущей необходимости. Подробности см. в разделе 17.8.3.4 «Настройка предварительной выборки из пула буфера InnoDB (предварительное чтение)».

  • Вы можете контролировать, когда происходит фоновая очистка, и в том числе, регулировать ли скорость очистки динамически в зависимости от рабочей нагрузки. Дополнительные сведения см. в разделе 17.8.3.5 «Настройка очистки пула буфера».

  • Вы можете настроить, как InnoDB сохраняет текущее состояние пула буфера, чтобы избежать длительного периода прогрева после перезагрузки сервера. Подробности см. в разделе 17.8.3.6 «Сохранение и восстановление состояния пула буфера».

Мониторинг буфера пула InnoDB с помощью стандартного монитора

InnoDB Вывод стандартного монитора, к которому можно получить доступ, используя SHOW ENGINE INNODB STATUS, предоставляет метрики, касающиеся работы буфера пула. Метрики буфера пула находятся в разделе BUFFER POOL AND MEMORY вывода InnoDB стандартного монитора:

----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 2198863872
Dictionary memory allocated 776332
Buffer pool size   131072
Free buffers       124908
Database pages     5720
Old database pages 2071
Modified db pages  910
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 4, not young 0
0.10 youngs/s, 0.00 non-youngs/s
Pages read 197, created 5523, written 5060
0.00 reads/s, 190.89 creates/s, 244.94 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not
0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read
ahead 0.00/s
LRU len: 5720, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

В следующей таблице описаны метрики буфера пула, предоставляемые InnoDB стандартным монитором.

Средние значения за секунду, предоставляемые в выводе InnoDB стандартного монитора, основаны на прошедшем времени с момента последнего вывода InnoDB стандартного монитора.

Таблица 17.2 Метрики буфера пула InnoDB

Таблица 17.2 Метрики буфера пула InnoDB
Имя Описание
Занятая память в общем Общая память, выделенная для буфера пула в байтах.
Занятая память словаря Общая память, выделенная для InnoDB словаря данных в байтах.
Размер буфера пула Общий размер, выделенный для буфера пула в страницах.
Свободные буферы Общий размер свободной области буфера пула в страницах.
Страницы базы данных Общий размер списка LRU буфера пула в страницах.
Старые страницы базы данных Общий размер подсписка LRU буфера пула (старых страниц) в страницах.
Изменённые страницы БД Текущее количество изменённых страниц в буфере пула.
Ожидаемые чтения Количество страниц буфера пула, ожидающих чтения в буфер пул.
Ожидаемые записи LRU Количество старых грязных страниц в буфере пуле, которые должны быть записаны с конца списка LRU.
Ожидаемые записи списка записи Количество страниц буфера пула, которые должны быть записаны во время создания точки восстановления.
Ожидаемые записи отдельных страниц Количество ожидаемых независимых записей страниц в буфере пуле.
Страницы, помеченные как новые Общее количество страниц, помеченных как новые в списке LRU буфера пула (перемещённые в начало подсписка «новых» страниц).
Страницы, не помеченные как новые Общее количество страниц, не помеченных как новые в списке LRU буфера пула (страницы, оставшиеся в подсписке «старых» без перевода в «новые»).
youngs/с Среднее значение за секунду доступа к старым страницам в списке LRU буфера пула, которые привели к маркировке страниц как новых. См. примечания ниже этой таблицы для получения дополнительной информации.
non-youngs/с Среднее значение за секунду доступа к старым страницам в списке LRU буфера пула, которые не привели к маркировке страниц как новых. См. примечания ниже этой таблицы для получения дополнительной информации.
Прочитанные страницы Общее количество страниц, прочитанных из буфера пула.
Созданные страницы Общее количество страниц, созданных в буфере пуле.
Записанные страницы Общее количество страниц, записанных из буфера пула.
чтения/с Среднее значение за секунду чтения страниц буфера пула в секунду.
создания/с Среднее количество страниц буфера пула, созданных в секунду.
записи/с Среднее значение за секунду записи страниц буфера пула в секунду.
Процент попаданий в буфер пул Процент попаданий в буфер пула при чтении страниц из буфера пула по сравнению с чтением со средства хранения данных.
Скорость маркировки страниц как новых Среднее значение процента попаданий в буфер пула, в результате которых страницы были помечены как новые. См. примечания под этой таблицей для дополнительной информации.
Скорость (не маркировка как новые) Среднее значение процента попаданий в буфер пула, в результате которых страницы не были помечены как новые. См. примечания под этой таблицей для дополнительной информации.
Страницы чтения вперёд Среднее значение за секунду операций чтения вперёд.
Страницы, удалённые без доступа Среднее значение за секунду страниц, удалённых из буфера пула без доступа к ним.
Случайное чтение вперёд Среднее значение за секунду операций случайного чтения вперёд.
Длина LRU Общий размер списка LRU буфера пула в страницах.
Длина unzip_LRU Длина списка unzip_LRU буфера пула (в страницах).
Сумма I/O Общее количество страниц списка LRU буфера пула, к которым был доступ.
Текущее I/O Общее количество страниц списка LRU буфера пула, к которым был доступ в текущем интервале.
Сумма I/O unzip Общее количество страниц списка unzip_LRU буфера пула, распакованных.
Текущее I/O unzip Общее количество страниц списка unzip_LRU буфера пула, распакованных в текущем интервале.

Примечания:

  • Метрика youngs/s применима только к старым страницам. Она основана на количестве обращений к страницам. Может быть несколько обращений к одной странице, все они считаются. Если вы видите очень низкие значения youngs/s, когда нет крупных сканирований, рассмотрите возможность уменьшения времени задержки или увеличения процента буфера пула, используемого для подсписка старых страниц. Увеличение процента делает подсписок старых страниц больше, поэтому страницам в этом подсписке требуется больше времени, чтобы переместиться в хвост, что увеличивает вероятность того, что к этим страницам будет снова обращение и они будут помечены как новые. См. Раздел 17.8.3.3, «Защита буфера пула от сканирования».

  • Метрика non-youngs/s применима только к старым страницам. Она основана на количестве обращений к страницам. Может быть несколько обращений к одной странице, все они считаются. Если вы не видите более высокое значение non-youngs/s при выполнении больших сканирований таблиц (и более высокое значение youngs/s), увеличьте значение задержки. См. Раздел 17.8.3.3, «Защита буфера пула от сканирования».

  • Скорость young-making учитывает все обращения к страницам буфера пула, а не только обращения к страницам в подсписке старых страниц. Скорость young-making и скорость not обычно не складываются до общей скорости попаданий в буфер пула. Попадания в подсписок старых страниц перемещают страницы в новый подсписок, но попадания в новый подсписок перемещают страницы в начало списка только если они находятся на определённом расстоянии от начала.

  • not (young-making rate) — это средняя скорость попаданий, при которой обращения к страницам не привели к маркировке страниц как новых из-за того, что не было удовлетворено значение задержки, определённое параметром innodb_old_blocks_time, или из-за попаданий в новый подсписок, которые не привели к перемещению страниц в начало. Эта скорость учитывает все обращения к страницам буфера пула, а не только обращения к страницам в подсписке старых страниц.

Переменные состояния сервера сервера и таблица INNODB_BUFFER_POOL_STATS содержат многие те же метрики буфера пула, что и InnoDB вывод стандартного монитора. Более подробную информацию можно найти в Примере 17.10, «Запрос к таблице INNODB_BUFFER_POOL_STATS».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/innodb-buffer-pool.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API