【问题标题】:How to find out which tomcat webapp has a thread leak?如何找出哪个tomcat webapp有线程泄漏?
【发布时间】:2018-04-27 07:35:14
【问题描述】:

在一个运行 3 个 Tomcat webapps 的生产系统中,我们最近注意到 Tomcat 由于线程泄漏而崩溃。三个 webap 中的两个相互交互,我想找出这两个组件中的哪一个导致了这个线程的建立。

问题:有什么好的方法/工具可以找出 3 个 web 应用中的哪个有线程泄漏?

我的java技能很生疏。我对Tomcat不是很熟悉,并且随着我的发展而发现。 我启动了jconsole 来了解线程泄漏。我不愿意安装额外的(或非默认的)工具来解决这个问题,因为这是一个生产系统。

在下面的 jconsole 屏幕截图中,您可以看到线程数在增长; Tomcat/catalina 进程在 08:52 停止,几分钟后线程数达到 893 个线程。

根据请求,

  • Connector 元素:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" maxThreads = "600" minSpareThreads = "150" acceptCount = "150" connectionTimeout = "30000" />

  • 通过“Tomcat 崩溃”,我的意思是没有更多的事件记录到 catalina.log 文件中,也没有记录到 3 个 web 应用程序的日志文件中。只有底层 apache 正在记录事件,带有 HTTP 500 错误。

【问题讨论】:

  • 这是单个 Tomcat 实例吗? Tomcat“崩溃”是什么意思?
  • 请编辑您的问题以包含来自 Tomcat 的 conf/server.xml 文件的活动 <Connector> 元素。 请记得清理任何机密信息,例如密码。
  • @ChristopherSchultz:完成。不过,不确定我插入的 connector 信息是否是您要查找的信息
  • 那么 Tomcat 进程是否还在运行? Tomcat 变得完全惰性是很不寻常的。如果进程正在运行,请进行线程转储并查看所有线程在做什么。您在该连接器上的线程限制为 600,因此必须有其他东西创建这些额外的线程。日志文件中是否有任何内容可以解释发生了什么?
  • jstack 没有给出任何提示的线索(它应该显示很多线程在一段时间后处于空闲状态......)

标签: multithreading tomcat jconsole


【解决方案1】:

不确定您是否可以在系统上部署新代码。

在类似情况下对我有帮助的最简单更改(也使用 tomcat)是为每个执行程序/线程池/线程指定一个有意义的名称,该名称可以追溯到 webapp 和模块创建线程。

瞧,线程转储突然看起来很友好。这也是在紧要关头通过 guava/ThreadFactoryBuilder 完成的。

【讨论】:

    【解决方案2】:

    在不同的 Tomcat 实例中运行每个 Web 应用程序。您可能在 Tomcat 前面有一些 nginx/Apache 实例、负载均衡器或类似的东西,您可以将其重新配置为指向每个 Web 应用程序的单独 Tomcat。

    【讨论】:

    • 感谢您的回答。但是,它是一个生产系统,所以说实话,我想避免这么大的变化。我希望有一种涉及较少的方法......
    • 另一种选择是这样做,但只能在单独的性能测试环境中进行,并模拟用户使用 Selenium 或 JMeter 或 Gatling 或类似工具访问系统。
    猜你喜欢
    • 2012-05-29
    • 2012-03-08
    • 2017-07-11
    • 2019-06-12
    • 2017-02-15
    • 1970-01-01
    • 2023-03-26
    • 2014-07-30
    • 1970-01-01
    相关资源
    最近更新 更多