В одной из моих производственных сред у нас есть два экземпляра, работающие в кластере 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 сек)
Ответы:
Еще 21 января 2009 года Петр Зайцев заявил следующее на mysqlperformanceblog.com
На данный момент я не знаю никого, кто бы затронул эту проблему.
O_DSYNC
по умолчанию это не очень привлекательная перспектива, но она учитывает более быстрые записи, которые на самом деле не проверены. Вот почему вокруг столько шумихиO_DIRECT
.Я могу сказать, что у вас не установлен плагин InnoDB. С плагином InnoDB должно существовать несколько переменных.
Вы должны обновить InnoDB одним из двух способов:
Как только вы это сделаете, вы можете улучшить InnoDB для
Вот мои прошлые сообщения о настройках, которые вы можете изменить для этого:
Sep 12, 2011
: Можно ли заставить MySQL использовать более одного ядра?Sep 20, 2011
: Многоядерность и производительность MySQLApr 26, 2012
: Соответствует ли производительность процессора серверу баз данных?Mar 16, 2012
: Использование нескольких ядер для отдельных запросов MySQL в Debianисточник
У меня всегда было впечатление, что
O_DIRECT
это лучше для производительности, так как предотвращает двойную буферизацию. Кроме того, при условии, что у вас есть аппаратный RAID с резервным питанием от батареи. Конечно, это также зависит от рабочей нагрузки, будь то ЧИТАЙТЕ или НАПИШИТЕ много.Кроме того , вопрос для специалистов: делать дополнительные вызовы
fsync()
дляO_DIRECT
причины заметного ухудшения общей производительности, или это ничтожно? Я еще не видел, как тесты показывают это.Также обратите внимание, что в Percona включена возможность установки
innodb_flush_method=ALL_O_DIRECT
, которая обеспечивает прямой ввод-вывод не только в файлах данных InnoDB, но и в журналах транзакций InnoDB одновременно.источник