包含 Hibernate、Spring 和 Oracle 的 Web 应用程序的 CPU 占用率高达 99%

包含 Hibernate、Spring 和 Oracle 的 Web 应用程序的 CPU 占用率高达 99%

我们在 Linux 环境中有一个 Web 应用程序,其 CPU 有时会高达 99%。

有时需要几天,有时只需几分钟。我们在 tomcat webapp 和 Oracle 数据库中使用 Hibernate 和 Spring。

检查日志出现以下内容:

“ConnectionManager——使用 on_close 连接释放模式在会话上完成事务;请务必关闭会话以释放 JDBC 资源!”。

然后会话数开始增长,直到达到 256 个会话(Apache conf 允许的最大值)。当会话数达到 256 时,会出现以下行:

“ContainerBackgroundProcessor[StandardEngine[Catalina]] ManagerBase - 启动过期会话 StandardManager 于 1259947978384 会话计数 256”

此后 CPU 使用率达到 99%。

有什么建议吗?我们将不胜感激。

提前致谢。

答案1

可能有很多原因。我的经验是,这通常是由于内存问题造成的。当使用的堆大小变大时,垃圾收集器就会超速运行,CPU 性能会受到影响。以下是一些隔离问题的步骤:

  • 使用 top 在 CPU 使用率飙升时监控系统。确认 CPU 使用率来自 Java。(不幸的是,您无法比这更精确)。

  • 使用 VisualVM 或 JConsole 监控堆大小使用情况。正常行为是看到堆大小逐渐增加,然后在 GC 启动时突然下降(锯齿状)。如果内存使用率保持较高,则无法进行垃圾回收

  • 这可能很明显,但请检查日志中是否存在 OutOfMemoryExceptions

  • 确保您的虚拟机正在使用最大可能的堆大小。对于 32 位 JVM,该大小为 1400 或 1500M。使用 JVM 选项 -Xmx1500M。

  • 确保操作系统没有使用太多交换内存(使用 top 或 free 检查)。确保它有足够的内存来运行 Linux 和 Tomcat(对于 32 位机器,3 或 4 GB 是一个不错的选择)。

还有一点需要注意——检查应用程序是否存在内存和连接泄漏。Spring 会帮你处理大部分问题。确保你没有将不需要的内容放入 HttpSession 对象(或 Session 中的映射)中。如果你进行任何直接的 JDBC 或文件处理,请确保所有流、连接和 PreparedStatements(这是我经常忘记的)都已关闭。

答案2

很可能是您的应用程序出现了问题(我在使用 Jboss 时也遇到了同样的问题)。

也许这个问题发生在您对 Web 应用程序执行特定操作时?我会尝试找出应用程序和问题之间的关系。也许开发人员可以帮助您?

大多数时候:Tomcat、oracle、框架都不是问题。应用程序才是问题 :-)(内存泄漏、数据库连接未关闭……)

祝你好运

相关内容