Статьи

Адаптивная очистка InnoDB в MySQL 5.6: срок действия контрольной точки и емкость ввода-вывода

Это сообщение от  Алексея Строганова из MySQL Performance Blog.

В MySQL 5.6 InnoDB имеет специальный поток (page_cleaner), который отвечает за выполнение операций очистки. Page_cleaner выполняет очистку грязных страниц из пула буферов на основе двух факторов:

  •   шаблон доступа  — наименее недавно использованные страницы будут сброшены очистителем LRU из LRU_list, когда в пуле буферов больше нет свободных страниц;
  •   age — самые старые измененные не очищенные страницы являются частью структуры flush_list и будут очищены flush_list flusher на основе нескольких эвристик.

Существует хороший обзор page_cleaner, а также здесь вы можете найти некоторые подробности о сбросе в MySQL 5.6. Ниже я опишу несколько дополнительных аспектов очистки flush_list, которые еще не были рассмотрены.

flush_list промывка и возраст контрольной точки

Количество устаревших страниц, которые можно сохранить в flush_list, ограничено общим размером файлов журнала innodb. Таким образом, основная цель очистки flush_list состоит в том, чтобы очищать страницы из этого списка с такой скоростью, которая также всегда будет предоставлять достаточно свободного места в файлах журнала. С другой стороны, слишком агрессивная очистка означает меньшее объединение записи, ненужную нагрузку на подсистему ввода-вывода, что в конечном итоге сводит на нет преимущества в производительности, связанные с большими журналами повторов. В MySQL 5.6 количество страниц для сброса рассчитывается в адаптивной подпрограмме InnoDB на основе текущего возраста контрольных точек по следующей формуле:

 
percentage of the IO capacity that should be used for flushing =
        ((srv_max_io_capacity / srv_io_capacity) * (lsn_age_factor * sqrt(lsn_age_factor))) / 7.5;

Мы смоделировали эту формулу в R и обнаружили, что ее можно улучшить таким образом, чтобы кривая стала более плоской и в результате промывка стала менее агрессивной. Эта новая формула включена в Percona Server 5.6 по умолчанию.

Rplot04

flush_list flushing и io_capacity

InnoDB предоставляет две переменные, которые позволяют контролировать скорость очистки фона — innodb_io_capacity и innodb_io_capacity_max. Существует довольно подробное описание этих переменных. Однако есть несколько вещей, которые на самом деле не описаны в документации:

  • innodb_io_capacity_max является наиболее важной переменной в случае адаптивной промывки, поскольку только эта переменная фактически ограничивает скорость промывки. Смотрите выше формулу и графики.
  • innodb_io_capacity используется для ограничения операций ввода-вывода во время объединения буфера вставки и сброса в случае неактивности / выключения сервера.

Для практических нужд вышеизложенное означает следующее:

  • если сервер MySQL находится в активном состоянии (обслуживает пользовательские запросы), вам нужно настроить  innodb_io_capacity_max для увеличения / уменьшения скорости очистки .
  • если сервер MySQL находится в состоянии ожидания или выполнение сброса страниц из flush_list будет ограничено только значением innodb_io_capacity .
  • если change_buffering включен и сервер находится в активном состоянии, это позволит использовать либо 5% от innodb_io_capacity, либо варьировать скорость от 5% до 55%, если уже использовалось более 50% размера буфера вставки. 
  • если change_buffering включен и сервер не используется, он будет использовать 100% innodb_io_capacity для операций слияния