Потоки веб-контейнера WebSphere работают с максимальным состоянием потоков в runnable

У нас есть среда WebSphere с 2 агентами узлов и 4 серверами приложений. При большом трафике один из серверов приложений перестает отвечать на запросы, при этом он переходит к максимальному количеству потоков веб-контейнера.
Анализируя дамп потока, мы обнаружили, что около 60% потоков находятся в работоспособном состоянии, по 20% в состояниях ожидания и парковки.
Мы не видим никакого предупреждения о взаимоблокировке в дампе потока. При ближайшем рассмотрении мы обнаружили, что одному из потоков веб-контейнера принадлежит блокировка с сообщением ниже:

Owns Monitor Lock on com/ibm/ws/classloader/ExtJarClassLoader@0x0A00000000FA6F30

Может ли кто-нибудь помочь с пониманием вышеуказанной ошибки и ее устранением?

1 ответ

Решение

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

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