Приложение Jboss 4.2.3 с огромным количеством анонимных потоков

Мы поддерживаем устаревшее приложение (jboss 4.2.3, ejb 3, jsp, jdk 1.6.45 64b).

Это приложение интенсивно использует базу данных и отвечает на

  • HTTP-запрос пользователя
  • Запрос веб-службы
  • Некоторые соединения CORBA
  • Некоторый внешний вызов JSM
  • Некоторый внутренний процесс MDB

Пул HTTP-соединений стандартный (tomcat 5.5 с 250 подключениями), подключение к пулу базы данных увеличено до 300 (вместо стандартных 60).

jboss service.xml (где определен пул потоков по умолчанию)

<mbean code="org.jboss.util.threadpool.BasicThreadPool"name="jboss.system:service=ThreadPool">
  <attribute name="Name">JBoss System Threads</attribute>
  <attribute name="ThreadGroupName">System Threads</attribute>
  <attribute name="KeepAliveTime">60000</attribute>
  <attribute name="MaximumPoolSize">10</attribute>
  <attribute name="MaximumQueueSize">1000</attribute>
  <attribute name="BlockingMode">run</attribute>

One of our customer have some bad performance during part of the day.
There is a lot of threads generated without any relation with the users activities.

Количество потоков обычных действий составляет 300/400 потоков.

  • Иногда она увеличивается до 4k за секунды и медленно уменьшается за минуты
  • Иногда он может увеличиваться до 25 тыс. потоков, и для его уменьшения требуются часы, и приложение перестает отвечать на запросы (требуется перезапуск).

Дамп потока показывает, что все эти потоки RUNNABLE , но нет трассировки стека (другие «нормальные» потоки показывают обычную трассировку стека).

Все эти потоки называются "Thread-xxxxxx" и относятся к "объединенным потокам JBoss".

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

Любые идеи ?


person Greg Henry    schedule 19.01.2017    source источник


Ответы (1)


Решено! Проблема была связана с драйвером Jdbc SQL SERVER, наш код использует инструкцию setQueryTimeout для оператора, в драйвере есть ошибка, из-за которой он создает поток для каждого запроса для управления тайм-аутом.

см.: https://connect.microsoft.com/SQLServer/feedbackdetail/view/785983/jdbc-additional-thread-for-every-query-when-using-setquerytimeout
https://connect.microsoft.com/SQLServer/feedback/details/669427/property-to-create-timer-threads-per-statement-or-connection-in-jdbc-driver

Удаление инструкции setQueryTimeout решает проблему.

ХТХ!

person Greg Henry    schedule 01.02.2017