【问题标题】:Tomcat fails on heavy loadTomcat在重负载时失败
【发布时间】:2012-06-03 11:18:40
【问题描述】:

我正在使用 tomcat server 7 (& JRE 1.6) 在 debian VPS 上运行一个基于 db 的重型 GWT 应用程序。我的应用程序包含许多 java servlet,它们通过 tomcat 连接池与 MySQL5 数据库进行通信(没有连接池,mysql 将在 3 分钟内崩溃!)
我的应用程序运行良好,而 Tomcat 服务器上没有繁重的负载,但是当在线用户数量和他们的请求增加时,tomcat 服务器失败没有有用的日志或错误消息(我只是收到一个连接超时错误当我想访问在 tomcat 上运行的任何 Web 应用程序时)并且这个问题一直存在,直到我重置我的 tomcat 服务器。我知道我的 VPS 没有内存限制,也没有任何 MySQL 连接问题,所以我真的不知道会导致这种情况:(
这是 server.xml 中的主机标签(我有很多这样的虚拟主机,但所有的主机标签都相似)

<Host name="sub1.mydomain.com" appBase="/var/www/sites/gwt_app" >

    <Context path="" reloadable="true" docBase="myDocBase" 
     xmlValidation="false" xmlNamespaceAware="false" crossContext="true" >

    <Resource name="jdbc/mysql/db" auth="Container" type="javax.sql.DataSource"

    initialSize="3" maxActive="50" maxIdle="10" 
    maxWait="15000" removeAbandoned="true" removeAbandonedTimeout="120"
    validationQuery="select now();"

    username="user_1" password="pass" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/db_1?useUnicode=true&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8&amp;connectionCollation=UTF8_PERSIAN_CI&amp;noAccessToProcedureBodies=true"
    />
    </Context>

    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/www/sites/gwt_app_logs"  prefix="tomcat_access_" suffix=".log" pattern="common" resolveHosts="false"/>
</Host>

有什么想法吗?

【问题讨论】:

  • 当你说Tomcat“崩溃”时,实际发生了什么?您是否在错误日志中发现异常?如果是这样,它们是什么? JVM是否失败并且进程死亡?如果是这样,您是否获得了核心转储或 hs_* 文件?如果 Tomcat 仍在运行但没有响应请求,请进行线程转储(或多个)并将它们发布到某个地方。此外,发布您的 配置(减去任何敏感信息,如密码等)会有所帮助。
  • 我再问一遍:“Tomcat 服务器出现故障”时会发生什么?如果进程仍在运行,您需要进行一些线程转储并发布它们,以便我们可以看到服务器实际在做什么。
  • jstack/jmap 是你的朋友,使用它们

标签: tomcat crash load timeout


【解决方案1】:

您需要提供有关资源利用率的更多详细信息。但是根据您的描述,您可能遇到了 HTTP 线程池耗尽的问题。默认情况下(使用 BIO 连接器)Tomcat 只能处理 200 个并发连接,而​​ AFAIK 可以在积压队列中保持这么多连接“暂停”。

这意味着只能同时处理 200 个连接,另外 100 个将等待池。第 301 次连接将被拒绝或超时。

以下是检查内容的提示:

  • HTTP 线程池利用率
  • 积压队列大小
  • 垃圾回收活动

Tomcat 提供了宝贵的metrics for that。您可能还会发现我关于 squeezing more concurrent connections from Tomcat 的文章很有用。

【讨论】:

  • 这是不正确的。 Tomcat 7.0.x 默认可以处理超过 100 个并发连接。默认设置的 BIO 连接器在 acceptCount/backlog 队列中有 200 maxThread PLUS 100。使用 NIO 连接器,可以扩展到 1000 个并发连接。
  • @Pidster: +1,没错,我说的是默认情况下(即使用 BIO 连接器)——但是我记错了,线程池的默认大小是 100,我相信你,它实际上是 200(更正)。谢谢!
  • @TomaszNurkiewicz 能否提供支持“只能同时处理 200 个连接”的链接?
【解决方案2】:

BIO 连接器中最近出现的错误可能是这里的一个因素。

见:https://issues.apache.org/bugzilla/show_bug.cgi?id=53186

但是,如果您的应用程序在使用数据库连接池的情况下也在 3 分钟内崩溃,则您的应用程序或数据库处理代码可能有问题。

【讨论】:

    【解决方案3】:

    您可以更改 /TOMCAT_DIR/bin/catalina.sh 中的 CATALINA_OPTS 参数以进行并发垃圾回收

    CATALINA_OPTS="-XX:+UseConcMarkSweepGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -Xloggc:/TOMCAT_DIR/logs/gc.log"
    

    【讨论】:

      【解决方案4】:

      使用tomcat集群和apache网络负载blanc

      【讨论】:

        猜你喜欢
        • 2012-11-18
        • 1970-01-01
        • 2019-02-07
        • 1970-01-01
        • 2016-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        相关资源
        最近更新 更多