Многопоточное приложение java иногда не может получить все потоки в Websphere - PullRequest
5 голосов
/ 21 июня 2020

У меня есть исчерпывающее java приложение (JRE 1.8.0_201), которое требует выполнения в потоках, оно развернуто на IBM Websphere 9.

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

Если мы снова перезапустим веб-сферу, ситуация перейдет в нормальное состояние, для выполнения снова потребуются соответствующие параллельные потоки.

Есть ли какие-то конфигурации WAS, которые мне не хватает? или на java или на стороне ОС?

Ниже HW-архитектуры на Linux:

  • Архитектура: x86_64
  • Операционные режимы ЦП: 32-битный, 64-битный
  • Порядок байтов: Little Endian
  • ЦП: 4
  • Список ЦП в сети: 0-3
  • Количество потоков на ядро: 1
  • Количество ядер на сокет: 1
  • Разъем (и): 4

Ответы [ 2 ]

4 голосов
/ 23 июня 2020

Чтобы получить максимум информации о проблеме:

Дамп потока

Создает список текущего состояния всех потоков в JVM. Рекомендуется делать этот листинг несколько раз (в выходах с разными именами, не перезаписывайте свои дампы) в течение нескольких десятков секунд / минут, а в вашем случае, возможно, часов. Это позволяет фиксировать изменения и возможные тупиковые ситуации. Если ничего не изменилось и поток находится в той же строке, возможно, проблема.

Как сделать дамп потока:

Откройте консоль (CMD), переключитесь на «/Java/jdkx.x.x_xx / bin» (JDK) с помощью команды «cd». Затем введите «jstack JVM_PID> / thread_dump_1». Замените «JVM_PID» на идентификатор процесса запущенной JVM (Диспетчер задач - Подробности - столбец PID).

Вы также можете использовать такой инструмент, как VisualVM, чтобы получить дамп потока:

enter image description here

How read thread dumps:

Great article: https://dzone.com/articles/how-to-read-a-thread-dump

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

Как читать дампы потоков в вашей ситуации:

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

0 голосов
/ 30 июня 2020

Websphere имеет пул потоков для каждого сервера.

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

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

Моя первая рекомендация - использовать многопоточную структуру Java пользователя, такую ​​как Executor pool. Я бы порекомендовал вам установить ограничение на количество создаваемых потоков.

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
//10 is the max number of threads for this threadpool
executor.execute(<your Runnable Object here>);

Но, если вы все еще не хотите ограничивать, вы можете использовать:

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
//This will create thread as and when needed however, this would have a better management of threads as compared to simply creating threads.
executor.execute(<your Runnable Object here>);

Обратите внимание, что у вас могут закончиться потоки и память, так как ограничений нет.

В Webspehere вы можете установить количество потоков в: Серверы -> Все серверы -> -> Дополнительные свойства - -> Пулы потоков -> WebContainer Минимальный размер, Максимальный размер

...