17.8.3.5 Настройка сброса буфера пула
InnoDB выполняет определённые задачи в фоновом режиме, включая сброс грязных страниц из буфера пула. Грязные страницы — это те, которые были изменены, но ещё не записаны в файлы данных на диске.
Сброс буфера пула выполняется потоками очистки страниц. Количество потоков очистки страниц контролируется переменной innodb_page_cleaners, которая по умолчанию имеет значение, совпадающее со значением переменной innodb_buffer_pool_instances.
Сброс буфера пула инициируется, когда процент грязных страниц достигает нижней отметки, определённой переменной innodb_max_dirty_pages_pct_lwm. По умолчанию нижняя отметка составляет 10% страниц буфера пула. Значение innodb_max_dirty_pages_pct_lwm, равное 0, отключает данное раннее поведение сброса.
Цель порога innodb_max_dirty_pages_pct_lwm заключается в контроле процента грязных страниц в буфере пула и предотвращении достижения количества грязных страниц порога, определённого переменной innodb_max_dirty_pages_pct, которая по умолчанию имеет значение 90. InnoDB агрессивно сбрасывает страницы буфера пула, если процент грязных страниц в буфере пула достигает порога innodb_max_dirty_pages_pct.
При настройке innodb_max_dirty_pages_pct_lwm значение всегда должно быть меньше значения innodb_max_dirty_pages_pct.
Дополнительные переменные позволяют утончённо настроить поведение сброса буфера пула:
-
Переменная
innodb_flush_neighborsопределяет, будет ли сброс страницы из буфера пула также приводить к сбросу других грязных страниц в том же объёме.Значение по умолчанию 0 отключает
innodb_flush_neighbors. Грязные страницы в том же объёме не сбрасываются. Это значение рекомендуется для невращающихся накопителей (SSD), где время поиска не является значительным фактором.Значение 1 сбрасывает смежные грязные страницы в том же объёме.
Значение 2 сбрасывает грязные страницы в том же объёме.
Когда данные таблицы хранятся на традиционном накопителе, сброс соседних страниц в одной операции уменьшает нагрузку на ввод-вывод (в основном для операций поиска на диске) по сравнению со сбросом отдельных страниц в разное время. Для табличных данных, хранящихся на , время поиска не является значительным фактором, и вы можете отключить это значение, чтобы распределить операции записи.
-
Переменная
innodb_lru_scan_depthуказывает, на сколько в списке LRU буфера пула поток очистки страниц просматривает, ища грязные страницы для сброса. Это фоновая операция, выполняемая потоком очистки страниц один раз в секунду.Значение, меньшее, чем значение по умолчанию, обычно подходит для большинства рабочих нагрузок. Значение, значительно большее, чем необходимо, может повлиять на производительность. Рассмотрите увеличение значения только в том случае, если у вас есть свободные ресурсы ввода-вывода при типичной рабочей нагрузке. Напротив, если рабочая нагрузка с интенсивными операциями записи насыщает ваши ресурсы ввода-вывода, уменьшите значение, особенно в случае большого буфера пула.
При настройке
innodb_lru_scan_depthначните с низкого значения и увеличивайте его, стремясь к тому, чтобы редко видеть нулевое количество свободных страниц. Также рассмотрите корректировкуinnodb_lru_scan_depthпри изменении количества экземпляров буфера пула, так какinnodb_lru_scan_depth*innodb_buffer_pool_instancesопределяет объём работы, выполняемой потоком очистки страниц каждую секунду.
Переменные innodb_flush_neighbors и innodb_lru_scan_depth предназначены в первую очередь для рабочих нагрузок с интенсивными операциями записи. При интенсивной активности DML сброс может отставать, если он недостаточно агрессивный, или операции записи на диск могут насытить ресурсы ввода-вывода, если сброс слишком агрессивный. Идеальные значения зависят от вашей рабочей нагрузки, шаблонов доступа к данным и конфигурации хранилища (например, хранятся ли данные на HDD или SSD устройствах).
Адаптивный сброс
InnoDB использует алгоритм адаптивного сброса для динамической регулировки скорости сброса на основе скорости генерации журнала переигрывания и текущей скорости сброса. Цель заключается в сглаживании общей производительности, гарантируя, что активность сброса соответствует текущей рабочей нагрузке. Автоматическая регулировка скорости сброса помогает избежать резких падений пропускной способности, которые могут возникнуть, когда всплески активности ввода-вывода из-за сброса буфера пула влияют на ресурсы ввода-вывода, доступные для обычных операций чтения и записи.
Например, резкие контрольные точки, которые обычно связаны с рабочими нагрузками с интенсивными операциями записи, которые генерируют много записей журнала переигрывания, могут вызвать резкое изменение пропускной способности. Резкая контрольная точка возникает, когда InnoDB хочет повторно использовать часть файла журнала. Перед этим все грязные страницы с записями журнала переигрывания в этой части файла журнала должны быть сброшены. Если файлы журнала заполняются, возникает резкая контрольная точка, вызывающая временное снижение пропускной способности. Такая ситуация может возникнуть даже если не достигнут порог innodb_max_dirty_pages_pct.
Алгоритм адаптивного сброса помогает избежать таких ситуаций, отслеживая количество грязных страниц в буфере пула и скорость генерации записей журнала переигрывания. На основе этой информации он решает, сколько грязных страниц сбросить из буфера пула каждую секунду, что позволяет ему управлять внезапными изменениями рабочей нагрузки.
Переменная innodb_adaptive_flushing_lwm определяет нижнюю отметку для ёмкости журнала переигрывания. При пересечении этого порога адаптивный сброс включается, даже если переменная innodb_adaptive_flushing отключена.
Внутренние тесты показали, что алгоритм не только поддерживает пропускную способность во времени, но и может значительно повысить общую пропускную способность. Однако адаптивный сброс может значительно повлиять на паттерн ввода-вывода рабочей нагрузки и может не подойти во всех случаях. Он приносит наибольшую пользу, когда журнал переигрывания рискует заполниться. Если адаптивный сброс не подходит для характеристик вашей рабочей нагрузки, вы можете его отключить. Адаптивный сброс управляется переменной innodb_adaptive_flushing, которая включена по умолчанию.
innodb_flushing_avg_loops определяет количество итераций, которое InnoDB сохраняет ранее рассчитанный снимок состояния сброса, контролируя скорость адаптивного сброса в ответ на изменения рабочей нагрузки в фоновом режиме. Большое значение innodb_flushing_avg_loops означает, что InnoDB сохраняет ранее рассчитанный снимок дольше, поэтому адаптивный сброс реагирует медленнее. При установке большого значения важно убедиться, что использование журнала переигрывания не достигает 75% (твёрдо заданный предел, при котором начинается асинхронный сброс), и что порог innodb_max_dirty_pages_pct поддерживает количество грязных страниц на уровне, соответствующем рабочей нагрузке.
Системы с постоянными рабочими нагрузками, большим размером файла журнала (innodb_log_file_size) и небольшими пиками, которые не достигают 75% заполнения пространства журнала, должны использовать высокое значение innodb_flushing_avg_loops, чтобы сохранить сброс максимально плавным. Для систем с экстремальными пиками нагрузки или файлами журналов, которые не предоставляют много пространства, меньшее значение позволяет сбросу тесно следовать за изменениями рабочей нагрузки и помогает избежать достижения 75% заполнения пространства журнала.
Имейте в виду, что если сброс отстаёт, скорость сброса буфера пула может превысить доступные ресурсы ввода-вывода для InnoDB, как определено параметром innodb_io_capacity. Значение innodb_io_capacity_max определяет максимальный предел ресурсов ввода-вывода в таких ситуациях, чтобы пик активности ввода-вывода не потреблял все ресурсы ввода-вывода сервера.
Настройка innodb_io_capacity применима ко всем экземплярам буфера пула. При сбросе грязных страниц ресурсы ввода-вывода делятся поровну между экземплярами буфера пула.
Ограничение скорости сброса буфера во время периодов простоя
Переменная innodb_idle_flush_pct ограничивает скорость сброса буфера пула во время периодов простоя, которые представляют собой периоды времени, когда страницы базы данных не изменяются. Её значение интерпретируется как процент от innodb_io_capacity (который определяет количество операций ввода-вывода в секунду, доступных для InnoDB). Значение по умолчанию равно 100, или 100% от значения innodb_io_capacity. Чтобы ограничить сброс во время периодов простоя, установите innodb_idle_flush_pct значение меньше 100.
Ограничение сброса страниц во время периодов простоя может помочь продлить срок службы накопителей на твердотельных носителях. Побочные эффекты ограничения сброса страниц во время периодов простоя могут включать более длительное время выключения после длительного периода простоя и более длительный период восстановления при сбое сервера.
© 2025 Oracle
Licensed under the GPLv2 License.