關於 Elasticsearch 內存佔用及分配

Elasticsearch 和 Lucene 對內存使用狀況:

Elasticsearch 限制的內存大小是 JAVA 堆空間的大小,不包括Lucene 緩存倒排索引數據空間。html

  • Lucene 中的 倒排索引 segments 存儲在文件中,爲提升訪問速度,都會把它加載到內存中,從而提升 Lucene 性能。因此建議至少留系統一半內存給Lucene。
  • Node Query Cache (負責緩存f ilter 查詢結果),每一個節點有一個,被全部 shard 共享,filter query查詢結果要麼是 yes 要麼是no,不涉及 scores 的計算。
    集羣中每一個節點都要配置,默認爲:indices.queries.cache.size:10%
  • Indexing Buffer 索引緩衝區,用於存儲新索引的文檔,當其被填滿時,緩衝區中的文檔被寫入磁盤中的 segments 中。節點上全部 shard 共享。
    緩衝區默認大小: indices.memory.index_buffer_size: 10%
    若是緩衝區大小設置了百分百則 indices.memory.min_index_buffer_size 用於這是最小值,默認爲 48mb。indices.memory.max_index_buffer_size 用於最大大小,無默認值。
  • Shard Request Cache 用於緩存請求結果,但之緩存request size爲0的。好比說 hits.total, aggregations 和 suggestions.
    默認最大爲indices.requests.cache.size:1%
  • Field Data Cache 字段緩存重要用於對字段進行排序、聚合是使用。由於構建字段數據緩存代價昂貴,因此建議有足夠的內訓來存儲。
    Fielddata 是 延遲 加載。若是你歷來沒有聚合一個分析字符串,就不會加載 fielddata 到內存中,也就不會使用大量的內存,因此能夠考慮分配較小的heap給Elasticsearch。由於heap越小意味着Elasticsearch的GC會比較快,而且預留給Lucene的內存也會比較大。。
    若是沒有足夠的內存保存fielddata時,Elastisearch會不斷地從磁盤加載數據到內存,並剔除掉舊的內存數據。剔除操做會形成嚴重的磁盤I/O,而且引起大量的GC,會嚴重影響Elastisearch的性能。

Elasticsearch默認安裝後設置的內存是1GB,這是遠遠不夠用於生產環境的。
有兩種方式修改Elasticsearch的堆內存:git

  • 設置環境變量:export ES_HEAP_SIZE=10g 在es啓動時會讀取該變量;
  • 啓動時做爲參數傳遞給es: ./bin/elasticsearch -Xmx10g -Xms10g

給es分配內存時要注意,至少要分配一半兒內存留給 Lucene。
分配給 es 的內存最好不要超過 32G ,由於若是堆大小小於 32 GB,JVM 能夠利用指針壓縮,這能夠大大下降內存的使用:每一個指針 4 字節而不是 8 字節。若是大於32G 每一個指針佔用 8字節,而且會佔用更多的內存帶寬,下降了cpu性能。github

還有一點, 要關閉 swap 內存交換空間,禁用swapping。頻繁的swapping 對服務器來講是致命的。
總結:給es JVM棧的內存最好不要超過32G,留給Lucene的內存越大越好,Lucene把全部的segment都緩存起來,會加快全文檢索。緩存

參考文檔:
https://nereuschen.github.io/...
https://www.elastic.co/guide/...
相關文章
相關標籤/搜索