在Weblogic 10.3上運行的傳統J2EE Web應用程序的響應時間方面存在巨大差異。該系統由兩個Weblogic服務器實例(前端和後端)組成,它們在同一臺物理服務器上運行,另一臺主機上運行Oracle數據庫。每次登錄系統需要四秒鐘以上時,外部測量工具纔會提醒我們。最近這些警告經常發生。查看由處理登錄請求的servlet編寫的日誌顯示,時間花費在從前端到後端的EJB調用上。所述測量的時間的JNDI查找時間巨大差異
實施例:
time ms
8:40:43 25
8:42:14 26
8:44:04 26
8:44:25 26
8:44:47 26
8:46:06 26
8:46:41 7744
8:47:00 27
8:47:37 27
8:49:00 26
8:49:37 26
8:50:03 8213
8:50:57 27
8:51:04 26
8:51:06 25
8:57:26 2545
8:58:13 26
9:00:06 5195
可以看出,大部分的請求(70%,從較大的樣品中取出)完全在及時的,但它們的顯著部分需要很長的時間完成。
期間所測量的時間執行的步驟如下:
會話bean的- JNDI查找提供認證接口(前端)
- 調用會話bean(frontend->後端的認證方法)
- 預留連接池中的JDBC連接(後端)
- 撥打查詢到的用戶數據庫(表的大小非常適中,表應正確索引)(後端)
- 讀取結果集,創建POJO用戶對象(後端)
- 返還POJO用戶對象(backend->前端)
在服務器機器上的負載是非常小的(99%空閒)和用戶數量非常適中。在兩臺服務器上,Weblogic報告的可用內存量在60%到90%之間。垃圾回收被記錄。主要收藏品在他們確實發生時很少見,並且在2-3秒內完成。此外,主要的GC發生似乎不會在長時間響應時間的同一時間發生。在繁忙和非繁忙時段都會出現較長的響應時間。 JDBC連接池最大大小目前設置爲80,這比並發用戶數量多。
更新:
得到重新啓動系統多用一些性能記錄添加權限。日誌清楚地表明,JNDI查找是其中時間都花在部分:
03:01:23.977 PERFORMANCE: looking up foo.bar.Bar from JNDI took 6 ms
03:14:47.179 PERFORMANCE: looking up foo.bar.Bar from JNDI took 2332 ms
03:15:55.040 PERFORMANCE: looking up foo.bar.Bar from JNDI took 1585 ms
03:29:25.548 PERFORMANCE: looking up foo.bar.Bar from JNDI took 7 ms
03:31:09.010 PERFORMANCE: looking up foo.bar.Bar from JNDI took 6 ms
03:44:25.587 PERFORMANCE: looking up foo.bar.Bar from JNDI took 6 ms
03:46:00.289 PERFORMANCE: looking up foo.bar.Bar from JNDI took 7 ms
03:59:28.028 PERFORMANCE: looking up foo.bar.Bar from JNDI took 2052 ms
縱觀前端和後端的GC日誌表明緩慢的JNDI查找發生時GC沒有這樣做。
的背景下得到了下面的方法是創建一個會話時:
Hashtable ht = new Hashtable();
ht.put(Context.PROVIDER_URL, url);
ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
jndiContext = new InitialContext(ht);
其中url
是T3 URL指向後端服務器的DNS名稱和端口。這應該沒問題吧?
要想到的第一件事就是緩存從JNDI獲得的引用,至少這是10年前的首選方式......但不應該Weblogic的InitialContext實現已經做了這種緩存,或者它不是真的在每次通話時從後端服務器獲取參考?
什麼可能導致頻繁緩慢的JNDI查找?有沒有解決方法(例如緩存引用幫助)?
您是否曾嘗試在上述步驟之間放置日誌消息,以確定哪些消耗大部分額外時間? –
沒有。這是JNDI查找。請參閱上面編輯的問題。 – MarkoU
還有一件事:它可能是有用的消除簡單的明顯的東西,所以:你檢查了該機器上的硬盤?它可能與錯誤的硬件一樣簡單! –