Как указать, что переводит поток в состояние ОЖИДАНИЯ в файл потока - PullRequest
0 голосов
/ 25 мая 2018

У меня есть linux верный на aws m4.xlarge, так что 4 процессора, 16 ГБ оперативной памяти.Он запускает java-приложение на tomcat7 и oracle java 8.

Очень часто приложение зависает и не принимает никаких других подключений.Торт состояния сообщит об этом как о неработающем, поскольку время ожидания ответа истекло.Datadog покажет, что темы превышены.Но прирост процессора не увеличивается (только 10% использования).Использование ОЗУ в течение этого периода остается неизменным.

Только перезапуск tomcat временно решает проблему (приблизительно 12 ч).Итак, я взял дамп потока и увидел столько потоков в состоянии ожидания.Поскольку это очень ново для меня, я слепой даже с данными.

Я надеялся, что смогу получить помощь здесь и в конечном итоге овладеть искусством шифрования файла дампа потока.Я приложил это здесь, и я также загрузил это в fastthread.io, и это говорит, что нет никакой проблемы .Я также загрузил полную нить на zerobin

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

1 Ответ

0 голосов
/ 25 мая 2018

Многие потоки находятся в состоянии ОЖИДАНИЯ, и это абсолютно нормально для них.Например, существуют потоки, имеющие следующую трассировку стека:

...
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
...

Это означает, что потоки ожидают выполнения каких-либо задач.

Однако другие стеки выглядят не очень хорошо.

java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at com.mchange.v2.resourcepool.BasicResourcePool.**awaitAvailable**(BasicResourcePool.java:1414)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:606)
- locked <0x000000055c2d3ce0> (a com.mchange.v2.resourcepool.BasicResourcePool)
at 
com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:526)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:755)

Эти потоки ожидают освобождения соединения в пуле.C3P0 - это пул соединений с базой данных.Вместо того, чтобы каждый раз создавать новое соединение, они кэшируются в пуле.После закрытия само соединение не закрывается, а только возвращается в пул.Таким образом, если по какой-либо причине (или другому пользователю) в спящем режиме не закрывать соединение после освобождения, пул может быть исчерпан.

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

Другой вариант - временно обойтись без C3P0 (пул).Это не навсегда, но, по крайней мере, вы можете проверить, правильно ли это предположение.

...