我目前正在将EJB项目从版本2.0升级到版本3.2(全部有状态)。业务逻辑保持不变,唯一改变的是EJB部分(用注释替代描述符文件,使用注入点而不是传统查找等)。 从请求处理的角度来看,一切似乎都正常,问题出在性能上。 使用一个连接的客户端,每个请求需要大约300毫秒。如果我添加第二个客户端,平均时间跳至700毫秒。第三个客户的平均时间超过1秒,依此类推。使用EJB 2.0版本,即使有更多的客户端,处理时间也会略微增加(50〜100ms),但无需担心。EJB 3.2性能下降
退化很明显,我只是无法弄清原因。
我玩过EJB超时,事务类型等,但没有运气。我也尝试了分析服务器(通过JMC),但找不到任何可疑的东西。
这就好像所有的请求都是按顺序处理而不是同时处理的。
有人可以提供一些可能的原因提示?有没有我错过的配置?
注意:这个问题同时出现在WebSphere 9和GlassFish 4.1.1上,所以这显然是一个应用程序的问题。
编辑#1
检查应用程序的日志后,我可以证实,请求被处理顺序,没有并发。
继迈克尔的建议,我看着一个线程转储,并在给定时刻,有:
- 27 RUNNABLE
- 18 TIMED_WAITING
- 6 TIMED_WAITING(对象监视器)(停车场)
- 16 TIMED_WAITING(睡觉)
- 23 WAITING(对象监视器上)
- 40 WAITING(停车场)
没有阻塞线程的迹象。
有什么想法?
尝试负载测试期间获得线程转储5+用户。我想有共享资源需要独占锁。 –
@迈克尔,我没有太多分析线程转储的经验。我究竟应该寻找什么? –
简单的方法采取线程转储:jstack >> myapp.log。当你需要通过“锁定”来搜索/ grep时。可能有很多垃圾。如果可以的话,值得通过pastebin发布。 –