Вчера, в MySQL 8.4, была выпущена самая первая LTS-версия MySQL.
Наконец-то было удалено множество устаревших версий, и несколько значений по умолчанию переменных InnoDB были изменены, чтобы соответствовать текущим рабочим нагрузкам и спецификациям оборудования.
Изменены значения по умолчанию для 20 переменных InnoDB!
Давайте взглянем на эти переменные и объясним причину такой модификации:
Предыдущее значение: | ON |
Новое значение (8.4 LTS): | OFF, если поддерживается MADV_DONTDUMP еще ON |
MADV_DONTDUMP – это макрос, поддерживаемый в Linux 3.4 и более поздних версиях (присутствует файл заголовка “sys/mman.h” и содержит символ MADV_DONTDUMP, расширение, отличное от POSIX для madvise()), это не поддерживается на компьютерах с Windows или в большинстве систем macOS.
Подводя итог, это означает, что по умолчанию в системах Linux содержимое буферного пула не сбрасывается в основной файл.
Предыдущее значение: | 8 (или 1, если BP < 1 ГБ) |
Новое значение (8.4 LTS): | Если BP <= 1 ГБ: 1 Если BP > 1 ГБ: тогда минимальное значение в диапазоне 1-64 между: a. (innodb_buffer_pool_size / innodb_buffer_pool_chunk_size) / 2 b. 1/4 доступных логических процессоров |
Старое значение 8 могло быть слишком большим в некоторых системах. Руководство содержит отличные примеры расчета размера BP, см. Настройка размера пула буферов InnoDB.
Предыдущее значение: | All |
Новое значение (8.4 LTS): | No |
Буферизация изменений – это метод, который был полезен для предпочтения последовательного ввода-вывода за счет задержки операций записи во вторичные индексы. На самом современном оборудовании случайный ввод-вывод больше не является проблемой.
Предыдущее значение: | OFF |
Новое значение (8.4 LTS): | ON |
Начиная с MySQL 8.0, мы рекомендуем включить эту переменную и не изменять вручную настройки InnoDB, за которые отвечает эта переменная, когда MySQL работает на выделенном сервере, где для базы данных доступны все ресурсы.
Начиная с MySQL 8.4, innodb_dedicated_server настраивает следующие переменные:
Метод innodb_flush_method не настраивается автоматически при включении innodb_dedicated_server.
Предыдущее значение: | ON |
Новое значение (8.4 LTS): | OFF |
AHI (InnoDB Adaptive Hash Index) долгое время был причиной некоторых проблем с производительностью. Каждый опытный администратор базы данных всегда советует просто отключить его, почти как старый кэш запросов. Мы удивлены, что не было AHI-тюнера, подобного Query Cache Tuner от Domas Mituzas 😉
AHI может обеспечить некоторое преимущество при запросах на чтение (SELECT), когда ни одна из данных не изменена и полностью кэшируется в буферном пуле. Как только происходят операции записи, или повышается нагрузка на систему, или если все данные, необходимые для чтения, не могут быть кэшированы, адаптивный хэш-индекс становится серьезным узким местом.
Чтобы обеспечить более предсказуемое время отклика, рекомендуется отключить его.
Предыдущее значение: | innodb_buffer_pool_instances * 2 |
Новое значение (8.4 LTS): | 2 |
Ранее значение по умолчанию вычислялось в соответствии с количеством буферных пулов, для упрощения теперь значение по умолчанию равно 2.
В документации указано, что это значение определяет количество файлов двойной записи для каждого пула буферов. Но у меня сложилось впечатление, что оно глобальное независимо от количества экземпляров пула буферов.
Из журнала ошибок MySQL:
2024-05-01T05:43:03.226604Z 1 [Note] [MY-012955] [InnoDB] Initializing buffer pool, total size = 2.000000G, instances = 2, chunk size =128.000000M [...] 2024-05-01T05:43:03.288068Z 1 [Note] [MY-013532] [InnoDB] Using './#ib_16384_0.dblwr' for doublewrite 2024-05-01T05:43:03.295917Z 1 [Note] [MY-013532] [InnoDB] Using './#ib_16384_1.dblwr' for doublewrite 2024-05-01T05:43:03.317319Z 1 [Note] [MY-013532] [InnoDB] Using './#ib_16384_0.bdblwr' for doublewrite 2024-05-01T05:43:03.317398Z 1 [Note] [MY-013566] [InnoDB] Double write buffer files: 2 2024-05-01T05:43:03.317410Z 1 [Note] [MY-013565] [InnoDB] Double write buffer pages per instance: 128 2024-05-01T05:43:03.317423Z 1 [Note] [MY-013532] [InnoDB] Using './#ib_16384_0.dblwr' for doublewrite 2024-05-01T05:43:03.317436Z 1 [Note] [MY-013532] [InnoDB] Using './#ib_16384_1.dblwr' for doublewrite
Мы видим, что у нас есть 2 экземпляра пула буферов, но по-прежнему только 2 файла буфера двойной записи. Я ожидал бы 4 согласно документации. Третий файл, #ib_16384_0.bdblwr, создан для использования, когда innodb_doublewrite имеет значение “DETECT_ONLY“.
С DETECT_ONLY в буфер двойной записи записываются только метаданные. Содержимое страницы базы данных не записывается в буфер двойной записи, и recovery не использует буфер двойной записи для исправления незавершенной записи страницы. Эта упрощенная настройка предназначена только для обнаружения незавершенных записей на страницу.
Предыдущее значение: | innodb_write_io_threads (по умолчанию 4) |
Новое значение (8.4 LTS): | 128 |
В результате нашего тестирования и из соображений производительности мы поняли, что иметь большее значение по умолчанию было лучше, поскольку мы часто рекомендовали увеличить его.
Предыдущее значение: | fsync |
Новое значение (8.4 LTS): | O_DIRECT (или fsync) |
При поддержке O_DIRECT всегда было предпочтительным значением, и мы рекомендовали использовать его для обхода кэша файловой системы для удаления изменений InnoDB на диск (для файлов данных и файлов журналов).
Если O_DIRECT не поддерживается, мы используем старый метод fsync. Это для Unix, в Windows значение по умолчанию – небуферизованный.
Предыдущее значение: | 200 |
Новое значение (8.4 LTS): | 10000 |
Для последних систем (RAIDs, SSD, …) пропускная способность ввода-вывода по умолчанию была слишком низкой. Поскольку переменная определяет количество операций ввода-вывода, доступных для фоновых операций InnoDB, слишком низкое значение ограничивало производительность.
Предыдущее значение: | 2 * innodb_io_capacity (минимум 2000) |
Новое значение (8.4 LTS): | 2 * innodb_io_capacity |
Если InnoDB необходимо выполнить более агрессивную очистку, эта переменная определяет максимальное количество операций ввода-вывода, которые InnoDB может использовать для выполнения фоновых операций. Новое значение по умолчанию проще, поскольку оно просто вдвое превышает innodb_io_capacity.
Предыдущее значение: | 16 МБ |
Новое значение (8.4 LTS): | 64 МБ |
Мы увеличили значение по умолчанию, потому что большой буфер журнала позволяет выполнять большие транзакции, не требуя записи журнала на диск перед фиксацией транзакций.
Предыдущее значение: | OFF |
Новое значение (8.4 LTS): | ON |
Когда система поддерживает NUMA, новое значение по умолчанию устанавливает политику памяти NUMA в значение MPOL_INTERLEAVE для mysqld во время выделения пула буферов InnoDB. Эта операция случайным образом распределяет память между всеми узлами numa, обеспечивая лучшее распределение между этими узлами.
Конечно, вы выиграете от этого, только если в вашей системе несколько узлов NUMA.
Вот как проверить количество узлов:
$ numactl --hardware available: 2 nodes (0-1) node 0 size: 16160 MB node 0 free: 103 MB node 1 size: 16130 MB node 1 free: 83 MB node distances: node 0 1 0: 10 20 1: 20 10
В приведенном выше примере мы можем видеть, что центральный процессор состоит из двух узлов.
Вы также можете использовать lstopo для отображения архитектуры и ядер NUMA. Это еще один пример.:
Предыдущее значение: | 4 |
Новое значение (8.4 LTS): | innodb_buffer_pool_instances |
Новое значение по умолчанию заключается в использовании такого количества потоков для удаления грязных страниц из экземпляров буферного пула, сколько существует экземпляров буферного пула.
Предыдущее значение: | 4 |
Новое значение (8.4 LTS): | логические процессоры / 8 (мин. 4) |
По соображениям производительности в системах с большим количеством логических процессоров количество потоков, используемых для параллельного чтения кластеризованных индексов, автоматически увеличивается.
Предыдущее значение: | 4 |
Новое значение (8.4 LTS): | 1 если логические процессоры <= 16 , то еще 4 |
Эта переменная каким-то образом также автоматически настраивается для систем с большим количеством (> = 16) vCPU. Но мы также поняли, что наличие 4 потоков очистки может быть проблематичным в некоторых небольших системах. Для такой системы мы уменьшили значение по умолчанию до 1.
Предыдущее значение: | 4 |
Новое значение (8.4 LTS): | логические процессоры / 2 (мин. 4) |
Эта переменная также увеличивается автоматически, если в системе более 8 vCPU.
Предыдущее значение: | OFF |
Новое значение (8.4 LTS): | ON |
В системах, поддерживающих его, вызов fdatasync() не сбрасывает изменения в метаданных файла, если это не требуется. Это обеспечивает повышение производительности.
Предыдущее значение: | 1 ГБ |
Новое значение (8.4 LTS): | 3% от общего объема памяти (в диапазоне 1-4 ГБ) |
Значение по умолчанию теперь автоматически увеличивается, если системе требуется большой объем памяти. Но ограничение по умолчанию составляет 4 ГБ. Таким образом, для систем с объемом памяти более 132 ГБ по умолчанию значение temptable_max_ram будет установлено равным 4 ГБ.
Предыдущее значение: | 1 ГБ |
Новое значение (8.4 LTS): | 0 (отключено) |
Новое значение по умолчанию отключает выделение памяти из временных файлов, отображаемых в памяти (файлы в tmpdir не создаются).
Предыдущее значение: | ON |
Новое значение (8.4 LTS): | OFF |
Когда temptable_use_mmap отключен (новое значение по умолчанию), механизм временного хранения использует внутренние временные таблицы InnoDB на диске вместо выделения места для внутренних временных таблиц в памяти в виде временных файлов с отображением в память в tmpdir, когда объем механизма временного хранения с возможностью изменения превышает предел, определенный переменной temptable_max_ram.
С этой совершенно новой версией MySQL, самой первой LTS, у нас появилась возможность изменить значения по умолчанию некоторых переменных InnoDB, чтобы привести их в большее соответствие с реальностью производственных серверов.
Некоторые из них теперь автоматически настраиваются, чтобы лучше соответствовать системе, на которой запущен MySQL.
Наслаждайтесь MySQL и новыми настройками по умолчанию!