Конфигурация пула потоков Сервер приложений Java

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

Я хотел бы знать, правильно ли я понимаю несколько конфигураций пула: 1. У нас есть конфигурация пула потоков, как показано ниже,

<thread-pools>
    <thread-pool name="admin-thread-pool" max-thread-pool-size="50" max-queue-size="1024"></thread-pool>
    <thread-pool name="http-thread-pool" max-thread-pool-size="250"></thread-pool>
    <thread-pool name="http-thread-pool-internal" max-thread-pool-size="50"></thread-pool>
    <thread-pool name="thread-pool-1" max-thread-pool-size="200"></thread-pool>
</thread-pools>

и

<transports>
    <transport name="tcp" acceptor-threads="8"></transport>
</transports>

и 2. Конфигурация пула EJB, как показано ниже,

<ejb-container steady-pool-size="0" max-pool-size="50"  pool-resize-quantity="10">

Итак, теперь вопросы.

  1. Что произойдет, если пул HTTP-потоков получит задачу, которую необходимо выполнить синхронно, и если в пуле недостаточно экземпляров EJB-компонентов (максимально настроено 50), потому что все экземпляры EJB обслуживают другие HTTP-запросы? Примечание. Мы выполняем поиск JNDI и не используем аннотации @EJB.

  2. Имеет ли смысл увеличивать количество экземпляров EJB (макс.), равное значению http-threadpool?

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


person nobody    schedule 07.12.2013    source источник


Ответы (1)


arrow_upward
5
arrow_downward

Что произойдет, если пул HTTP-потоков получит задачу, которую необходимо выполнить синхронно, и если в пуле недостаточно экземпляров EJB-компонентов (максимально настроено 50), потому что все экземпляры EJB обслуживают другие HTTP-запросы?

Пул EJB не является частью спецификации JEE, поэтому поведение пула зависит от поставщика. Согласно документации Glassfish (возможно, это может зависит от версии), если размер пула меньше steady-pool-size, при поступлении нового запроса Контейнер создаст X новых экземпляров ejb, где X определяется значением pool-resize-quantity. Поэтому у вас не должно закончиться объединенное в пул ejb. max-pool-size не является фиксированным пределом.

Имеет ли смысл увеличивать количество экземпляров EJB (макс.), равное значению http-threadpool?

Это может быть правильно, но обратите внимание, что Контейнер автоматически увеличивает размер пула, если в период высокой нагрузки требуется больше ejb. Вместо этого я бы изменил steady-pool-size на значение больше 0.

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

В случае (может быть неправильно настроенный пул) сервер исчерпал доступный ejb, имеет больше смысла, что он создает новый экземпляр вместо сериализации запросов клиентов. Об этом говорится в спецификации (ejb 3.1):

4.7 Сессионные компоненты без сохранения состояния ... Контейнер создает еще один экземпляр сеансового компонента без сохранения состояния, если он необходим для обработки увеличения рабочей нагрузки клиента...

Создание нового экземпляра ejb не должно быть слишком дорогим, если только ваш компонент не должен выполнять определенную бизнес-логику в момент инициализации (например, логику в аннотированном методе @PostConstruct).

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

person Gabriel Aramburu    schedule 10.12.2013