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.