504 после загрузки большого количества файлов

В рельсовом приложении есть код, который обрабатывает загрузку файлов. Суть в следующем: Какое-то кол-во файлов отправляется с формы, попадает на сервер, вызывается транзакция, в которой создается пара записей в БД и файлы сохраняются в Google Cloud. Файлы могут быть относительно большими (до 50 мб каждый). При загрузке на продакшене примерно 200 мегабайт (10 файлов) появляется проблема: Все файлы загружены, но в ответ от запроса пользователю приходит 504 ошибка, в логах ничего криминального - маршруты и запросы к бд.

При дебаггинге и тестировании обнаружил, что во время или после загрузки, с api, которое работает в том же приложении приходит 504 ошибка на клиент:

ActiveRecord::ConnectionTimeoutError
could not obtain a connection from the pool within 5.000 seconds (waited 5.001 seconds); all pooled connections were in use

Не могу понять в чем проблема, пробовал следующее:

  • Увеличить pool до 50 в database.yml
  • Увеличить checkout_timeout до 10 минут в database.yml
  • Увеличить client_max_body_size в nginx до пары гигабайт
  • Увеличить keepalive_timeout до 10 минут
  • Увеличить keepalive_requests до 100
  • Увеличить таймаут в config/puma.rb до 10 минут
  • Увеличить кол-во тредов в config/puma.rb до 10 при 2-х воркерах.

Возможно, дело в Google Cloud, но я даже не знаю где и как можно посмотреть логи или другие подробности загрузки файлов.

П.С. я понимаю, что долгие запросы лучше обрабатывать асинхронно но задачу нужно решить именно в таком кейсе.


Ответы (1 шт):

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

следующие настройки помогли. подозреваю, что на самом деле пригодилась только последняя строчка.

postgresql.conf

tcp_keepalives_idle = 60
tcp_keepalives_interval = 1
tcp_keepalives_count = 5

конфиг nginx

    send_timeout 600;
    proxy_connect_timeout 600;
→ Ссылка