Как найти причину выполнения множества запросов в Postgresql + Python
Всем привет! В проекте у меня используется aiogram, Fastapi, redis, celery + sqlalchemy. Так же на сервере отдельно установлена БД postgres На fASTAPI написано API для web-app телеграма, на aiogram функционал для бота, бывает такое, что бот отслеживает не все действия в канале, к которому он привязан. смотрю логи FASTAPI и ботов, вижу там, что иногда всплывает исключение с postgres DataBase is locked. Захожу посмотреть дашборды базы данных на сервере, и вижу там в это время около 4-5000 запросов FETCH и столько же приимерно запросов RETURNED, не пойму откуда они берутся. Столько пользователей не могло сразу отправить запросы. использую postgres + asyncpg вот таким обрахзом:
DATABASE_URL = f'postgresql+asyncpg://{user}:{password}@{db_host}:5432/{db_name}'
engine = sqlalchemy.ext.asyncio.create_async_engine(DATABASE_URL,
echo=True,
connect_args={"timeout": 8},
pool_size=20,
max_overflow=10)
async_session = sessionmaker(engine,
expire_on_commit=False,
class_=sqlalchemy.ext.asyncio.AsyncSession)
Этот файл общий для нескольких контейнеров docker(fastapi, bot, celery) и уже в коде каждого из этих экземпляров идет обращение к async_session через следующую функцию:
async def get_async_session() -> async_session:
async with async_session() as session:
yield session
потом в FASTAPI я передаю эту функцию в Depends а в телеграм боте использую так:
async for session in get_async_session():
И далее работа уже с помощью await execute и session.commit Может быть, кто-то сталкивался с этой проблемой?
Пробовал смотреть логи, найти зависимость, но нет, всё возникает совершенно в рандомное время
Ответы (1 шт):
Посмотрите в проблемный момент в postgres
select count(*),state,wait_event_type,wait_event,
substring(query from 1 for 100)
from pg_stat_activity
group by state, wait_event_type,wait_event,
substring(query from 1 for 100)
order by count(*) desc;
Нет ли в state значения idle in transaction
Если да, проверяйте выполнение commit-ов для транзакций, возможно надо поставить автокоммит.