【问题标题】:Tomcat access logs - are failed requests included?Tomcat 访问日志 - 是否包括失败的请求?
【发布时间】:2013-06-23 11:03:32
【问题描述】:

我们有一个 RESTful Web 服务(Java,托管在 Tomcat 中)。有时它会失败(不是每周)。当它失败时,Java CPU 消耗达到 100% 并占用所有可用内存。它不会自行完成。我必须重新启动服务器。

Tomcat 访问日志中没有任何可疑之处。我猜我们的一个用户可能会提交一个非常“繁重”的请求,从而导致服务器停机。这个请求是否可能不在 Tomcat 日志中,因为它从未完成?

非常感谢

格言

【问题讨论】:

    标签: java tomcat ubuntu amazon-ec2


    【解决方案1】:

    您的 Tomcat 进程更有可能正在泄漏内存,直到它没有更多可用内存为止。尝试记录每个请求的堆大小,然后注意它是否不断增长。

    tomcat 类加载器可能会泄漏内存,尤其是在您使用“自动部署”功能时。

    long freeMem=Runtime.getRuntime().freeMemory();
    long maxMem=Runtime.getRuntime().maxMemory();
    long totalMem=Runtime.getRuntime().totalMemory();
    

    然后记录 freeMem/MaxMem 和 totalMem。如果 max 持续增长,您就会发现泄漏。

    编辑:并回答您的问题。这取决于 tomcat 是如何失败的,以及您是如何设置日志记录的。但是对于我们的系统(一个相当默认的 apache mod_proxy=>tomcat,有一些致命的 tomcat 错误只记录在 catalina.out 中

    【讨论】:

    • 对不起,它突然发生,而且非常罕见。我们使用 NewRelic - 它在图表上显示 Java 内存。没有逐渐的内存泄漏。
    • 这听起来真的很像内存泄漏。即使是最繁重的单个请求也不应该杀死tomcat,因为有多个线程来处理其他请求。所以如果它是一个单一的请求,它只会减慢速度,而不是死掉。
    • NewRelic 是否也显示最大堆大小?因为我们曾经有一个 tomcat 系统,其中最大堆不断增长,而应用程序使用的内存没有增长。所以它会运行一个垃圾回收,这会将堆从 700MB 增加到 800MB,然后在回收之后会有 650MB 空闲。所以它没有理由增加堆,但它一直这样做直到它达到最大堆大小并死亡。
    • NewRelic 显示“已用堆”和“已提交堆”。我不确定最大堆大小。
    • 顺便说一句,垃圾收集大约在同一时间开始。
    猜你喜欢
    • 2022-06-15
    • 2018-01-14
    • 2016-10-17
    • 1970-01-01
    • 2020-08-27
    • 2012-11-07
    • 2021-02-25
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多