IO зачекайте, спричиняючи стільки уповільнення (EXT4 JDB2 при 99% IO) під час Mysql


14

Я пишу індексатор, використовуючи python, який індексує документи та вставляє їх у базу даних, раніше це був єдиний процес, але тепер я зробив це для багатопроцесорної роботи з чотирма паралельними процесами. Після кожного вилучення тексту він вставляється в базу даних і виконує фіксацію.

Тепер це стосується проблеми IO, головна проблема IO - це не мій процес, а jdb2, система керування їздами EXT4. Очікувати IO на кожному MySQL-коміті становить 99,99% та вимагає отримання CPU.

Я бачив, що багато хто має цю проблему в Інтернеті, і їх рішення полягає в монтажі, використовуючи бар'єр = 0. Це повністю відключить Журналіст? Мої сервери мають UPS і спокушають це робити, чи варто?


Чи всі ваші дані InnoDB ???
RolandoMySQLDBA

Відповіді:


4

Помістіть базу даних у файлову систему без журналу. Принаймні більші сервери (oracle, sql сервер) мають свою функцію журналу (журнал транзакцій) і оптимізують відповідний IO відповідно. У вас є журнал і база даних на окремих файлових системах і дисках, і ви покладаєтесь на внутрішню функціональність бази даних для роботи з поганим IO. Зазвичай не змінюється файлова система (більша настройка), окрім дати запису в будь-якому випадку, оскільки файли не розширюються - вони будуть генеровані з їх "остаточним" розміром (нормально, адміністратори можуть це змінити), а зміни, як я вже сказав, відслідковуються базою даних журнал транзакцій рівня.

Ви також можете сказати нам, що таке ваш апаратний рівень. Більшість людей недооцінюють, що IOPS є обмежуючим фактором для бази даних і вважають, що невеликий набір дисків є належним середовищем для великої бази даних. Хоча деякі з нас працюють над базами даних, використовуючи більшу кількість дисків, таким чином, потенційно підтримуючи більшу кількість IOPS.


Я б змінив це до використання файлової системи, яка не використовує журнал для даних, а лише метадані. Ext4 може бути налаштований і таким чином.
Вабіт

Так. Зрештою, джоурнал подвоює IO - і журнал баз даних зробить те ж саме знову, тож ви затягуєте набагато більше IOPS, ніж вам потрібно. І надмірність, яка в основному не потрібна. Система джоурналінгу - це NICE для захисту файлу .... але марно, коли програма вже робить це, що роблять бази даних.
TomTom

Хто пропонує найкращі показники в нереєстраційному журналі? Спасибі!
Phyo Arkar Lwin

4

Завжди буде компроміс між стійкістю та продуктивністю.

З MySQL на ext4 за замовчуванням бар'єри = 1 дійсно спричиняють уповільнення, однак першою дією не повинно бути відключення журналу чи включення даних = запису даних.

По-перше, якщо стійкість має велике значення, RAID, що підтримується батареєю, безумовно, того варто.

Я вибрав варіанти кріплення, особливо на RAID, що не підтримується батареєю:

/dev/mapper/vg-mysql--data  /var/lib/mysql/data ext4  defaults,noatime,nodiratime,barrier=1,data=ordered  0 0

Це навмисно не використовується data = writeback, тому що я не хочу ризикувати пошкодженням файлової системи, в результаті чого "старі дані з'являтимуться у файлах після збоїв та відновлення журналу" (цитата від man mount).

Ідеальна конфігурація в my.cnf для повної стійкості навколо налаштувань вводу / виводу:

[mysqld]
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

Я вибрав таку послідовність компромісів для підвищення ефективності:

  1. sync_binlog = 0: це перший конфігурація MySQL, яку я змінюю від повної стійкості. Причиною цього є те, що це дає значне поліпшення продуктивності, особливо там, де binlog_format=row(на жаль, потрібно Джирі). Я використовую достатньо реплік MySQL у кластері, що якби бінлог був зіпсований сценарієм втрати живлення, я би зробив бінарну копію з іншої репліки.
  2. innodb_flush_log_at_trx_commit = 2: Хоча для повного відповідності ACID потрібне значення 1, зі значенням 2 "буфер журналу виписується у файл при кожному фіксації, але операція змивання з диском на ньому не виконується. Однак промивання на Файл журналу відбувається раз на секунду, також коли значення дорівнює 2. Зверніть увагу, що промивання один раз в секунду не гарантується на 100%, що трапляється щосекунди, через проблеми з плануванням процесу ". (цитата з документів MySQL)
  3. Оновіть параметри кріплення для використання data=writeback. Зауважте, що якщо це ваша коренева файлова система, вам також потрібно буде пройти параметр командного рядка ядра. Я зібрав кілька кроків щодо цього в кодеруоллі .
  4. Перевірте різні значення innodb_flush_method. Показано, що O_DIRECT покращує продуктивність на деяких робочих навантаженнях, але це не означає, що це буде працювати у вашому середовищі.
  5. Оновлення до SSD - накопичувачів, в цьому випадку ви також хочете збільшити innodb_io_capacity, а також налаштовувати параметри , такі як innodb_adaptive_flushing, innodb_read_io_threads, innodb_write_io_threads, innodb_purge_threads, і інші можливі настройки.

3

Цілком ймовірно, що ваш вхідний / вихідний сервер не так добре впорається з навантаженням. Ви повинні переконатися, що ваша файлова система не записує дані. Я б запропонував використовувати data=writeback,relatime,nobarrierпараметри для монтажу для розділу даних вашої бази як першої швидкої та брудної оптимізації.

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


так як щодо: data = записування, відновлення часу, nobarrier, а потім повністю відключити mysql Logging? Я думаю, що це значно пришвидшило б справи?
Phyo Arkar Lwin

hdpram -i показує, що я використовую кешування запису. так хм ??
Phyo Arkar Lwin

@ V3ss0n ви не можете відключити ведення журналу для транзакційного двигуна - це саме його серце. Ви можете перенести журнал транзакцій на інший набір дисків, оскільки він має зовсім інший шаблон доступу (в основному лінійний запис), ніж основні дані бази даних (випадкове читання / запис) - це звичайно рекомендована конфігурація. Що стосується налаштування пам’яті: ви не використовуєте контролер RAID, а просто окремі диски з кешем запису? Це не допоможе жодному з ваших синхронних записів, оскільки вони надходять із явними запитами на промивання кешу.
Вабіт

Це nobarrierте саме, що barrier=0?
Нік Коттрелл

@NicCottrell так, вони однакові.
Кутон

3

Це старе запитання, але ми стикалися з тими ж проблемами (високий IO чекає та жахливі швидкості вставки / оновлення) минулого тижня на новому виділеному сервері, і це рішення вирішує цю проблему безпосередньо.

Відключення журналу за допомогою tune2fs -O "^has_journal" /dev/<drive>було найшвидшим рішенням, оскільки воно виключає очікування вводу-виводу через процес JDB2. Але це не рекомендується, якщо у вас немає накопичувача, який підтримується батареєю, оскільки ви втратите дані в разі аварії. Таблиці InnoDB є безпечними, якщо ви doublewriteввімкнули MySQL. Але такі файли, як .frm, журнали тощо, не є безпечними. Ми намагалися перемістити ці файли на інший накопичувач (особливо журнали бін), але очікування jdb2 IO все ще зберігається. Тож це не залишило нас дуже комфортним.

data=writeback,relatime,nobarrierне допомогло йому прискорити запис / читання стільки, скільки вимкнення журналу для всього розділу. Більше варіантів для ext4 є в документі EXT4 .

Справжнім винуватцем у нашому випадку був sync_binlog. Ми встановили як 1в /etc/mysql/my.cnfі це вбиває продуктивність.

Перкона це підтверджує тут . Ми встановили його за замовчуванням, 0а продуктивність збільшилася на понад 500%.


0

Який двигун бази даних ви використовуєте для вставки цих даних?

Якщо це MyISAM: він повинен блокувати всю таблицю під час запису, тож запуск одночасних потоків вставки вбиває будь-яку систему, незалежно від того, наскільки потужна.

Переконайтеся, що ви використовуєте InnoDB для цих таблиць.


Оскільки він здійснює транзакції, двигун не буде MyISAM, оскільки MyISAM не підтримує транзакції.
the wabbit

Arr, мозковий дальність.
адаптор

Я використовую innodb, mysql5.5 за замовчуванням innodb.
Phyo Arkar Lwin

0

Крім того, це не пов'язано безпосередньо з mysql, але деякі HD мають проблеми з ext4 через агресивне управління потужністю ... коли це відбувається, навантаження машини збільшується без видимих ​​дій.

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

Перевірте поточне значення:

    hdparm -B /dev/sda

Вимкніть це

   hdparm -B 255 /dev/sda

(або все, що є вашим HD) і протестуйте. Можливо, це не допоможе для більшості питань, але це може допомогти деяким користувачам там. Перезавантаження сканує значення або вручну замінить 255 на попереднє значення.

Якщо це допомагає, перевірте /etc/default/hdparmчи /etc/hdparm.confє більш постійний конфігурацію, встановивши його на завантаженні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.