2014-02-11 25 views
6

One of the biggest causes of instability in Elasticsearch is fielddata: field values have to be loaded into memory to make aggregations, sorting and scripting perform as fast as they do.Elasticsearch - indices.fielddata.cache.size和indices.fielddata.breaker.limit

正如以上描述Elasticsearch頁之間不同的是,大fielddata總是引起Elasticsearch出的存儲器(OOM)。因此,我們可以設置indices.fielddata.cache.sizeindices.fielddata.breaker.limit防止OOM。這兩種設置有什麼不同? 他們有任何關係?

例如,My Elasticsearch JVM具有2g的總內存。如果我設置indices.fielddata.cache.size至1g,但indices.fielddata.breaker.limit設置爲60%(這意味着1.2克)。允許加載到內存的fielddata超過fielddata緩存大小。它會導致任何錯誤? (Reference Fielddata

謝謝。

回答

11

經過長時間的學習,我找到了一些答案。

當您將indices.fielddata.cache.size設置爲1g時。這意味着elasticsearch可以使用多少字段緩存大小來處理查詢請求。但是,如果您將indices.fielddata.breaker.limit設置爲60%(意味着1.2g),那麼如果查詢數據大於此大小,elasticsearch將拒絕此查詢請求並導致異常。

因此,如果查詢數據小於1.2g但大於1g,elassticsearch將接受此查詢請求。在到達indices.fielddata.cache.size後,舊數據將被刷新並釋放新數據的內存。

2

他們不同的是,我引用的數據加載後

Fielddata尺寸進行檢查。如果查詢到達時嘗試加載更多的fielddata而不是可用內存會發生什麼?答案是醜陋的:你會得到一個OutOfMemoryException。

Elasticsearch包括一個fielddata斷路器,旨在處理這種情況。斷路器通過內省涉及的字段(它們的類型,基數,大小等)來估計查詢的內存需求。然後它會檢查加載所需的fielddata是否會將總字段數據大小推過配置的堆百分比。

如果估計的查詢大小大於極限值,斷路器將跳閘,查詢將中止並返回異常。這發生在數據加載之前,這意味着您不會遇到OutOfMemoryException。

Limiting Memory Usage