2015-07-15 2 views
0

Я выполняю некоторые тесты производительности в своем приложении, и в какой-то момент приложение перестает отвечать на запросы. Проверка журнала потока на http://localhost:7771/threads, я нашел следующие данные:Общие сведения о метках dropwizard

"org.eclipse.jetty.util.thread.QueuedThreadPool.dw.utilization" : { 
    "value" : 1.0 
}, 

Означает ли это, что мое приложение перегружено?

Также есть некоторые интересные цифры о резьбе:

"jvm.threads.blocked.count" : { 
    "value" : 0 
}, 
"jvm.threads.count" : { 
    "value" : 152 
}, 
"jvm.threads.daemon.count" : { 
    "value" : 12 
}, 
"jvm.threads.deadlock.count" : { 
    "value" : 0 
}, 
"jvm.threads.deadlocks" : { 
    "value" : [ ] 
}, 
"jvm.threads.new.count" : { 
    "value" : 0. 
}, 
"jvm.threads.runnable.count" : { 
    "value" : 11 
}, 
"jvm.threads.terminated.count" : { 
    "value" : 0 
}, 
"jvm.threads.timed_waiting.count" : { 
    "value" : 9 
}, 
"jvm.threads.waiting.count" : { 
    "value" : 132 
} 

Количество ожидающих потоков почти такой же, как число полных потоков.

Значит, какой «метрикой» следует использовать, чтобы определить, есть ли что-то, блокирующее потоки?

ответ

1

java.lang.management.ThreadMXBean интерфейс отвечает за сбор всех показателей для потоков, и это только интерфейс для управления всеми java-потоками в JVM.

Dropwizard - это просто оболочка, а класс ThreadStatesGaugeSet предоставляет способ возврата счетчиков потоков в разных состояниях с использованием API, открытого ThreadMXBean.

Так как в вашем случае jvm.threads.blocked.count равно 0, значит, поток не заблокирован, однако у вас есть высокое значение метрик jvm.threads.waiting.count, которое в соответствии с java doc вызвано главным образом из-за методов Object.wait, Thread.join или locksupport.park. Ниже приведена ссылка на документацию JAVA API, которая может предоставить подробную информацию об этом. Также некоторые из потоков JVM, такие как finalize, Reference Handler и т. Д., Также будут находиться в состоянии ожидания. Таким образом, над счетчиком ожидания используется приложение + потоки JVM.
https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html

В приведенном выше сценарии, мы можем видеть, что есть 11 запускаемых потоков, что означает попытаться разобраться в конфигурации операционной системы, а также и сколько ресурсов OS это работает нить берут. Являются ли они длинными потоками или нет? Если это не так долго, то следующие показатели должны отражать его (по умолчанию в Dropwizard он выдается через каждые 1 мин, но может быть настроен на любое значение, основанное на потребности приложения). Также будет полезен анализ дампа потока.

Смежные вопросы