Задать вопрос
mksmvnv
@mksmvnv

Почему постоянно срабатывает OOM при работе бота на сервере?

У меня написан бот на Aiogram 3. Подключена БД Postgresql. Ранее хостился на NAT Cloud сервере и пол месяца ничего не вылетало, теперь перешел на VDS с теми же 512мб оперативы и стал килится бот Out of memory killer’ом. В логах так. Если смотреть по процессам, то больше всего жрет постгрес, хотя раньше на клауде такого не было, в коде ничего не менял, сервер настраивал также, без изменений. Не понимаю, в чем может быть проблема. Грешу на свой пока маленький опыт, так как это единственное, что я хостил с момента начала обучения. Просто смущает тот факт, что на NAT Cloud бот работал исправно.

Вот код мейна, мб у меня есть утечки памяти?
import asyncio
import asyncpg
import logging

from aiogram import Bot, Dispatcher
from aiogram.enums import ParseMode

from handlers import basic, callback
from middlewares.db_middleware import DbSession

from data.config import bot_token, pguser, pgpassword, database, host, port


async def create_pool():
    return await asyncpg.create_pool(user=pguser,
                                     password=pgpassword,
                                     database=database,
                                     host=host,
                                     port=port,
                                     command_timeout=60)


async def main():
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - [%(levelname)s] - '
                        '(%(filename)s).%(funcName)s(%(lineno)d) - %(message)s')

    bot = Bot(token=bot_token, parse_mode=ParseMode.HTML)
    pool_connect = await create_pool()
    dp = Dispatcher()

    dp.include_routers(basic.router, callback.router)
    dp.message.middleware.register(DbSession(pool_connect))

    try:
        await bot.delete_webhook(drop_pending_updates=True)
        await dp.start_polling(bot)
    finally:
        await bot.session.close()


if __name__ == '__main__':
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print('Exit')


Пробовал await pool_connect.close() прописывать в finally. Ничего не изменилось((

Если нужны другие куски кода, пишите отправлю. Буду очень благодарен за помощь!
  • Вопрос задан
  • 244 просмотра
Подписаться 1 Простой 4 комментария
Решения вопроса 1
ky0
@ky0
Миллиардер, филантроп, патологический лгун
Потому что когда на сервере работает несколько сервисов, им нужно явно указывать, сколько памяти они максимально могут потреблять - и в сумме должно получаться меньше, чем есть на сервере (минус сколько-нибудь под процессы ОС). Для Постгреса и вовсе - первая операция после установки, это редактирование настроек памяти.

Альтернатива ковыряния конфигов - разнесение всего хозяйства по контейнерам с лимитами памяти.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы