Производительность запуска Tomcat: как предотвратить ожидание развертывания всех веб-приложений?

В нашем приложении 20 войн, и я столкнулся с проблемой, которую не могу решить.

У нас есть два случая развертывания Tomcat:

  1. Копировать артефакт после запуска
    Когда вы скопировали свои войны, когда Tomcat уже был запущен, вы можете вызывать приложения, которые уже были запущены до того, как все приложения будут запущены и запущены.

  2. Копировать артефакт перед запуском Когда вы скопировали свои войны, когда Tomcat не был запущен, вы не сможете вызывать приложение, пока все приложения не будут запущены и запущены.

Есть ли возможность настроить Tomcat для предотвращения ожидания, пока все войны будут развернуты для второго случая?

Заранее спасибо.

2 ответа

Решение

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

Чтобы достичь этого, вы реализуете столько приложений / соединителей / двигателей / хостов, сколько у вас есть приложений. Возможно, вам понадобится обратный прокси-сервер, если вы хотите, чтобы все они отвечали на одном и том же порту. Каждое приложение будет развернуто в своем собственном каталоге вместо каталога веб-приложений. Это то, что я делаю:

  <Service name="app1">
    <Connector port="8881" protocol="HTTP/1.1" address="localhost" />
    <Engine name="Engine1" defaultHost="localhost">
      <Host name="localhost"  appBase="app1" unpackWARs="true" autoDeploy="true" >
      </Host>
    </Engine>
  </Service>

  <Service name="app2">
    <Connector port="8882" protocol="HTTP/1.1" address="localhost" />
    <Engine name="Engine2" defaultHost="localhost">
      <Host name="localhost"  appBase="app2" unpackWARs="true" autoDeploy="true" >
      </Host>
    </Engine>
  </Service>
...

Изменить 1 Это не совсем ответ на второй случай, но если вы хотите избежать развертывания во время запуска, можно использовать deployOnStartup="false" в конфигурации хоста, и это значительно ускорит запуск. Это означает, что все развертывания будут выполнены, когда Tomcat уже запущен. Вот результаты до и после использования Tomcat 8.5 по умолчанию (CentOS 7, 6 vcpus):

18-Mar-2018 11:53:09.932 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 10628 ms
18-Mar-2018 11:53:56.200 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 49 ms

Редактировать 2 Старый ответ предполагает, и я согласен с ним, что несжатые войны ускорит развертывание. Может быть, вы выиграете 10%-15% времени запуска с этим.

Редактировать 3 Что касается двух вышеупомянутых правок, другой параметр может помочь вам ускорить запуск: startStopThreads в определении хоста, которое по умолчанию установлено в 1. Установите его в соответствии с количеством имеющихся у вас процессоров, в моем тесте с 6 vcpus он развернул запуск в два раза быстрее, развернув 1000 образцов войн. Этот момент обсуждался в списке рассылки пользователей, хотя он не выглядит широко используемым. Побочным эффектом этого параметра также является ускорение выключения, но Tomcat не регистрирует для этого метрики.

18-Mar-2018 17:02:45.678 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 15947 ms
18-Mar-2018 17:07:20.890 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 7594 ms

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

Вы также можете взглянуть на официальный Tomcat FasterStartUp, но он немного слабоват.

Держать autoDeploy="true" но установить deployOnStartup="false" для <Host> элемент в server.xml, Tomcat запустится без каких-либо веб-приложений, а через ~15 секунд процесс автоматического развертывания начнет развертывание веб-приложений по одному. Веб-приложения смогут обслуживать запросы, как только они начнутся.

Вы также можете использовать startStopThreads иметь более одного потока, запускающего веб-приложения, чтобы вы могли запускать их параллельно.

Недостаток этого подхода - задержка 15 секунд от запуска Tomcat до запуска первого веб-приложения. Вы можете определить одно или несколько веб-приложений в server.xml (как правило, не рекомендуется), поэтому они запускаются при запуске Tomcat, но тогда вы вернетесь к проблеме, которую не определило ни одно из приложений, определенных в server.xml будут доступны, пока они все не будут.

Другие вопросы по тегам