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и файлы журналов можно разместить на разных физических дисках. Дополнительную информацию см. в следующих разделах: -
Рассмотрите возможность использования невращающегося хранилища
Невращающееся хранилище обычно обеспечивает лучшую производительность при операциях произвольного ввода-вывода; вращающееся хранилище — для операций последовательного ввода-вывода. При распределении файлов данных и журналов между вращающимися и невращающимися устройствами хранения учитывайте тип операций ввода-вывода, которые преимущественно выполняются на каждом файле.
Файлы, ориентированные на операции произвольного ввода-вывода, обычно включают файлы данных, файлы журналов и файлы
InnoDB. Файлы, ориентированные на операции последовательного ввода-вывода, включают файлы, файлы doublewrite и файлы журнала, такие как файлы и файлы.При использовании невращающегося хранилища пересмотрите настройки следующих параметров конфигурации:
-
Опция
crc32использует более быстрый алгоритм проверки и рекомендуется для быстрых систем хранения. -
Оптимизирует ввод-вывод для вращающихся устройств хранения. Отключите его для невращающихся устройств хранения или для смешанных вращающихся и невращающихся устройств хранения. Отключено по умолчанию.
-
Позволяет установить ограничение на сброс страниц во время простоев, что может помочь продлить срок службы невращающихся устройств хранения.
-
Значение по умолчанию 10000 обычно достаточно.
-
Значение по умолчанию (2 *
innodb_io_capacity) предназначено для большинства рабочих нагрузок. -
Если файлы журналов резервных копий находятся на невращающихся устройствах хранения, рассмотрите возможность отключения этой опции для уменьшения журналов. См. Отключение протоколирования сжатых страниц.
-
innodb_log_file_size(устарело)Если файлы журналов резервных копий находятся на невращающихся устройствах хранения, настройте этот параметр для максимального кэширования и объединения операций записи.
-
Если файлы журналов резервных копий находятся на невращающихся устройствах хранения, настройте этот параметр для максимального кэширования и объединения операций записи.
-
Рассмотрите возможность использования размера страницы, соответствующего внутреннему секторному размеру диска. У устройств SSD ранних поколений часто размер сектора 4 КБ. Некоторые более новые устройства имеют размер сектора 16 КБ. По умолчанию размер страницы
InnoDBсоставляет 16 КБ. Поддержание размера страницы близким к размеру блока устройства хранения сводит к минимуму количество неизмененных данных, которые переписываются на диск. -
Если бинарные журналы находятся на невращающихся устройствах хранения, а все таблицы имеют первичные ключи, рассмотрите возможность установки этого параметра в
minimalдля уменьшения количества записей в журнале.
Убедитесь, что для вашей операционной системы включена поддержка TRIM. Обычно она включена по умолчанию.
-
-
Увеличьте емкость ввода-вывода, чтобы избежать очередей
Если пропускная способность периодически снижается из-за
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.