2011-12-14 90 views
1

我的任務是處理Solr安裝中的OutOfMemoryError問題。我終於設法通過使用AggressiveHeap JVM選項來保持它超過幾分鐘。啓動過程中的Solr內存消耗 - 加載索引?

我從來沒有與Solr合作過,所以我感覺我的方式有點。

這是我們採取措施的過程:

  1. 啓動Tomcat
  2. 揭開序幕增量導入

的增量導入啓動後,堆消耗不可避免地上升。我們嘗試將Xmx設置爲4 Gig,這會導致OutOfMemoryErrors或系統無響應,因此嘗試了AggressiveHeap選項,這導致JVM佔用大約5.5 Gig的RAM。正如你在屏幕上看到的那樣,這次GC能夠釋放內存,內存消耗變得不那麼快,然後在圖像的右側有另一個實際上工作的GC,並且它繼續像這樣。

VisualVM

什麼是內存的初始分配?它是索引被加載到RAM中嗎?有沒有辦法減少這種情況?

我已經嘗試調整ramBufferSizeMB,maxBufferedDocs,mergeFactor並且還取消了StandardIndexReaderFactory的聲明讓我設置termIndexDivisor爲12,但很難看出這些更改是否有所作爲(是的:需要更多分析)。

該索引已創建了多個失敗的索引會話 - termIndexDivisor參數的添加更新 - 索引文件已存在的事實是否阻止此參數發揮作用?

(本機是物理的,具有RAM和16個內核的12場演唱會,這是另一個大Tomcat實例共享的機器。我們正在運行的Oracle JDK 1.6 21)

回答

0

我最終用調試器進行了一些挖掘,因爲即使使用@ fyr的建議,內存消耗也沒有真正降低太多。

原來,deltaQuery和deltaImportQuery都是查詢的碳副本。這意味着,不是隻返回自上次導入後更改的條目的PK,而是查詢每行返回並且Solr試圖將它們存儲在內存中。 :(

2

有各種各樣的事情。有一件事是mergeFactor,因爲它控制着生成的段的數量,並且每個段都有一個段閱讀器。但是,更改此選項不會立即更改內存使用情況。其他選項主要控制索引進程的RAM使用情況,而不是啓動時或搜索期間的RAM使用情況。

第二件事是搜索者變暖。通常會在啓動期間運行一些查詢以加熱搜索者,並且執行的查詢將被緩存。還有控制緩存大小的選項。另請參閱:http://wiki.apache.org/solr/SolrCaching

如果遇到內存問題,將termIndexDivisor設置爲12顯然不是一件好事。據我在4.x中所知,術語索引除數是256或128,至少在1.x中它被設置爲32.這個選項控制你的術語有多少條目被加載到RAM中。你的情況每十二屆。 即使索引已存在,termIndexDivisor也應具有效果。

如果索引加載到RAM由direcotryfactory配置選項控制。

如果您在Solr主幹上工作,您可能錯過StandardDirectoryFactory在某些情況下解決的更改爲MMAPDirectory,這會導致激烈的RAM使用(如果您的索引較大)。這一變化發生在今年4月至今的某個時候。林甚至不知道這是如何通過代碼審查,但這實際上是幹線的當前狀態。