Thank you for reading this post, don't forget to subscribe!
С ростом перезапуск MySQL может превратиться в очень неприятный процесс. Вам нужно поменять всего одну настройку, а вы ждете 10…20 минут, пока БД перезапустится.
На скорость выключения и включения MySQL большое влияние оказывает движок InnoDB. А именно два его компонента:
- Redo лог файлы.
- Размер буфера движка.
С ростом базы данных эти настройки обычно увеличивают для повышения производительности. Но вместе с этим увеличивается и время перезапуска сервера.
Ускорение выключения
Если вы обновите какую-то строку в какой-то таблице, Mysql сделает следующее:
- Обновит эти данные в буфере (только в оперативной памяти).
- Пометит эту область памяти (страницу), как "грязную".
- Добавит запись об изменении в redo лог файл (на случай, если сервер сломается и нужно будет восстанавливать данные).
Так обеспечивается производительность, ведь базе данных не приходится выполнять дорогие операции random-записи на диск сразу. Позже, когда буфер будет переполнен, Mysql начнет "сбрасывать грязные" страницы на диск — записывать изменения из буфера в файлы таблиц на диске.
1 2 3 4 5 6 7 |
mysql> SHOW GLOBAL STATUS LIKE '%pages_d%'; +--------------------------------+---------+ | Variable_name | Value | +--------------------------------+---------+ | Innodb_buffer_pool_pages_data | 1507306 | | <em>Innodb_buffer_pool_pages_dirty</em> | <em>143393</em> | +--------------------------------+---------+ |
# Количество грязных страниц в буфере
Как видим, количество грязных страниц составляет около 10% всего буфера. И если размер небольшой — это может быть несколько десятков мегабайт. В .io, в некоторых конфигурациях мы используем размеры буфера в 48Гб. Это означает, что размер грязных страниц составит приблизительно 5Гб.
Перед выключением Mysql обязательно сбросит все грязные страницы на диск. Отсюда и очень долгое время выключения.
В Mysql 5.7 есть настройка innodb_max_dirty_pages_pct, которая позволяет регулировать количество грязных страниц в памяти. Mysql будет чаще сбрасывать грязные страницы во время работы, если установить значение поменьше:
1 |
mysql> SET GLOBAL innodb_max_dirty_pages_pct = 1; |
# Установим лимит грязных страниц в 1%
Сразу после обновления этой настройки мы увидим, что количество грязных страниц постепенно уменьшится:
1 2 3 4 5 6 7 |
mysql> SHOW GLOBAL STATUS LIKE '%pages_d%'; +--------------------------------+---------+ | Variable_name | Value | +--------------------------------+---------+ | Innodb_buffer_pool_pages_data | 1507306 | | <b>Innodb_buffer_pool_pages_dirty</b> | <b>19758</b> | +--------------------------------+---------+ |
# Значение будет постепенно уменьшаться до предела в 1%
Теперь время выключения Mysql значительно снизится.
Ускорение запуска
Сразу после запуска Mysql может очень медленно работать от нескольких минут до нескольких часов. И это при стандартной нагрузке. Это происходит потому, что какое-то время уходит на разогрев буфера. В течение этого времени буфер не наполнен, и Mysql читает множество данных напрямую с диска.
Начиная с версии 5.7 Mysql позволяет настроить включить две опции:
1 |
innodb_buffer_pool_dump_at_shutdown = ON |
# Включается в my.cnf
Этот параметр сбрасывает содержимое буфера на диск перед выключением. Так, во время включения, Mysql сможет быстро загрузить этот же буфер обратно в память. Операция эта очень эффективна, т.к. сам буфер не копируется, а сохраняются только адреса страниц на диске.
1 |
innodb_buffer_pool_load_at_startup = ON |
# Тоже включается в my.cnf
Этот параметр загружает содержимое буфера с диска сразу после включения. Эта операция не блокирует запуск сервера, а выполняется на фоне. Поэтому она никак не замедлит скорость запуска. А вот скорость возврата к нормальной работе увеличится в несколько раз.
Чтобы ускорить время выключения Mysql, сократите количество грязных страниц в памяти:
1 |
mysql> SET GLOBAL innodb_max_dirty_pages_pct = 1; |
Для ускорения запуска включайте опции быстрого сброса и восстановления буфера:
1 2 |
innodb_buffer_pool_dump_at_shutdown = ON innodb_buffer_pool_load_at_startup = ON |
Эти настройки предназначены для баз данных, использующих движок InnoDB и 5.7+ версию Mysql.