簡體   English   中英

同一數據上的應用程序(JBoss + Hibernate + Infinispan)性能下降

[英]Application (JBoss + Hibernate + Infinispan) performance degrades on the same data

對於Web應用程序,我們具有以下堆棧:DB + Infinispan 5.1.2 + Hibernate 3.6.9 + JBoss AS 7.1 + Seam 2.2 + RichFaces 3.3(JSF 1.2)。

應用程序啟動后,一頁將顯示過去1-2秒內的歷史數據。 在此渲染過程中,Hibernate會話(1級)緩存包含大約8000個對象,在下周期間,數據沒有更改(完全沒有更改),但是此頁面渲染的性能從1秒降低到30-70秒。

jVisualVM Sampler會告知Hibernate Session對象中autoFlushIfRequired方法所消耗的時間。 在渲染過程中,大約有25-30次此函數調用。 所有的Hibernate查詢都已緩存,所有數據庫事務的壽命都較短。 線程數微不足道地增加了。 我們有12-50個同時應用的客戶端(瀏覽器)。 我們沒有內存泄漏,也沒有足夠的內存(每10-15分鍾啟動一次完整的gc)。 年輕的GC時間不斷增加。 Java從以下參數開始:

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=0
-XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseLargePages -XX:LargePageSizeInBytes=4m
-XX:+UseTLAB"
-Xms3092m -Xmx3092m -XX:MaxPermSize=512m  -XX:MaxNewSize=1g
-XX:NewSize=1g -XX:SurvivorRatio=128

在監視Cent OS的過程中,我們發現計數器“每秒上下文切換”(vmstat輸出)從1000-1500增加到8000-10000。在Heap / Hibernate / Infinispan中訪問同步是否可能有問題? 我們還應該檢查其他哪些情況? 如何檢查?

聽起來好像休眠最終最終要遍歷所有對象以查看它們是否臟了。 當您啟動應用程序時,它不是必須的,但是它進行得越快,它就會變得越糟。

也許您可以僅在需要時才嘗試手動調用flush() 或者實現自己的自定義檢查,而不是讓Hibernate自己找出需要刷新的內容。

您可以通過根據自己的喜好實現findDirty方法來實現Interceptor接口 (如果不希望全部實現,則擴展EmptyInterceptor來實現此findDirty 這樣,您可以告訴Hibernate不要為未更改的對象打擾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM