【问题标题】:Tomcat - Is there a way to spew the current/active requests that have not yet responded?Tomcat - 有没有办法吐出尚未响应的当前/活动请求?
【发布时间】:2019-01-04 13:42:46
【问题描述】:
我很难调试响应时间较长的问题。我的 Web 应用程序有时需要很长时间才能响应,而且我很难确定是罪魁祸首的具体请求。我遇到的麻烦是tomcat只有在响应请求后才会记录到访问日志中。我想知道是否有一种方法可以在所有传入请求进入时记录它们(而不是等待响应),或者告诉 tomcat 吐出它当前正在处理的所有请求(类似于 jstack,但是向我显示线程向我显示当前/活动的请求 url)?
【问题讨论】:
标签:
java
performance
tomcat
web-applications
【解决方案1】:
一旦提供服务,可以通过使用 time-taken 令牌激活 Extended Log Valve 来识别慢速请求。这不是您真正的问题,因为您希望实时查看,但不清楚您是否已经确定响应时间很长请求。
VisualVM 将向您展示正在运行的线程,但这还不足以了解正在发生的事情。可能您再次需要激活扩展日志阀,这次使用 x-threadname 标记来与您在 VisualVM 中看到的内容进行比较。但是对于调试本身来说,上面的解决方案(time-taken token)通常就足够了。
但这可能不足以识别瓶颈,特别是如果应用程序实际上完全没有问题(而且这似乎是一个随机问题)。应用程序是否使用数据库?如果是这样,请激活慢查询日志,例如使用MySQL。它是否使用任何其他层(身份验证、NFS/CIFS、..)?如果是这样,您需要监控它们的可用性,以防它们在不可用时阻止任何东西。