В одной из моих производственных сред у нас есть два экземпляра, работающие в кластере RedHat, причем один производственный экземпляр связан с кластером.
У нас есть 125G основной памяти с 24G буферным пулом InnoDB, занятым instance1 и 12G, занятым instance2, который не связан с кластером RedHat. Как данные, так и журналы транзакций находятся в дисковом разделе LVM с файловой системой ext3.
Для повышения производительности и повышения пропускной способности ввода / вывода я решил перейти innodb_flush_method
на O_DIRECT
.
Со ссылкой на документацию MySQL:
Если данные InnoDB и лог файлы находятся на SAN, было установлено , что установка
innodb_flush_method
вO_DIRECT
может привести к снижению производительности простыхSELECT
заявлений в три раза.
Ссылаясь на высокопроизводительные MySQL Ver 2 и 3, он заявил, что разработчики InnoDB обнаружили ошибки при использовании innodb_flush_method=O_DSYNC
. O_SYNC
и O_DSYNC
аналогичны fsync()
и fdatasync()
: O_SYNC
синхронизирует как данные, так и метаданные, тогда как O_DSYNC
синхронизирует только данные.
Если все это кажется большим объяснением без совета, вот совет:
Если вы используете Unix-подобную операционную систему и ваш RAID-контроллер имеет кэш-память с резервным питанием от батареи, мы рекомендуем вам использовать
O_DIRECT
. Если нет, то по умолчанию илиO_DIRECT
, вероятно, будет лучшим выбором, в зависимости от вашего приложения.
Погуглив, я получил этот отчет о тестах: по O_DSYNC
сравнению сO_DIRECT
Отчет по стендовой оценке: =================== Комплексный транзакционный тест 1B, 64 потока * SAN O_DIRECT: запросы на чтение / запись: 31560140 (8766,61 в секунду) * SAN O_DSYNC: запросы на чтение / запись: 5179457 (1438,52 в секунду) * SAN fdatasync: запросы на чтение / запись: 9445774 (2623,66 в секунду). * Local-disk O_DIRECT: запросы на чтение / запись: 3258595 (905,06 в секунду) * Local-disk O_DSYNC: запросы на чтение / запись: 3494632 (970,65 в секунду) * Локальный диск fdatasync: запросы на чтение / запись: 4223757 (1173,04 в секунду.
Однако O_DIRECT
отключает кеш на уровне ОС, где можно отключить двойное кеширование, что показывает лучшую пропускную способность ввода-вывода.
Это хорошо, чтобы пойти с O_DIRECT
чем O_DSYNC
? Эти два варианта немного сбивают с толку. Какая опция может показать лучшую пропускную способность ввода-вывода и повышение производительности без какого-либо влияния на данные, особенно для чтения / записи, особенно на производстве? Есть лучшие предложения, основанные на вашем личном опыте?
Я мог видеть Обновление Роландо в посте :
Тем не менее, существует небольшая путаница по обоим этим параметрам. Где я мог видеть большинство используемых шаблонов конфигурации
O_DIRECT
, я не видел ни одного, где бы рекомендовалO_DSYNC
.
система
- MySQL 5.1.51-enterprise-gpl-pro-log
- Red Hat Enterprise Linux Server, выпуск 5.5
- DELL DRAC с Raid Controller, имеющим кэш обратной записи батареи 512MB
- Контроллеры Dell PERC H700 с резервным аккумулятором (BBU).
Дополнительная информация
mysql> показать переменные типа 'innodb_thread_concurrency'; + --------------------------- + ------- + | Переменное_имя | Значение | + --------------------------- + ------- + | innodb_thread_concurrency | 96 | + --------------------------- + ------- + 1 ряд в наборе (0,00 сек) mysql> показывать переменные вроде 'innodb_read_io_threads'; Пустой набор (0,00 сек) mysql> показать переменные типа 'innodb_write_io_threads'; Пустой набор (0,00 сек)
Мы используем плагин по умолчанию, поэтому я разместил информацию о статусе InnoDB:
mysql> SELECT * FROM Plugins, ГДЕ PLUGIN_NAME НРАВИТСЯ '% innodb%' И PLUGIN_TYPE НРАВИТСЯ 'ДВИГАТЕЛЬ ХРАНИЛИЩА' \ G *************************** 1. ряд ******************** ******* PLUGIN_NAME: InnoDB PLUGIN_VERSION: 1.0 PLUGIN_STATUS: ACTIVE PLUGIN_TYPE: ДВИГАТЕЛЬ ХРАНЕНИЯ PLUGIN_TYPE_VERSION: 50151.0 PLUGIN_LIBRARY: NULL PLUGIN_LIBRARY_VERSION: NULL PLUGIN_AUTHOR: Innobase OY PLUGIN_DESCRIPTION: поддерживает транзакции, блокировку на уровне строк и внешние ключи PLUGIN_LICENSE: GPL 1 ряд в наборе (0,00 сек)