innodb_flush_method = O_DIRECT проти впливу O_DSYNC на продуктивність ext3 з розділом диска LVM


12

В одному з моїх виробничих середовищ у нас є два екземпляри, що працюють на кластері RedHat, причому один виробничий екземпляр пов'язаний з кластером.

У нас є 125G основна пам'ять з 24G InnoDB буферним пулом, зайнятим instance1 та 12G, зайнятими instance2, яка не пов'язана з кластером RedHat. І журнали даних, і журнали транзакцій розташовані на дисковому розділі LVM з файловою системою ext3.

Для підвищення продуктивності і краще I / O пропускної здатності я вирішив змінити 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, мабуть, буде найкращим вибором, залежно від вашої програми.

За допомогою googling я отримав цей звіт про O_DSYNCпорівняння : on vsO_DIRECT

Звіт про порівняльну оцінку:
====================
Комплексний транзакційний тест 1B рядків, 64 теми

 * SAN O_DIRECT: запити для читання / запису: 31560140 (8766,61 за секунду)
 * SAN O_DSYNC: запити на читання / запис: 5179457 (1438,52 в секунду)
 * SAN fdatasync: запити для читання / запису: 9445774 (2623,66 за секунду)
 * Локальний диск O_DIRECT: запити на читання / запис: 3258595 (905.06 в секунду)
 * Локальний диск O_DSYNC: запити на читання / запис: 3494632 (970,65 в секунду)
 * Fdatasync локального диска: запити на читання / запис: 4223757 (1173,04 за секунду)

Однак O_DIRECTвимикає кеш рівня ОС, де може бути відключено подвійне кешування, що показує кращу пропускну здатність вводу / виводу.

Чи добре їхати, O_DIRECTа не O_DSYNC? Ці два варіанти трохи заплутані. Який варіант може виявити кращу пропускну здатність вводу / виводу та підвищення продуктивності, не впливаючи на дані, читає / записує особливо у виробництві? Якісь кращі пропозиції, засновані на вашому особистому досвіді?

Я міг побачити оновлення Rolando у публікації :

І все-таки існує незначна плутанина обох цих параметрів. Де я міг бачити більшість шаблонів конфігурації виробництва, використовуючи O_DIRECT, я не бачив, де рекомендував O_DSYNC.

Система

  • MySQL 5.1.51-enterprise-gpl-pro-log
  • Реліз Red Hat Enterprise Linux Server 5.5
  • DELL DRAC з контролером Raid, що має кеш-пам'ять запису акумулятора 512 Мб
  • Контролери 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 * ІЗ плагінів, де PLUGIN_NAME НЕОБХОДИМО '% innodb%' І PLUGIN_TYPE ПОДОБИТЬ 'ДВИГАТИХ ЗБЕРІГАННЯ' \ G
*************************** 1. рядок ******************** *******
           PLUGIN_NAME: InnoDB
        ПЛУГІН_ВЕРСІЯ: 1.0
         ПЛУГІН_СТАТУС: АКТИВНІ
           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 сек)

Відповіді:


7

Ще 21 січня 2009 року Петро Зайцев заявив таке на mysqlperformanceblog.com

Як заклик до дії - я, безумовно, хотів би, щоб хтось дізнався, чи можна EXT3 виправити в цьому плані, оскільки це, безумовно, найпоширеніша файлова система для Linux. Також варто вивчити, чи можна щось зробити на стороні MySQL - можливо, відкриття бінлога з O_DSYNCпрапором, якщо sync_binlog=1замість використання fsync допоможе? Або може бути гарним рішенням попереднє виділення бінарних файлів.

На сьогоднішній день я не знаю, що ніхто не торкався цього питання. O_DSYNCяк за замовчуванням не є привабливою перспективою, але вміщує швидше записи, які насправді не перевірені. Ось чому навколо так багато шуму O_DIRECT.

Я можу сказати, що у вас не встановлено плагін InnoDB. З плагіном InnoDB має існувати кілька змінних.

Вам слід оновити InnoDB одним із двох способів:

Після цього ви можете покращити InnoDB до

  • отримати доступ до більшої кількості процесорів та ядер
  • збільшити читання та запис потоків вводу / виводу
  • масштабувати ємність вводу / виводу (особливо це потрібно для різних носіїв пам’яті)

Ось мої минулі публікації в налаштуваннях, які ви можете змінити для цього:


1

Я завжди знаходився під враженням, що O_DIRECTкраще за продуктивність, оскільки це запобігає подвійному буферизації. Крім того, за умови, що у вас є апаратний RAID з кешованим кешеним записом. Звичайно, це також залежить від навантаження, чи будете ви ЧИТАТИ чи ЗАПИСИ важкі.

Крім того , питання для фахівців: робити додаткові виклики fsync()для O_DIRECTпричини помітного погіршення загальної продуктивності, або це мізерно? Я ще не бачив, як це показують тести.

Також зауважте, що Percona включила можливість встановлення innodb_flush_method=ALL_O_DIRECT, що забезпечує прямий введення / виведення не тільки у файлах даних InnoDB, але і в журналах транзакцій InnoDB одночасно.


2
Ще в 2012 році буферний пул не мав успіху для величезної оперативної пам’яті, тому згадане подвійне буферизація може бути корисним для випадків, коли кеш ОС набагато більший, ніж пул буфера innodb. Щодо 5.6 і вище - я кажу, що ваша відповідь цілком справедлива.
noonex
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.