Тюнінг тредов (mysql threads tunning)

Тут упущено багато технічних деталей, прошу технарів не сильно докопуватися, тому що інформація "для чайників".

Отже. Як відомо, mysqld це "один процес - багато тредов". У досить наближеному розумінні тред (thread) це коли процес копіює сам себе, і батьківський процес передає тред якусь задачу для вирішення.






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

При кожному підключенні клієнта, mysql створює тред, який потребує такого типу з'єднання обробляє.

Якщо у вас середньо навантажених mysqld, то переконаєтеся що mysqld працює на нормальній реалізації тредов. Наприклад, FreeBSD нижче 6 гілки має ненормальну, глючну реалізацію тредов pthread. Основні глюки проявляються при роботі на SMP (більше 1 процесора). pthread "не вміє" нормально розкидати треди за різними процесорам і в результаті ми маємо ситуацію, коли Mysqld висить тільки на одному процесорі разом з купою своїх діточок. Всі інші процесори курять, навіть якщо Мускул з'їв все процесорний час свого процесора.

Отже, подивимося що у вас діється з тред. Якщо сервер слабо навантажений і має 1-2 підключення одночасно, то в цій оптимізації особливого сенсу немає. Набагато відчутний результат, коли сервер серйозно навантажений і має багато конкурентних запитів.

shell> mysqladmin extended-status

Звернемо увагу на значення:

Якщо Threads_cached дорівнює нулю, у вас відключений кеш тредов. Тобто при кожному підключенні створюється новий тред, а при відключенні він йде в / dev / null;). Це погано. Коли включений кеш тредов, то при відключенні клієнта тред йде в кеш, а при новому підключенні він не створюється, а береться з кешу. Це гігантська економія ресурсів при великих навантаженнях. У деяких ситуаціях навантаження зменшувалася в рази при використанні thread cache.







Threads_cached - кількість тредов в кеші

Threads_connected - грубо кажучи, кількість відкритих підключень

Threads_running - Скільки тредов зараз "працюють"

Threads_created - а ось і наріжний камінь. Скільки тредов було створено зі старту сервера. Якщо в кеші немає вільного тред, то він створюється. Якщо кеша немає взагалі, то при кожному підключенні створюється тред. А при відключенні побивається. Теж саме відбувається, якщо кеш тредов занадто маленький. Коротше. Якщо це значення у вас вимірюється тисячами, то у вас не все впорядке. Воно повинно бути трохи більше Threads_cached в ідеальному випадку.

Що робити якщо Threads_created має занадто високе значення?

У my.cnf є такий параметр thread_cache_size (або просто thread_cache). Його необхідно збільшувати експерементальних шляхом до того часу поки Threads_created не прийме порядок цифр Threads_cached.

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

Або періодично запускати таку команду:

shell> echo "SHOW GLOBAL STATUS" | mysql | grep Threads_connected | awk ''

Визначили середнє значення, записали в my.cnf (thread_cache), зробили рестарт сервера. Пішли, покурили, випили чайку. Дивись статус (команда вказана вище). Якщо Threads_created продовжує невгамовно рости вище значення кеша, збільшуємо змінну thread_cache. І так до перемоги, але не раджу вирощувати цю величину вище декількох сотень - ризикуєте отримати Out Of Memory.

При збільшенні цієї величини також треба моніторити Resident Set Size процесу mysqld в довгостроковій динаміці. Це колонка RSS в утиліті "top". Чи означає скільки mysql зараз займає місця в оперативний. Не раджу ростити його вище половини обсягу вашої оперативної пам'яті, тому що отримаєте пенальті, коли почнуть скорочуватися системні кеши.

Нормальне значення thread_cache, при якому Threads_created тримається на приемлимом рівні, а mysql помірно жере пам'ять коливається від 5 до 100 в залежності від навантаження і величини доступного ОЗУ.

Занадто високе значення thread_cache може необгрунтовано їсти зайву пам'ять.

Якщо вас це не врятувало, thread_cache перевищує мислимі норми і Mysql продовжує жерти пам'ять і процесор і породжувати треди, то необхідна комплексна оптимізація: 1. системи, 2. ядра, 3. логіки скриптів і запитів 4. інших стартових параметрів mysqld