Перейти до вмісту
EuroVPSEuroVPS

Ми сказали їм не купувати більше RAM.

Магазин товарів для дому отримав ранок помилок «too many connections». Очевидне рішення було більше RAM. Дані сказали не витрачати на це гроші: робочий набір уже вміщувався в пам’яті, а відповідь була у власних правилах застосунку.

Автор EuroVPS EngineeringМашинне відділення

5 хв читання
У цій статті 3 розділів
Коротко
  • База даних магазину товарів для дому одного ранку почала повертати ERROR 1040: Too many connections, одразу після того, як заповнився простір тимчасових таблиць.
  • Очевидним рішенням було більше RAM: база даних, більша за свій buffer pool, виглядає голодною. Збільшення пулу коштувало б грошей і не виправило б нічого.
  • Вимірювання це скасувало. Buffer pool влучав у кеш майже щоразу і ще мав вільне місце. Робочий набір уже був у пам’яті.
  • Справжньою причиною була одна таблиця правил знижок, яка розрослася далеко за межі того, що потрібно магазину. Виправлення було в правилах застосунку, а не в додатковій RAM.

Усе почалося як ранок помилок з’єднання. Простір тимчасових таблиць, на tmpfs, заповнився, і за кілька секунд база даних почала відповідати ERROR 1040: Too many connections. Наш черговий інженер мав це на екрані за лічені хвилини, і ми від самого початку працювали над цим разом з розробниками магазину.

THE MORNING, IN TWO LINES
temp-table space (tmpfs) ........ FULL
… seconds later …
mysqld: ERROR 1040 (HY000): Too many connections

Дорога відповідь, і чому ми її відклали

THE REFLEX THAT LOOKS LIKE PROGRESS

База даних, більша за свій buffer pool, і вільна пам’ять на машині. Кожна поверхнева цифра вказує в один бік: дайте пулу більше RAM, і готово. Це виглядає як прогрес і коштує реальних грошей. Вимірювання сказало, що це не виправить нічого.

ДОРОГА ВІДПОВІДЬЩО СКАЗАЛИ ДАНІ
База даних більша за пул. Збільште пул.Коефіцієнт влучань у кеш був майже ідеальним. Робочий набір уже жив у пам’яті.
Більший кеш виправляє переповнення.У пулі вже було невикористане місце. Більше RAM кешувало б дані, які вже закешовані.
ДАНІ ПЕРЕМОГЛИДодайте обладнання, і проблему вирішено.Розрослa таблиця продовжує рости за більшим пулом, доки знову не переповнить його.

Два показники все вирішили. Buffer pool майже ніколи не промахувався, і в ньому ще залишалися вільні сторінки. Разом вони кажуть одне: робочий набір уже повністю вміщувався в пам’яті. Не було даних, які чекали б на диску на більший кеш.

Справжня причина була в розмірах таблиць

Коли пам’ять було виключено, ми перейшли до розмірів таблиць. Одна виділялася: таблиця комбінацій правил знижок, безумовно найбільше, що було в базі даних.

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

WHERE THE SPACE WENT
# 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)

Ви дійшли до кінця.

Застосуйте прочитане на практиці

Що ви запускаєте?

Розкажіть нам про навантаження, трафік і вимоги до відновлення. Почніть з конструктора сервера або обговоріть деталі з інженером.

Написано інженерами, які будують і експлуатують інфраструктуру, про яку йдеться.
Поговоріть з інженером
XIn

Залишилося 5 хв