确定“Default”ExecuteThread 队列是否超载。利用控制台确定“Default”队列中的所有 ExecuteThreads 是否空闲。如果没有一个空闲,则应用程序可能需要一个更大的 ExecuteThread 数来配置。可以通过控制台更改该值,并将其保存在 config.xml 文件中。
如果执行队列有空闲线程,则可能没有分配足够的 Socket Reader 线程。缺省情况下,WebLogic Server 实例在启动时创建三个 Socket Reader 线程。如果群集系统在高峰期使用的 Socket Reader 线程超过三个,则增加 Socket Reader 线程的数量。
通常,Socket Reader 线程的数量应当较小。但是,如果 Weblogic Serve 充当正在挂起的服务器实例的客户端,则应当为每个 Weblogic Serve 配置一个线程。
如果使用 JDBC 连接池,确保池中已经配置的 JDBC 连接数量与同时请求(即执行线程)的数量相等。
返回页首
已知的 WebLogic 问题 JDBC 产生死锁问题的可能性存在。检查在 weblogic.log 开头找到的服务器的版本和 Service Pack 级别。然后对已经应用于服务器类路径的所有临时修补程序检查以上版本和 Service Pack 行。修补程序将指明已经解决了什么问题。
返回页首
收集 Thread Dump 进行 Thread Dump 的方法取决于安装挂起服务器实例的操作系统。有关在不同的操作系统上进行 Thread Dump 的信息,可以在以下网址中找到:http://e-docs.bea.com/wls/docs81/cluster/trouble.html#gc。
Unix 系统(Solaris、HP、AIX) 使用 kill .3 <weblogic process id> 创建诊断问题所需的 Thread Dump。确保在每个服务器上执行几次,每次间隔大约 5 到 10 秒,以帮助诊断死锁问题。为达到诊断目的,用 nohup 启动服务启进程(请参考解决方案 S-12292 和 S-15924)。
Windows、XP、NT 每个服务器需要 <Ctrl>-<Break> 来创建诊断问题所需的 Thread Dump。确保在每个服务器上执行几次,每次间隔大约 5 到 10 秒,以帮助诊断死锁问题。在 NT 上,在命令 shell 中输入 CTRL-Break。
Linux Linux 操作系统查看线程的方式不同于其它操作系统。该操作系统将每个线程视为一个进程。若要在 Linux 上进行 Thread Dump,查找通过其启动所有其它进程的进程 ID。使用命令:
- 若要获得根 PID,使用:
ps -efHl | grep 'java' **. **
使用一个作为字符串的 grep 参数(可在与服务器启动命令匹配的进程堆栈中找到该字符串)。如果 ps 命令还没有管道传送到另一个例程,则报告的第一个 PID 将是根进程。
- 使用 weblogic.Admin 命令 THREAD_DUMP
进行 Thread Dump 的另一种方法是使用 THREAD_DUMP admin 命令。此方法与正在运行服务器实例的操作系统无关。
java weblogic.Admin -url ManagedHost:8001 -username weblogic -password weblogic THREAD_DUMP
备注: 如果无法 ping 服务器实例,则不可以使用该命令。
如果正在使用的 JVM 是 Sun 开发的,则 Thread Dump 转为 stdout(标准输出文件)。Sun 已经增强了 JVM 1.3.1 和 1.4 之间的 Thread Dump 格式。若要获得 Sun JVM 1.4 的 Thread Dump 格式,将下列选项添加到启动 1.3.1 JVM 的 java 命令行中:
-XX:+JavaMonitorsInStackTrace
返回页首
Thread Dump 分析 分析服务器挂起的最有用的工具是一系列 Thread Dump。Thread Dump 提供关于每个线程在特定时刻正在执行什么操作的信息。一系列 Thread Dump(一般每隔 5 到 10 秒进行三个或更多 Thread Dump)可以帮助分析每个线程从一个 Thread Dump 到另一个 Thread Dump 过程中的状态变化或所缺少的变化。挂起服务器 Thread Dump 一般显示线程状态从第一个 Thread Dump 到最后一个 Thread Dump 中变化很小。
在 Thread Dump 中查看的内容 所有请求都通过 ListenThread 进入 WebLogic Server。如果 ListenThread 丢失,就无法接收任何工作,因此也无法完成任何工作。确认在 Thread Dump 中存在 ListenThread。ListenThread 应当在 socketAccept 方法中。下面示例说明监听线程 (Listen Thread) 的形式。 |