Как найти причину выполнения множества запросов в 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 шт):

Автор решения: Guzya

Посмотрите в проблемный момент в 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-ов для транзакций, возможно надо поставить автокоммит.

→ Ссылка