Oracle 应用服务器性能监控和调整(CPU 负载高)
我刚刚被一家公司录用,老板给了我一个性能问题,要求我尽快解决。我之前没有在服务器端使用过 Java EE 的经验。
让我开始了解该系统但仍然找不到解决方案:
我们有一个 Oracle 应用服务器 (10.1.) 和 Oracle 数据库服务器 (9.2.),软件人员使用 JSF 1.2 和 Ajax 编写了一个大型 J2EE 项目 (X 项目),该项目仅使用 Ajax。他们在代码中积极使用 PL/SQL。
因此,我们启动了应用程序服务器(Solaris 机器),一切似乎正常。用户从周一开始从不同位置使用该应用程序(应用程序 200 有用户帐户,我刚刚检查并看到连接池设置正确,会话仅活跃 15 分钟)。
一段时间后(2天)CPU利用率变高,%60,晚上还是一样什么都没有改变(此时在线用户数量接近1或2),甚至它开始使用同一服务器上为其他应用程序分配的 CPU,因为它们释放了 如果我们不重新启动服务器,两天后利用率就会变成 90%,应用程序会变得非常慢,最终用户会开始打电话。
主要问题是软件工程师说代码很清楚,系统和 DBA 经理说我们的配置正确,其他应用程序似乎正常,为什么这个问题只发生在 X 应用程序中。
我开始将数据库复制到测试平台并将其升级到最新版本,对应用程序服务器(Weblogic)也做了同样的操作,看看是否存在错误。我自己只测试了一个用户和 weblogic 管理面板,我可以跟踪线程并转储它们。我注意到有些线程显示为霸占。当我查看手册并控制跟踪时,我发现它指向了从 .java 文件调用 PL/SQL 代码的行号。软件工程师说,是的,我们有非常复杂的 PL/SQL 代码,但是和应用服务器有什么关系?这是数据库服务器的问题,我想他们是对的......
我知道这个问题有很多漏洞,我想提供更多细节,但我很欣赏您的指导方式。
提前致谢 ...
编辑:服务器的 CPU 和内存足以运行更复杂的应用程序
答案1
繁重的 PL/SQL 调用应该会阻塞线程 - 因此 CPU 使用率应该会下降。
对于运行缓慢的应用程序服务器,我首先想到的办法是检查 gc 日志 - 查找频繁的主要收集(这表明存在内存泄漏或 JVM 只是需要更多内存)。
我负责的系统变成了很多从厚 Oracle 驱动程序切换到轻量级 jdbc 驱动程序后更加稳定 - 尽管问题主要表现为容器崩溃。
日志应该可以很好地指示系统中是否存在任何问题 - 但很大程度上取决于开发人员选择在其中写入的内容。缓慢的 SQL 可能会导致连接池耗尽 - 确保池正在记录连接统计信息。还要确保正确设置了 JVM 的 ulimit。
由于您在 DB 层运行 9i,因此您将不具备 AWR 功能 - 您必须运行 statspack(但这应该已经是您的站点性能管理的标准做法)来确定是什么导致了 DB 出现问题。
性能逐渐下降表明应用程序存在内存泄漏 - 通常这是由于对象未被取消引用,因此无法进行垃圾回收 - 即编程问题。这应该从大多数 Java 分析工具中可以看出。
我注意到有些线程显示为占用
除非你使用实际的工作量进行测试,否则结果几乎毫无用处。