한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › L12 База данных

Исчерпание пула соединений Connection pool exhaustion

ID причины db-pool · Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Инфраструктура БД

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Число соединений с БД фиксировано, поэтому, когда медленные запросы занимают соединения, остальные запросы ждут.

Почему Медленные запросы или наплыв запросов занимают все соединения → Следствие Новые запросы ждут, пока освободится соединение → На экране Бесконечная загрузка при входе, задержки сохранения, таймауты

Симптомы
Ошибка входа / бесконечная загрузка, Задержка ввода
Факторы
Остановка, Задержка
У кого
Весь сервер, Только одна функция
Когда
Сразу после входа или техработ, При наплыве игроков
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Инфраструктура БД
Команда разработки: задачи
Убрать медленные запросы, настроить размер пула и таймаут ожидания (не раздувать пул без оглядки), разделить пулы по функциям.
Команда инфраструктуры: задачи
Проверить максимальное число соединений БД и запас по CPU и IOPS, перед добавлением серверов и автомасштабированием проверять, что число серверов × размер пула не превышает максимум соединений, добавить в мониторинг метрики ожидания соединений и блокировок.
Цифры для ориентира
Нужное число соединений прикидывают как «запросов в секунду × время, на которое один запрос занимает соединение». При 2 000 запросов в секунду по 5 ms в среднем постоянно заняты 10 соединений. С учётом пиков обычно берут в два-три раза больше. Если запрос замедлится до 150 ms, при той же нагрузке понадобится 300 соединений.
На графике
Упор в лимит (плато) · число занятых соединений с БД, время ожидания соединения
Где смотреть
Считать состояние соединений по каждому игровому серверу на стороне БД. В MySQL смотреть Host, Command (у простаивающих соединений Sleep) и Time в SHOW PROCESSLIST, Threads_connected и Threads_running, а также число отклонённых соединений Connection_errors_max_connections. В PostgreSQL считать pg_stat_activity с группировкой по client_addr и state. Если библиотека пула соединений в игровом сервере отдаёт число ожидающих запросов и время ожидания, смотреть и их
Подтверждает
Все соединения одного игрового сервера (столько, сколько позволяет пул) выполняют запросы, свободных 0, и в это время вход и сохранения ждут. Либо общее число соединений с БД дошло до max_connections, и новые соединения отклоняются
Опровергает
Если свободных соединений достаточно, а всё медленно, дело в задержке самих запросов (db-no-index, db-hot-row) или в нехватке ресурсов БД
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Если без оглядки раздувать пул, растёт только нагрузка на CPU БД и конкуренция за блокировки, и замедляются все. А если число серверов × размер пула превышает максимум соединений БД, новые или перезапущенные серверы не могут даже подключиться. Это часто случается при автомасштабировании и сразу после техработ.

Источники

  1. Number Of Database Connections PostgreSQL
    Когда ресурсы БД исчерпаны, рост числа соединений даже снижает производительность. И для задержки, и для пропускной способности лучше держать столько активных соединений, сколько позволяют ресурсы, а остальные запросы держать в очереди
  2. Too many connections MySQL
    Когда все max_connections заняты, новые соединения отклоняются с ошибкой Too many connections
  3. Connections and Authentication (PostgreSQL Documentation) PostgreSQL
    max_connections: предел числа одновременных соединений, по умолчанию обычно 100
  4. SHOW PROCESSLIST Statement MySQL
    Host (адрес клиента), Command (у простаивающей сессии Sleep), Time, State
  5. Server Status Variables MySQL
    Threads_connected и Threads_running, Connection_errors_max_connections (число соединений, отклонённых из-за достижения max_connections)
  6. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_activity: client_addr и state (active, idle, idle in transaction и др.) для каждого соединения

Смотрите также

Тот же слой: L12 База данных

Причины с тем же симптомом (Ошибка входа / бесконечная загрузка) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами