我们在 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、框架都不是问题。应用程序才是问题 :-)(内存泄漏、数据库连接未关闭……)
祝你好运