我試圖減少我的elasticsearch部署(單節點羣集)中的內存使用情況。
我可以看到使用3GB JVM堆空間。 爲了優化我首先需要了解的瓶頸。 我對JVM使用情況如何分割有所瞭解。
字段數據看起來消耗1.5GB和過濾器緩存&查詢緩存組合消耗小於0.5GB,最多增加2GB。
有人可以幫我理解elasticsearch在哪裏吃剩下的1GB?
我試圖減少我的elasticsearch部署(單節點羣集)中的內存使用情況。
我可以看到使用3GB JVM堆空間。 爲了優化我首先需要了解的瓶頸。 我對JVM使用情況如何分割有所瞭解。
字段數據看起來消耗1.5GB和過濾器緩存&查詢緩存組合消耗小於0.5GB,最多增加2GB。
有人可以幫我理解elasticsearch在哪裏吃剩下的1GB?
我無法確定您的確切設置,但爲了知道堆中發生了什麼,您可以使用jvisualvm工具(捆綁在一起的jdk)以及奇蹟或bigdesk plugin(我的偏好)和_cat
APIs來分析發生了什麼。
正如你正確地注意到,堆主機三大緩存,分別爲:
indices.fielddata.cache.size
被控制(在你的情況下,它似乎是在50%左右堆的,可能是由於fielddata circuit breaker)有很好的思維導圖可用here(榮譽IgorKupczyński)總結了緩存的作用。對於ES需要創建才能正常運行的所有其他對象實例(您的情況爲1GB)留下了大約30%的堆(有關此情況的更多信息,請參閱此處)。
這是我如何繼續我的本地環境。首先,我開始了我的節點新鮮(Xmx1g
)並等待綠色狀態。然後我開始jvisualvm並將其吸引到我的elasticsearch過程中。我從「採樣器」選項卡獲取堆轉儲,以便稍後與另一個轉儲進行比較。我堆看起來像這樣開始(僅適用於最大堆的1/3至今分配):
我還檢查我的現場數據和過濾器的緩存是空的:
爲了確保,我也運行了/_cat/fielddata
,正如你可以看到的,自從節點剛剛啓動以來,現場數據沒有使用堆。
$ curl 'localhost:9200/_cat/fielddata?bytes=b&v'
id host ip node total
TMVa3S2oTUWOElsBrgFhuw iMac.local 192.168.1.100 Tumbler 0
這是最初的情況。現在,我們需要對此進行一些調整,因此我開始了我的後端和前端應用程序,以在本地ES節點上施加一些壓力。
過了一會兒,我的堆看起來是這樣的,所以它的規模已經或多或少地增加了300 MB(139MB - > 452MB,不是很多,但我跑了一個小數據集本實驗)
我的緩存也變得有點幾兆字節:
$ curl 'localhost:9200/_cat/fielddata?bytes=b&v'
id host ip node total
TMVa3S2oTUWOElsBrgFhuw iMac.local 192.168.1.100 Tumbler 9066424
在這一點上我把anoth爲了深入瞭解堆是如何演化的,我計算了這些對象的retained size,並將它與我剛啓動節點後第一次轉儲進行了比較。比較如下:
在保留大小增加的對象中,他通常的嫌疑犯是地圖,以及任何與緩存相關的實體。但是,我們也可以找到以下類別:
NIOFSDirectory
了用於在文件系統如您所見,堆承載三個主要緩存,但它也是駐留Elasticsearch進程所需的所有其他Java對象的位置,並且這些對象不一定與緩存相關。
所以如果你想控制堆的使用,你顯然不能控制ES需要正常工作的內部對象,但是你肯定會影響緩存的大小。如果您按照第一個項目符號列表中的鏈接,您會準確瞭解您可以調整哪些設置。
調諧緩存也許不是唯一的選擇,也許你需要重寫一些查詢,以便更友善或者更改你的分析器或者你的映射中的某些字段類型等等。很難說你的情況,沒有更多的信息,但這應該給你一些線索。
繼續並按照我在這裏所做的相同方式啓動jvisualvm,並瞭解您的應用程序(搜索+索引)在應用ES時的堆積增長情況,並且您應該快速獲得有關此處發生的事情的一些信息。
驚奇僅繪製在其上需要像在這種情況下,高速緩存要監視的堆一些實例。
緩存僅表示總堆使用的一部分。有很多其他的實例會佔用堆內存,而且這些奇蹟界面可能沒有直接的繪圖。
因此,並非ES中的所有堆只由緩存佔用。
爲了清楚地理解不同實例堆的確切用法,您應該採取堆轉儲的過程,然後使用內存分析器工具分析它,它可以爲您提供確切的圖片。
感謝Val的詳細答案!我已經想出了一種方法來使用文檔值的一些沉重的聚合查詢,這應該會幫助我的情況很多:) – Nullpoet
真棒,很高興它對你有幫助。感謝賞金;-) – Val