【问题标题】:Understanding dropwizard metrics了解 dropwizard 指标
【发布时间】:2015-07-15 09:49:54
【问题描述】:

我正在对我的应用进行一些性能测试,但有时应用会停止响应。查看http://localhost:7771/threads的线程日志,发现如下数据:

"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
}

等待线程数与总线程数几乎相同。

那么我应该使用哪个“指标”来确定是否有东西阻塞了线程?

【问题讨论】:

    标签: multithreading profiling dropwizard


    【解决方案1】:

    java.lang.management.ThreadMXBean 接口负责收集线程的所有指标,它只是管理JVM中所有java线程的接口。

    Dropwizard 只是它的一个包装器,它的 ThreadStatesGaugeSet 类提供了一种使用 ThreadMXBean 公开的 API 返回处于不同状态的线程计数的方法。

    由于在您的情况下,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 个可运行线程,这意味着还要尝试查看您的操作系统配置以及这些运行线程占用了多少操作系统资源。它们是长时间运行的线程吗?如果它运行时间不长,那么下一个指标应该反映它(默认情况下,在 Dropwizard 中它每 1 分钟发出一次,但可以根据应用程序需要配置为具有任何值)。对线程转储的分析也会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 2017-01-14
      相关资源
      最近更新 更多