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 шт):
следующие настройки помогли. подозреваю, что на самом деле пригодилась только последняя строчка.
postgresql.conf
tcp_keepalives_idle = 60
tcp_keepalives_interval = 1
tcp_keepalives_count = 5
конфиг nginx
send_timeout 600;
proxy_connect_timeout 600;