Spec-Zone.ru › MySQL 9.2

10.5.8 Оптимизация ввода-вывода на диск InnoDB

Если вы следуете лучшим практикам проектирования баз данных и методам настройки операций SQL, но база данных всё ещё работает медленно из-за интенсивной активности ввода-вывода на диск, рассмотрите эти оптимизации ввода-вывода на диск. Если инструмент Unix top или диспетчер задач Windows показывает, что процент использования процессора с вашей рабочей нагрузкой меньше 70%, ваша рабочая нагрузка, вероятно, ограничена диском.

  • Увеличение размера буфера пула

    Когда данные таблицы кэшируются в буферном пуле InnoDB, к ним можно многократно обращаться с помощью запросов, не обращаясь к диску. Укажите размер буферного пула с помощью параметра innodb_buffer_pool_size. Эта область памяти достаточно важна, поэтому обычно рекомендуется настроить innodb_buffer_pool_size на 50–75 процентов от объёма оперативной памяти. Дополнительную информацию можно найти в разделе 10.12.3.1 «Как MySQL использует память».

  • Настройка метода сброса

    В некоторых версиях GNU/Linux и Unix сброс файлов на диск с помощью системного вызова Unix fsync() и аналогичных методов может быть неожиданно медленным. Если производительность записи в базу данных вызывает проблемы, выполните бенчмаркинг с параметром innodb_flush_method, установленным в значение O_DSYNC.

  • Настройка порога для сбросов операционной системой

    По умолчанию, когда InnoDB создаёт новый файл данных, такой как новый файл журнала или файл табличного пространства, файл полностью записывается в кэш операционной системы, прежде чем он будет сброшен на диск, что может привести к большой активности записи на диске одновременно. Чтобы принудительно осуществлять меньшие, периодические сбросы данных из кэша операционной системы, можно использовать переменную innodb_fsync_threshold для определения порогового значения в байтах. Значение по умолчанию 0 принуждает использовать поведение по умолчанию, которое заключается в сбросе данных на диск только после того, как файл будет полностью записан в кэш.

    Установка порога для принудительного проведения меньших периодических сбросов может быть полезно в тех случаях, когда несколько экземпляров MySQL используют одни и те же устройства хранения. Например, создание нового экземпляра MySQL и связанных с ним файлов данных может привести к большим скачкам активности записи на диске, что негативно скажется на производительности других экземпляров MySQL, которые используют те же устройства хранения. Настройка порога помогает избежать таких скачков активности записи.

  • Использование fdatasync() вместо fsync()

    На платформах, поддерживающих fdatasync() системные вызовы, переменная innodb_use_fdatasync позволяет использовать fdatasync() вместо fsync() для сбросов операционной системой. Системный вызов fdatasync() не сбрасывает изменения в метаданные файла, если это не требуется для последующего извлечения данных, что может принести потенциальную выгоду в плане производительности.

    Подмножество настроек innodb_flush_method, таких как fsync, O_DSYNC и O_DIRECT, используют fsync() системные вызовы. Переменная innodb_use_fdatasync применима при использовании этих настроек.

  • Использование планировщика ввода-вывода noop или deadline с помощью native AIO в Linux

    InnoDB использует подсистему асинхронного ввода-вывода (native AIO) в Linux для выполнения запросов предварительной выборки и записи для страниц файла данных. Это поведение управляется опцией конфигурации innodb_use_native_aio, которая включена по умолчанию. При использовании native AIO тип планировщика ввода-вывода оказывает большее влияние на производительность ввода-вывода. Обычно рекомендуются планировщики ввода-вывода noop и deadline. Проведите бенчмаркинг, чтобы определить, какой планировщик ввода-вывода обеспечивает лучшие результаты для вашей рабочей нагрузки и среды. Дополнительную информацию можно найти в разделе 17.8.6 «Использование асинхронного ввода-вывода в Linux».

  • Использование прямого ввода-вывода на Solaris 10 для архитектуры x86_64

    При использовании хранилища InnoDB на Solaris 10 для архитектуры x86_64 (AMD Opteron) используйте прямой ввод-вывод для файлов, связанных с InnoDB, чтобы избежать ухудшения производительности InnoDB. Для использования прямого ввода-вывода для всего файловой системы UFS, используемой для хранения файлов, связанных с InnoDB, смонтируйте её с опцией forcedirectio; см. mount_ufs(1M). (По умолчанию на Solaris 10/x86_64 эта опция не используется.) Чтобы применить прямой ввод-вывод только к операциям с файлами InnoDB, а не ко всей файловой системе, установите innodb_flush_method = O_DIRECT. С этой настройкой InnoDB вызывает directio() вместо fcntl() для ввода-вывода в файлы данных (не для ввода-вывода в файлы журнала).

  • Использование необрабатываемого хранилища для файлов данных и журналов с Solaris 2.6 или новее

    При использовании хранилища InnoDB с большим значением innodb_buffer_pool_size в любой версии Solaris 2.6 и выше, на любой платформе (sparc/x86/x64/amd64), проведите бенчмаркинг с файлами данных InnoDB и файлами журналов на необработанных устройствах или на отдельной файловой системе UFS с прямым вводом-выводом, используя опцию монтирования forcedirectio, как описано ранее. (Необходимо использовать опцию монтирования, а не устанавливать innodb_flush_method, если вы хотите прямой ввод-вывод для файлов журналов.) Пользователи файловой системы Veritas VxFS должны использовать опцию монтирования convosync=direct.

    Не размещайте другие файлы данных MySQL, такие как файлы для таблиц MyISAM, на файловой системе с прямым вводом-выводом. Исполняемые файлы или библиотеки не должны размещаться на файловой системе с прямым вводом-выводом.

  • Использование дополнительных устройств хранения

    Дополнительные устройства хранения можно использовать для настройки конфигурации RAID. Дополнительную информацию см. в разделе 10.12.1 «Оптимизация ввода-вывода на диске».

    В качестве альтернативы, файлы данных табличного пространства InnoDB и файлы журналов можно разместить на разных физических дисках. Дополнительную информацию см. в следующих разделах:

    • раздел 17.8.1 «Конфигурация запуска InnoDB»

    • раздел 17.6.1.2 «Создание таблиц внешним образом»

    • Создание общего табличного пространства

    • раздел 17.6.1.4 «Перемещение или копирование таблиц InnoDB»

  • Рассмотрите возможность использования невращающегося хранилища

    Невращающееся хранилище обычно обеспечивает лучшую производительность при операциях произвольного ввода-вывода; вращающееся хранилище — для операций последовательного ввода-вывода. При распределении файлов данных и журналов между вращающимися и невращающимися устройствами хранения учитывайте тип операций ввода-вывода, которые преимущественно выполняются на каждом файле.

    Файлы, ориентированные на операции произвольного ввода-вывода, обычно включают файлы данных, файлы журналов и файлы InnoDB. Файлы, ориентированные на операции последовательного ввода-вывода, включают файлы, файлы doublewrite и файлы журнала, такие как файлы и файлы.

    При использовании невращающегося хранилища пересмотрите настройки следующих параметров конфигурации:

    • innodb_checksum_algorithm

      Опция crc32 использует более быстрый алгоритм проверки и рекомендуется для быстрых систем хранения.

    • innodb_flush_neighbors

      Оптимизирует ввод-вывод для вращающихся устройств хранения. Отключите его для невращающихся устройств хранения или для смешанных вращающихся и невращающихся устройств хранения. Отключено по умолчанию.

    • innodb_idle_flush_pct

      Позволяет установить ограничение на сброс страниц во время простоев, что может помочь продлить срок службы невращающихся устройств хранения.

    • innodb_io_capacity

      Значение по умолчанию 10000 обычно достаточно.

    • innodb_io_capacity_max

      Значение по умолчанию (2 * innodb_io_capacity) предназначено для большинства рабочих нагрузок.

    • innodb_log_compressed_pages

      Если файлы журналов резервных копий находятся на невращающихся устройствах хранения, рассмотрите возможность отключения этой опции для уменьшения журналов. См. Отключение протоколирования сжатых страниц.

    • innodb_log_file_size (устарело)

      Если файлы журналов резервных копий находятся на невращающихся устройствах хранения, настройте этот параметр для максимального кэширования и объединения операций записи.

    • innodb_redo_log_capacity

      Если файлы журналов резервных копий находятся на невращающихся устройствах хранения, настройте этот параметр для максимального кэширования и объединения операций записи.

    • innodb_page_size

      Рассмотрите возможность использования размера страницы, соответствующего внутреннему секторному размеру диска. У устройств SSD ранних поколений часто размер сектора 4 КБ. Некоторые более новые устройства имеют размер сектора 16 КБ. По умолчанию размер страницы InnoDB составляет 16 КБ. Поддержание размера страницы близким к размеру блока устройства хранения сводит к минимуму количество неизмененных данных, которые переписываются на диск.

    • binlog_row_image

      Если бинарные журналы находятся на невращающихся устройствах хранения, а все таблицы имеют первичные ключи, рассмотрите возможность установки этого параметра в minimal для уменьшения количества записей в журнале.

    Убедитесь, что для вашей операционной системы включена поддержка TRIM. Обычно она включена по умолчанию.

END_OF_DOCUMENT_MARKER
  • Увеличьте емкость ввода/вывода, чтобы избежать очередей

    Если пропускная способность периодически падает из-за InnoDB операций, рассмотрите возможность увеличения значения параметра конфигурации innodb_io_capacity. Более высокие значения приводят к более частым операциям, предотвращая накопление работы, что может привести к снижению пропускной способности.

  • Уменьшите емкость ввода/вывода, если очистка не отстает

    Если система не отстает при выполнении операций InnoDB, рассмотрите возможность уменьшения значения параметра конфигурации innodb_io_capacity. Обычно это значение поддерживается как можно ниже, но не так низко, чтобы это приводило к периодическим снижениям пропускной способности, как указано в предыдущем пункте. В типичном случае, когда можно уменьшить значение параметра, в выводе SHOW ENGINE INNODB STATUS можно увидеть комбинацию такого типа:

    • Длина списка истории низкая, ниже нескольких тысяч.

    • Слияния буфера вставки близки к вставленным строкам.

    • Измененные страницы в буферном пуле постоянно находятся значительно ниже значения innodb_max_dirty_pages_pct буферного пула. (Измеряйте в момент, когда сервер не выполняет массовые вставки; во время массовых вставок процент измененных страниц может значительно увеличиться.)

    • Log sequence number - Last checkpoint составляет менее 7/8, или в идеале менее 6/8 от общего размера InnoDB.

  • Хранение файлов табличного пространства системы на устройствах Fusion-io

    Вы можете воспользоваться оптимизацией ввода/вывода, связанной с буфером двойной записи, храня файлы, содержащие область хранения буфера двойной записи, на устройствах Fusion-io, которые поддерживают атомарные записи. (Область хранения буфера двойной записи находится в файлах двойной записи. См. Раздел 17.6.4, «Буфер двойной записи».) Если файлы области хранения буфера двойной записи находятся на устройствах Fusion-io, которые поддерживают атомарные записи, буфер двойной записи автоматически отключается, и для всех файлов данных используются атомарные записи Fusion-io. Эта функция поддерживается только на оборудовании Fusion-io и включена только для Fusion-io NVMFS в Linux. Для максимальной пользы от этой функции рекомендуется значение параметра innodb_flush_method равное O_DIRECT.

    Примечание

    Поскольку параметр буфера двойной записи является глобальным, буфер двойной записи также отключается для файлов данных, которые не находятся на оборудовании Fusion-io.

  • Отключение протоколирования сжатых страниц

    При использовании функции таблицы InnoDB изображения повторно сжатых страниц записываются в журнал, когда вносится изменение в сжатые данные. Это поведение контролируется параметром innodb_log_compressed_pages, который включен по умолчанию, чтобы предотвратить повреждения, которые могут возникнуть, если при восстановлении используется другая версия алгоритма сжатия zlib. Если вы уверены, что версия zlib не изменится, отключите innodb_log_compressed_pages, чтобы сократить генерацию журнала повторения для рабочих нагрузок, изменяющих сжатые данные.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/optimizing-innodb-diskio.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API