существуетпредыдущий постВ этой статье представлено применение алгоритма LRU в Redis Эта статья продолжает знакомить вас с тем, как использовать алгоритм LRU в движке InnobDB Mysql.
Буферный пул InnoDB
Введение в буферный пул и структура памяти
Во-первых, давайте представим пул буферов InnoDB, Пул буферов — это просто область памяти, которая кэширует данные и индексную информацию, к которым InnoDB обращается и хранит на диске. Буферный пул выполняет две функции: одна — повысить эффективность операций чтения с большой емкостью, а другая — повысить эффективность управления кэшем. Это очень важный метод оптимизации Mysql для выделения параметров пула буферов, чтобы часто используемые параметры можно было хранить в пуле буферов.
Схема структуры памяти буферного пула InnoDB показана на следующем рисунке:
Изображение взято из «Mysql Technology Insider: InnoDB Storage Engine».
состояние буферного пула
мы можем пройтиSHOW ENGINE INNODB STATUSКоманда для просмотра производительности кэш-пула в движке InnoDB:
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 6593445888; // 为缓冲池分配的总内存(字节)
Dictionary memory allocated 7687783 // 为InnoDB数据字典分配的总内存(字节)
Buffer pool size 393208 // 分配给缓冲池的页面总大小(页)
Free buffers 352642 // 缓冲池空闲列表的页面总大小(页)
Database pages 40485 // 缓冲池LRU列表的页面总大小。(页)
Old database pages 14967 // 缓冲池旧LRU子列表的页面总大小(页)
Modified db pages 4 // 缓冲池中当前修改的页面数。
Pending reads 0 // 等待读入缓冲池的缓冲池页面数。
Pending writes: LRU 0, flush list 0, single page 0 // 从LRU列表的底部开始写入的缓冲池中的旧脏页数。 // 检查点期间要刷新的缓冲池页面数。
// 缓冲池中暂挂的独立页面写入数。
Pages made young 5, not young 0 // 缓冲池LRU列表中变年轻的页面总数
// 缓冲池LRU列表中未设置为年轻的页面总数
...
Полную информацию о состоянии пула буферов можно найти здесь:Информация о состоянии кэш-пула
Количество и размер буферных пулов
Чтобы избежать конфликтов параллелизма, вызванных чтением и записью буферных пулов несколькими потоками, InnoDB может настроить несколько буферных пулов, которые определяются параметромinnodb_buffer_pool_instances
Указывает, что хеш-таблица используется внутри для распределения и управления.
В общем, когда размер пула кеша, больше похоже на производительность базы данных памяти MySQL. Мы можем пройти или запустить при запускеinnodb_buffer_pool_size
Параметр динамически регулирует размер кэш-пула, на что нужно обратить вниманиеinnodb_buffer_pool_size
Размер автоматически подстраивается под блок пула кеша InnoDB.innodb-buffer-pool-chunk-size
(по умолчанию 128M) целочисленное кратное.
Чтобы избежать потенциальных проблем с производительностью, размер пула кэш-памяти/размер блока пула кэш-памяти (
innodb_buffer_pool_size
/innodb_buffer_pool_chunk_size
) не должен превышать 1000.
Обновление буфера бассейна
Когда дело доходит до кэширования, должен быть механизм очистки кэша, то есть отбраковка грязных страниц (страниц данных, которые были изменены, но не сброшены на диск) в кэше.
В версиях выше 5.7 InnoDB по умолчанию запускает четыре потока одновременно, чтобы выполнить очистку грязных страниц в пуле буферов. Существует два режима очистки грязных страниц:
-
нормальный режим, когда доля грязных страниц в кэш-пуле превышает
innodb_max_dirty_pages_pct_lwm
(Линия низкого уровня по умолчанию равна 25%), запустите нормальный режим, чтобы сбросить грязные страницы на диск. -
aggressively flushes(агрессивный режим?), когда доля грязных страниц в кэш-пуле превышает
innodb_max_dirty_pages_pct
(по умолчанию 75%), включите режим быстрой очистки, чтобы сбрасывать грязные страницы на диск как можно быстрее.
Предварительная выборка кэш-пула (Предварительная выборка)
Кэш-пул InnoDB не только пассивно кэшируется, но и заранее асинхронно считывает страницы данных с диска.Есть два способа:
-
линейный: Упреждающее чтение в соответствии с порядком доступа к данным в кэш-пуле.Когда данные страницы (Page) в определенной области (Extend) читаются более чем
innodb_read_ahead_threshold
, все остальные страницы в регионе загружаются в пул кеша. -
случайный: Упреждающее чтение в соответствии с существующими страницами в пуле кеша, независимо от их порядка, когда обнаруживается, что количество страниц в определенной области пула кеша превышает
innodb_random_read_ahead
, все остальные страницы в области загружаются в буферный пул.
Алгоритм буферного пула LRU
Поняв концепцию пула буферов InnoDB, давайте взглянем на алгоритм работы пула буферов.
Когда мы используем простой алгоритм LRU, мы обнаружим, что при наличии пакетных операций данные кэша будут нарушены, что значительно снижает частоту попаданий в кэш. В Mysql будет большое количество операций упреждающего чтения и полного сканирования таблицы.Для того, чтобы сохранить настоящие горячие данные в памяти, кэш-пул InnoDB использует вариант алгоритма LRU.эта статьяАлгоритм LRU-K написан на .
Страница, впервые попадающая в пул буферов, не будет напрямую попадать в заголовок связанного списка LRU, но будет вставлена в позицию на расстоянии 3/8 от конца связанного списка (что можно настроить с помощью параметра innodb_old_blocks_pct).新子列表
, следующая позиция называется旧子列表
, данные называются восходящими в связанном списке变年轻
, иначе называется变老
. На следующем рисунке представлена схематическая диаграмма:
-
стать моложе
Есть два случая омоложения.Во-первых, страница должна быть прочитана из-за операции пользователя.В этом случае страница будет непосредственно перемещена в начало нового связанного списка подсписка. Второй - из операции упреждающего чтения внутри базы данных.В течение времени с момента вставки innodb_old_blocks_time (по умолчанию 1000 мс), даже если к странице осуществляется доступ, страница не будет перемещена в начало связанного списка LRU.
То есть, если это операция пользователя, требуется как минимум две операции, чтобы стать молодым. И если это операция опережающего чтения, вам нужно добавить период ожидания.
-
в возрасте
По мере замены данных связанного списка и обращения к ним данные во всем списке естественным образом устареют. В конце концов самая старая страница будет вытеснена из хвоста.
Суммировать
В этой статье представлена концепция пула буферов механизма Mysql InnoDB и его преобразование в алгоритм LRU. Представлено еще одно решение для загрязненного списка LRU.