2012-02-03 131 views
2

我有一個帶9個內核的SOLR。 其中一個核心擁有大約1 000 000個文檔。 (〜1GB大小)減少索引後正確執行的查詢的SOLR查詢時間

整理提交100個文檔到這個核心後,我的下一個20個-40查詢到SOLR所有其他內核變得非常慢(3-8秒),

我補充〜100個文件每10分鐘使用數據導入處理程序,然後提交(不優化)索引。

  1. 有沒有一種方法可以減少索引後執行的查詢的查詢時間?
  2. 考慮到所有其他內核執行查詢的速度較慢,或者存在多個內核的問題,是否可以是硬件問題?

我每秒平均有20個查詢到所有內核。 我用碼頭與SOLR 我有合併因子= 10

<mergeFactor>10</mergeFactor> 

我已經設置autowarm計數緩存

<filterCache 
    class="solr.FastLRUCache" 
    size="1048576" 
    initialSize="131072" 
    autowarmCount="943718"/> 

<documentCache 
    class="solr.FastLRUCache" cleanupThread="true" 
    size="131072" 
    initialSize="117965" 
    autowarmCount="117965" /> 

我有50個查詢autowarm一個新的搜索,對於newSearcher和firstSearcher。

<listener event="newSearcher" class="solr.QuerySenderListener"> 
    <arr name="queries"> 
    <str name="q">cake+boss</str><str name="facet">true</str><str name="facet.field">Category</str></lst> 
    ...// 50 warm-up queries 
    </arr> 
</listener> 
//the same for firstSearcher 

回答

3

你是預熱。這是提交後立即減少查詢時間的唯一方法。您可能需要處理升溫以在緩存中獲取正確的文檔/查詢/過濾器,但您已經朝着正確的方向前進。

我的猜測是,這是由於提交的索引翻轉,加上緩存預熱吸收你所有的CPU和IO。結果是你的其他內核沒有獲得足夠的資源來快速響應。在提交期間,您的內存使用量將迅速增加,因爲有一段時間Solr中有兩個索引副本。根據你的內存使用情況,你甚至可以交換,這對查詢時間來說是非常具有破壞性的。

在提交期間執行一些CPU和內存分析。確保你沒有交換。看看CPU內核是否被掛鉤。您很可能需要在此問題上拋出更多硬件,或者考慮將您的核心分散到不同的計算機上,以免它們受到影響。

+0

據我所知,交換髮生在沒有足夠內存的情況下爲同一個核心擁有兩個主動搜索器。如何通過分析內存使用情況來檢查我是否在交換?現在我有-Xmx 5GB - 這是一個約束還是隻有機器內存是一個約束? – Dorin 2012-02-03 19:14:18

+0

我在談論如果你超過物理內存,你的操作系統頁面交換內存到磁盤。 Vmstat會顯示這一點。但是,如果您推動JVM堆限制,這也可能會導致問題,因爲您的機器將花費相當多的時間進行垃圾收集。 – rfeak 2012-02-03 20:50:45

+0

這裏的另一個想法是,如果你的查詢量還可以減少你的maxWarmingSearchers。留意有關碰到maxWarmingSearchers限制的相關錯誤。 – 2012-02-03 22:15:44