14.5.1 Пул буферов
Пул буферов — это область в оперативной памяти, где InnoDB кэширует данные таблиц и индексов по мере их использования. Пул буферов позволяет получать доступ к часто используемым данным непосредственно из памяти, что ускоряет обработку. На выделенных серверах часто до 80% физической памяти назначается пулу буферов.
Для повышения эффективности операций чтения с высокой интенсивностью пул буферов делится на страницы, которые потенциально могут содержать несколько строк. Для повышения эффективности управления кэшем пул буферов реализован как связанный список страниц; данные, которые редко используются, удаляются из кэша с использованием модифицированного алгоритма «наименее недавно используемого» (LRU).
Знание того, как использовать пул буферов для хранения часто используемых данных в памяти, является важным аспектом настройки MySQL.
Алгоритм LRU пула буферов
Пул буферов управляется как список с использованием модифицированного алгоритма LRU. Когда необходимо место для добавления новой страницы в пул буферов, наименее недавно используемая страница удаляется, а новая страница добавляется в середину списка. Эта стратегия вставки в середину списка рассматривает список как два подсписка:
В начале — подсписок новых (“молодых”) страниц, к которым недавно обращались
В конце — подсписок старых страниц, к которым обращались реже
Рисунок 14.2 Список пула буферов
Алгоритм сохраняет часто используемые страницы в новом подсписке. Старый подсписок содержит страницы, к которым обращались реже; эти страницы являются кандидатами для .
По умолчанию алгоритм работает следующим образом:
3/8 пула буферов выделяется для старого подсписка.
Середина списка является границей, где хвост нового подсписка встречается с началом старого подсписка.
Когда
InnoDBсчитывает страницу в пул буферов, она первоначально вставляет ее в середину (начало старого подсписка). Страница может быть считана, поскольку она требуется для операции, инициированной пользователем, например, SQL-запроса, или в рамках операции, выполняемой автоматическиInnoDB.Обращение к странице в старом подсписке делает ее “молодой”, перемещая ее в начало нового подсписка. Если страница была прочитана потому, что она потребовалась для операции, инициированной пользователем, первое обращение происходит немедленно, и страница становится молодой. Если страница была прочитана из-за операции предварительного чтения, первое обращение не происходит немедленно и может вообще не произойти до того, как страница будет удалена.
По мере работы базы данных страницы в пуле буферов, к которым не обращаются, “стареют”, перемещаясь к хвосту списка. Страницы в обоих подсписках стареют по мере того, как другие страницы становятся новыми. Страницы в старом подсписке также стареют, поскольку страницы вставляются в середину. В конечном итоге страница, которая остается неиспользуемой, достигает хвоста старого подсписка и удаляется.
По умолчанию страницы, считанные запросами, немедленно перемещаются в новый подсписок, что означает, что они остаются в пуле буферов дольше. Например, сканирование таблицы, выполняемое для операции mysqldump или оператора SELECT без предложения WHERE, может загрузить большое количество данных в пул буферов и удалить эквивалентное количество более старых данных, даже если новые данные никогда больше не будут использоваться. Аналогично, страницы, загруженные фоновым потоком предварительного чтения и использовавшиеся только один раз, перемещаются в начало нового списка. Эти ситуации могут вытеснять часто используемые страницы в старый подсписок, где они могут быть удалены. Подробнее об оптимизации этого поведения см. Раздел 14.8.3.3, «Защита пула буферов от сканирования» и Раздел 14.8.3.4, «Настройка предварительной выборки пула буферов InnoDB (предварительное чтение)».
InnoDB Стандартный вывод монитора содержит несколько полей в разделе BUFFER POOL AND MEMORY, относящихся к работе алгоритма LRU пула буферов. Подробности см. в Разделе мониторинга пула буферов с помощью стандартного монитора InnoDB.
Настройка пула буферов
Вы можете настроить различные аспекты пула буферов для повышения производительности.
В идеале вы задаёте размер пула буферов как можно больше, оставляя достаточно памяти для работы других процессов на сервере без чрезмерного обмена страницами. Чем больше пул буферов, тем больше
InnoDBдействует как база данных в оперативной памяти, читая данные с диска один раз, а затем обращаясь к данным из памяти при последующих чтении. См. Раздел 14.8.3.1, «Настройка размера пула буферов InnoDB».На 64-разрядных системах с достаточным объемом памяти вы можете разделить пул буферов на несколько частей, чтобы свести к минимуму конкуренцию за структуры памяти среди одновременных операций. Подробности см. в Разделе 14.8.3.2, «Настройка нескольких экземпляров пула буферов».
Вы можете сохранять часто используемые данные в памяти независимо от внезапных пиковых нагрузок от операций, которые загружали бы в пул буферов большое количество редко используемых данных. Подробности см. в Разделе 14.8.3.3, «Защита пула буферов от сканирования».
Вы можете управлять тем, как и когда выполнять запросы предварительного чтения для асинхронной предварительной выборки страниц в пул буферов в ожидании их скорого использования. Подробности см. в Разделе 14.8.3.4, «Настройка предварительной выборки пула буферов InnoDB (предварительное чтение)».
Вы можете управлять тем, когда происходит фоновое сброс, и регулировать ли скорость сброса динамически в зависимости от рабочей нагрузки. Подробности см. в Разделе 14.8.3.5, «Настройка сброса пула буферов».
Вы можете настроить, как
InnoDBсохраняет текущее состояние пула буферов, чтобы избежать длительного периода подготовки после перезагрузки сервера. Подробности см. в Разделе 14.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 стандартного монитора.
Таблица 14.2 Метрики буфера пула InnoDB
| Название | Описание |
|---|---|
| Общий объём выделенной памяти | Общий объём выделенной памяти для буфера пула в байтах. |
| Память, выделенная для словаря | Общий объём памяти, выделенной для InnoDB данных словаря, в байтах. |
| Размер буфера пула | Общий размер, выделенный для буфера пула в страницах. |
| Свободные буферы | Общий объём в страницах свободной части списка буфера пула. |
| Страницы баз данных | Общий объём в страницах списка буфера пула LRU. |
| Старые страницы баз данных | Общий объём в страницах подсписка буфера пула старых LRU. |
| Изменённые страницы БД | Текущее количество изменённых страниц в буферном пуле. |
| Ожидаемые чтения | Количество страниц буфера пула, ожидающих чтения в буферный пул. |
| Ожидаемые записи LRU | Количество старых грязных страниц в буферном пуле, подлежащих записи из нижней части списка LRU. |
| Ожидаемые записи в списке сброса | Количество страниц буфера пула, подлежащих сбросу во время создания моментальных снимков. |
| Ожидаемые записи отдельной страницы | Количество ожидающих независимых записей страниц в пределах буфера пула. |
| Страницы, помеченные как молодые | Общее количество страниц, помеченных как молодые в списке LRU буфера пула (перемещены в начало подсписка страниц «“новые”»). |
| Страницы, не помеченные как молодые | Общее количество страниц, не помеченных как молодые в списке LRU буфера пула (страницы, оставшиеся в подсписке «“старые” без пометки как молодые). |
| youngs/с | Среднее значение в секунду доступа к старым страницам в списке LRU буфера пула, приведшее к пометке страниц как молодых. См. примечания после этой таблицы для получения дополнительной информации. |
| non-youngs/с | Среднее значение в секунду доступа к старым страницам в списке LRU буфера пула, не приведшее к пометке страниц как молодых. См. примечания после этой таблицы для получения дополнительной информации. |
| Прочитанные страницы | Общее количество страниц, прочитанных из буфера пула. |
| Созданные страницы | Общее количество страниц, созданных в буферном пуле. |
| Записанные страницы | Общее количество страниц, записанных из буферного пула. |
| чтений/с | Среднее значение в секунду числа чтений страниц буфера пула в секунду. |
| созданий/с | Среднее число страниц буфера пула, созданных в секунду. |
| записей/с | Среднее число страниц буфера пула, записанных в секунду. |
| Коэффициент попадания в буферный пул | Коэффициент попадания в буферный пул при чтении страниц из буфера пула по сравнению с чтением из дискового хранилища. |
| Скорость помечания страниц как молодых | Средний коэффициент попадания, при котором доступ к страницам привел к пометке их как молодых. См. примечания после таблицы для получения дополнительной информации. |
| Скорость (не помечая как молодые) | Средний коэффициент попадания, при котором доступ к страницам не привел к пометке их как молодых. См. примечания после таблицы для получения дополнительной информации. |
| Страницы чтения вперед | Среднее значение в секунду операций чтения вперед. |
| Страницы, удалённые без доступа | Среднее значение в секунду страниц, удаленных из буферного пула без доступа. |
| Случайное чтение вперед | Среднее значение в секунду случайных операций чтения вперед. |
| LRU len | Общий объём в страницах списка LRU буферного пула. |
| unzip_LRU len | Длина (в страницах) списка unzip_LRU буферного пула. |
| Сумма операций ввода/вывода | Общее количество страниц списка LRU буферного пула, к которым был доступ. |
| Текущие операции ввода/вывода | Общее количество страниц списка LRU буферного пула, к которым был доступ в текущем интервале. |
| Сумма операций ввода/вывода unzip | Общее количество страниц списка unzip_LRU буферного пула, распакованных. |
| Текущие операции ввода/вывода unzip | Общее количество страниц списка unzip_LRU буферного пула, распакованных в текущем интервале. |
Примечания:
Метрика
youngs/sприменима только к старым страницам. Она основана на количестве обращений к страницам. Может быть несколько обращений к одной странице, все они учитываются. Если вы видите очень низкие значенияyoungs/s, когда не происходит больших сканирований, рассмотрите возможность уменьшения времени ожидания или увеличения процента буферного пула, используемого для подсписка старых страниц. Увеличение процента увеличивает размер подсписка старых страниц, что замедляет перемещение страниц в этом подсписке в хвост, что увеличивает вероятность повторного доступа к этим страницам и пометки их как молодых. См. Раздел 14.8.3.3, «Делаем буферный пул устойчивым к сканированию».Метрика
non-youngs/sприменима только к старым страницам. Она основана на количестве обращений к страницам. Может быть несколько обращений к одной странице, все они учитываются. Если вы не видите более высокого значенияnon-youngs/sпри выполнении больших сканирований таблиц (и более высокого значенияyoungs/s), увеличьте значение задержки. См. Раздел 14.8.3.3, «Делаем буферный пул устойчивым к сканированию».Коэффициент
young-makingучитывает все обращения к страницам буфера пула, а не только обращения к страницам в подсписке старых страниц. Коэффициентyoung-makingи коэффициентnotобычно не суммируются с общим коэффициентом попадания в буферный пул. Попадания страниц в подсписок старых страниц приводят к перемещению страниц в подсписок новых страниц, но попадания страниц в подсписок новых страниц приводят к перемещению страниц в начало списка только если они находятся на определённом расстоянии от начала.not (young-making rate)— средний коэффициент попадания, при котором доступ к страницам не привел к пометке их как молодых из-за того, что не было выполнено условие, заданное параметромinnodb_old_blocks_time, или из-за попаданий страниц в подсписок новых страниц, не повлекших за собой перемещение страниц в начало списка. Этот коэффициент учитывает все обращения к страницам буфера пула, а не только обращения к страницам в подсписке старых страниц.
Множество метрик буфера пула, которые можно найти в выводе InnoDB стандартного монитора, также предоставляются переменными состояния сервера сервера и таблицей INNODB_BUFFER_POOL_STATS. Дополнительную информацию см. в Примере 14.10, «Запрос таблицы INNODB_BUFFER_POOL_STATS».
© 2025 Oracle
Licensed under the GPLv2 License.