我有一个部署在WebLogic9.2上的web应用程序,它使用Apache完成的代理传递负载平衡。我能够观察到,每当有新的请求进入时,当前的请求处理都会暂停。只有在峰值负载条件下才能观察到这种情况。等待时间高达6-7秒,然后当前线程启动。此行为是从应用程序日志中得出的。应用程序使用默认的工作管理器设置。我们还在应用程序中使用了自定义工作管理器。系统参数正常。少于50%的CPU、内存,甚至GC周期也不到2秒。在日志中也没有观察到异常。线程监视器没有显示任何卡住的线程。可能的原因是什么?当前线程是否被推送到较低的优先级?
发布于 2011-06-20 15:51:17
Weblogic不会将当前线程降级到较低的优先级,它始终会在选取新线程之前完成当前线程。
如何确认当前线程正在等待6-7秒?理想情况下,在高峰时间进行几个线程转储(在Unix上使用kill -3 <pid> ),然后查看所有这些等待线程在做什么?
我不会调用这些卡住的线程,但可能会有对某些资源的争用(通常数据库是罪魁祸首,或者是像web服务这样的外部调用)。
你有没有这样的场景,你正在调用的一些下游系统--有时该系统无法处理峰值负载。
获取4或5组线程转储,每组之间的间隔为5秒。所以在最后,你会有一个单独的日志文件,它在应用服务器上有大约20 - 25秒的动作。
然后你应该检查你想要检查的是一个长时间运行的事务正在发生,所有的线程转储都会显示某个线程id在你的java堆栈跟踪中的同一行。简而言之,事务(比如在EJB或数据库中)跨越多个线程转储,因此需要更多的调查。
花2秒完成GC的频率是多少?
我怀疑由于在某些点上存在争执,所以在你看来,新的请求似乎正在获得优先级,而实际上它们也会在同一点等待。
发布于 2011-07-01 09:50:28
最终找到了解决方案。weblogic应用程序服务器配置了默认的工作管理器设置。这被更改为基于并发请求的大小,初始容量为100。还确保数据库连接池具有池中相应的可用连接。设置这些配置后,问题不再出现。
https://stackoverflow.com/questions/6401976
复制相似问题