我在Weblogic 9.2上部署了一个Web应用程序,Apache完成了代理传递负载平衡。我能够观察到当新请求进入时当前请求处理暂停。这仅在峰值负载条件下观察到。等待时间高达6-7秒,然后当前线程开始。此行为是从应用程序日志中得出的。应用程序使用默认工作管理器设置。我们还在应用程序中使用自定义工作管理器。系统参数很好。 CPU,内存,甚至GC循环不到50%的时间不到2秒。在日志中也没有例外。线程监视器未显示任何卡住的线程。可能是什么原因?当前线程是否被推到较低优先级?
答案 0 :(得分:1)
Weblogic不会将当前线程降级为较低优先级,它会在获取新线程之前始终完成当前线程。
如何确认当前线程在等待6到7秒?理想情况下,在高峰时间进行一些线程转储(在Unix上使用kill -3 <pid>
)并看到所有这些等待线程正在做什么?
我不是在调用这些卡住的线程但是在某些资源上可能存在争用(通常数据库是罪魁祸首或外部调用,如Web服务)
您是否有可能正在调用某个下游系统的情况 - 有时该系统无法处理峰值负载。
在每个之间以5秒的间隔进行4或5组线程转储。所以最后你会得到一个日志文件,在app服务器上有大约20-25秒的动作。
然后你应该寻找你想要检查的是一个长时间运行的事务正在发生,所有的线程转储都会显示某个线程id在你的java堆栈跟踪的同一行。简单来说,事务(比如在EJB或数据库中)跨越多个线程转储,因此需要更多调查。
GC需要2秒才能完成的频率?
我怀疑因为某些点存在争用,所以在您看来新请求获得优先权时实际上它们也会在相同的点等待
答案 1 :(得分:0)
终于找到了解决方案。 weblogic应用程序服务器配置了默认的工作管理器设置。根据我们的并发请求将其更改为大小,将100作为初始容量。还要确保数据库连接池具有池中可用的相应连接。一旦设置了这些配置,问题就不再发生了。