Число соединений с БД фиксировано, поэтому, когда медленные запросы занимают соединения, остальные запросы ждут.
Почему Медленные запросы или наплыв запросов занимают все соединения → Следствие Новые запросы ждут, пока освободится соединение → На экране Бесконечная загрузка при входе, задержки сохранения, таймауты
Сразу после входа или техработ, При наплыве игроков
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Инфраструктура БД
Команда разработки: задачи
Убрать медленные запросы, настроить размер пула и таймаут ожидания (не раздувать пул без оглядки), разделить пулы по функциям.
Команда инфраструктуры: задачи
Проверить максимальное число соединений БД и запас по 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 БД и конкуренция за блокировки, и замедляются все. А если число серверов × размер пула превышает максимум соединений БД, новые или перезапущенные серверы не могут даже подключиться. Это часто случается при автомасштабировании и сразу после техработ.
Источники
Number Of Database ConnectionsPostgreSQL Когда ресурсы БД исчерпаны, рост числа соединений даже снижает производительность. И для задержки, и для пропускной способности лучше держать столько активных соединений, сколько позволяют ресурсы, а остальные запросы держать в очереди
Too many connectionsMySQL Когда все max_connections заняты, новые соединения отклоняются с ошибкой Too many connections
SHOW PROCESSLIST StatementMySQL Host (адрес клиента), Command (у простаивающей сессии Sleep), Time, State
Server Status VariablesMySQL Threads_connected и Threads_running, Connection_errors_max_connections (число соединений, отклонённых из-за достижения max_connections)