Ми сказали їм не купувати більше RAM.
Магазин товарів для дому отримав ранок помилок «too many connections». Очевидне рішення було більше RAM. Дані сказали не витрачати на це гроші: робочий набір уже вміщувався в пам’яті, а відповідь була у власних правилах застосунку.
У цій статті 3 розділів
- База даних магазину товарів для дому одного ранку почала повертати ERROR 1040: Too many connections, одразу після того, як заповнився простір тимчасових таблиць.
- Очевидним рішенням було більше RAM: база даних, більша за свій buffer pool, виглядає голодною. Збільшення пулу коштувало б грошей і не виправило б нічого.
- Вимірювання це скасувало. Buffer pool влучав у кеш майже щоразу і ще мав вільне місце. Робочий набір уже був у пам’яті.
- Справжньою причиною була одна таблиця правил знижок, яка розрослася далеко за межі того, що потрібно магазину. Виправлення було в правилах застосунку, а не в додатковій RAM.
Усе почалося як ранок помилок з’єднання. Простір тимчасових таблиць, на tmpfs, заповнився, і за кілька секунд база даних почала відповідати ERROR 1040: Too many connections. Наш черговий інженер мав це на екрані за лічені хвилини, і ми від самого початку працювали над цим разом з розробниками магазину.
temp-table space (tmpfs) ........ FULL
… seconds later …
mysqld: ERROR 1040 (HY000): Too many connectionsДорога відповідь, і чому ми її відклали
База даних, більша за свій buffer pool, і вільна пам’ять на машині. Кожна поверхнева цифра вказує в один бік: дайте пулу більше RAM, і готово. Це виглядає як прогрес і коштує реальних грошей. Вимірювання сказало, що це не виправить нічого.
| ДОРОГА ВІДПОВІДЬ | ЩО СКАЗАЛИ ДАНІ |
|---|---|
| База даних більша за пул. Збільште пул. | Коефіцієнт влучань у кеш був майже ідеальним. Робочий набір уже жив у пам’яті. |
| Більший кеш виправляє переповнення. | У пулі вже було невикористане місце. Більше RAM кешувало б дані, які вже закешовані. |
| ДАНІ ПЕРЕМОГЛИДодайте обладнання, і проблему вирішено. | Розрослa таблиця продовжує рости за більшим пулом, доки знову не переповнить його. |
Два показники все вирішили. Buffer pool майже ніколи не промахувався, і в ньому ще залишалися вільні сторінки. Разом вони кажуть одне: робочий набір уже повністю вміщувався в пам’яті. Не було даних, які чекали б на диску на більший кеш.
Справжня причина була в розмірах таблиць
Коли пам’ять було виключено, ми перейшли до розмірів таблиць. Одна виділялася: таблиця комбінацій правил знижок, безумовно найбільше, що було в базі даних.
Ця таблиця генерується з активних правил знижок магазину, а кількість комбінацій зростає як квадрат кількості правил. З часом правила накопичилися, і таблиця росла разом з ними. Запити до неї переповнювали простір тимчасових таблиць, і це переповнення каскадом переходило у вичерпання з’єднань. Помилка 1040 була останнім доміно, а не першим.
# table name is an illustrative rename.
> table sizes, largest first
discount_rule_combinations largest table by a wide margin
↳ generated from the active discount rules
↳ combinations grow with the SQUARE of the rule countДисциплінована відповідь і дорога відповідь вказували в протилежні боки
Більший пул виграв би час, а таблиця продовжувала б рости за ним. Лише одна відповідь торкалася справжньої причини: навести лад у правилах знижок, обмежити комбінації і залишити обладнання як є. Розробники магазину внесли зміну, і помилки припинилися.
Машина ніколи не була проблемою. Дані показали, що робочий набір уже вміщувався в пам’яті, тому виправлення було в правилах застосунку, а не в додатковій RAM. Найкорисніше, що ми могли дати цьому клієнту, це не більше нашого обладнання. Це була причина його не купувати.
“Іноді найцінніше, що може сказати вам хостинг-провайдер: не витрачайте грошей.”
Прямі відповіді
Моя база даних видала «ERROR 1040: Too many connections». Чи треба підняти ліміт з’єднань?+
Зазвичай ні. Вища стеля не виправляє того, що тримає з’єднання відкритими, вона дозволяє більшій їх кількості накопичитися, перш ніж щось спрацює. Розумний ліміт відмовляє швидко і тримає шкоду малою. Знайдіть те, що тримає сесії, перш ніж піднімати число.
Чи треба додати більше RAM, якщо моя база даних більша за мій buffer pool?+
Не на підставі лише цього факту. Число, яке це вирішує, це коефіцієнт влучань buffer pool, а не розмір на диску. Якщо пул уже влучає майже щоразу і має вільні сторінки, робочий набір вміщується в пам’яті, і більше RAM кешувало б дані, які вже закешовані.
Який нормальний коефіцієнт влучань buffer pool InnoDB?+
Понад 99 відсотків, щойно робочий набір вміщується в пам’яті. Якщо пул уже там і ще має вільні сторінки, більший пул не дає нічого. Подивіться натомість на запити.
Чому мій простір тимчасових таблиць MySQL постійно заповнюється?+
Зазвичай через запит, що створює набагато більше проміжних рядків, ніж потрібно результату. Тут дуже велика таблиця правил знижок переповнила простір тимчасових таблиць, що потім каскадом перейшло у вичерпання з’єднань. Виправлення було в даних, а не в диску.
Чи скаже мені EuroVPS не купувати оновлення?+
Так, коли дані кажуть, що оновлення не виправляє нічого. Ми радше простежимо справжню причину, ніж продамо вам обладнання, яке її приховує. У цьому випадку чесна відповідь була: не збільшуйте buffer pool, наведіть лад у правилах.
Перш ніж купувати оновлення, дозвольте нам прочитати цифри.
Якщо більша машина це виправить, ми так і скажемо. Якщо вона лише приховає справжню причину, ми скажемо і це, разом з вимірюванням.
Поговоріть з інженером (shell cta.talkToEngineer)Ви дійшли до кінця.
Застосуйте прочитане на практиці
Що ви запускаєте?
Розкажіть нам про навантаження, трафік і вимоги до відновлення. Почніть з конструктора сервера або обговоріть деталі з інженером.
Написано інженерами, які будують і експлуатують інфраструктуру, про яку йдеться.Поговоріть з інженером
