и базы данных работают. Может кто-нибудь помочь с такой проблемой:
TimeoutError: QueuePool limit of size 20 overflow 10 reached, connection timed out, timeout 30
Коннекты в эндпоинтах создаются так — в глобальный app прокидывается Session(который фабрика сессий) и в самих эндпоинтах Session вызывается и я получаю сессия для эндпоинта, а затем ее уже использую. Я что-то делаю не так или дело в том, что нагрузка такая большая?
а закрываешь session?
Да, я открываю через контекстный менеджер, через два даже: async with self.request.app['session_pull']() as session: async with session.begin():
В app['session_pull'] лежит Session
так, асинкио. А в какой момент это вызывается?
Внутри эндпоинта, потом я дергаю уже внутреннюю функцию для работой с бд и передаю туда сессию
а сколько времени занимает обработчик и сколько rps?
выглядит как будто действительно нагрузка, но нужно больше данных
Ну примерно 10-50мс в зависимости от эндпоинта, рпс где-то 1-2тысячи на реплику
Так блин, я криво посчитал, рпс 200 на реплику, суммарный где-то 1-2 тысячи
что ж ты сразу молчал =)
То есть, все-таки нагрузка?(
ну давай посчитаем. 50мс на один запрос. Значит без конкурентности ты можешь обрабатывать 20 запросов. У тебя 2к RPS, значит это дает 100 конкурентных запросов. А у тебя лимит 30 соединений. =)
Ну мы в джва раза снизили нагрузку и вроде пропали такие ошибки. А на что увеличение конкурентных запросов влияет? Я понимаю, что больше соединений можно открыть, но наверняка это не бесплатно все
каждое соединение будет кушать ресурсы СУБД, если много чтений (то есть без транзакций всё) - вероятно pgbouncer какой-нибудь поможет иметь много клиентских соединений и мало реальных с сервером БД
Обсуждают сегодня