我目前正在將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發佈。 –