Приложение Dockerized Rails: медленно после запуска контейнера - PullRequest
1 голос
/ 20 февраля 2020

Наше приложение Rails (5.1.7) работает внутри контейнера docker -swarm (Ruby 2.6.5, PostgreSQL 10).

Мы пробовали веб-сервер Puma, и это не было он достаточно хорош при большой нагрузке, поэтому мы используем Unicorn (5.5.2).

И мы сталкиваемся с большой проблемой.

После запуска контейнера каждая страница загружается очень медленно для первой время до одной минуты. Все последующие запросы на те же страницы отвечают быстро.

Похоже, что это не проблема Unicorn, потому что после сигналов HUP (перезапуск) или QUIT (выключение) (+ запуск) страницы загружаются достаточно быстро.

Эта проблема возникает после развертывания (docker stack deploy ...) или обновления (docker service update ...).

Docker схема:

  • два отдельных сервера
  • два стека (staging + demo);
  • оба стека используют один и тот же контейнер Nginx (+ создана внешняя сеть для их соединения)
  • каждый стек включает в себя:
    • PostgreSQL контейнер
    • контейнер приложения Rails
    • контейнер Redis
    • контейнер RabbitMQ
    • фоновый рабочий контейнер

Возможно, стоит отметить, что все промежуточные контейнеры работают на сервер 1 (кроме Nginx), и демонстрационные контейнеры распределяются между двумя rvers: на сервере 1 у нас есть демо PostgreSQL, Redis и RabbitMQ, а на сервере 2 у нас есть приложение Rails, фоновые рабочие и Nginx. И проблема воспроизводится на обоих стеках.

Есть идеи, как решить проблему? Заранее спасибо.

ОБНОВЛЕНИЕ (2020.02.24)

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

# SLOW request
I, [2020-02-24T09:47:55.634574 #464]  INFO -- : Completed 200 OK in 57087ms (Views: 56624.1ms | ActiveRecord: 104.7ms)
# FAST request
I, [2020-02-24T09:48:21.101165 #461]  INFO -- : Completed 200 OK in 993ms (Views: 486.6ms | ActiveRecord: 110.1ms)

1 Ответ

1 голос
/ 25 февраля 2020

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

# first SLOW request
I, [2020-02-24T09:47:55.634574 #464]  INFO -- : Completed 200 OK in 57087ms (Views: 56624.1ms | ActiveRecord: 104.7ms)

# second FAST request
I, [2020-02-24T09:48:21.101165 #461]  INFO -- : Completed 200 OK in 993ms (Views: 486.6ms | ActiveRecord: 110.1ms)

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

Итак, наше решение состояло в том, чтобы сохранить кэш рельсов в общем постоянном томе docker и создать символическую ссылку на него до сервер приложений запускается. В результате, если страница была кэширована, даже первый запрос на ее открытие будет очень быстрым.

...