Elasticsearch 堆內存使用情況和 JVM 垃圾回收

作者:來自 Elastic?Kofi Bartlett

探索 Elasticsearch 堆內存使用情況和 JVM 垃圾回收,包括最佳實踐以及在堆內存使用過高或 JVM 性能不佳時的解決方法。

堆內存大小是分配給 Elasticsearch 節點中 Java 虛擬機的 RAM 數量。

從 7.11 版本開始,Elasticsearch 默認會根據節點的角色和總內存自動設置 JVM 堆內存大小。對于大多數生產環境,推薦使用默認配置。然而,如果你希望手動設置 JVM 堆內存大小,一般規則是將 -Xms 和 -Xmx 設置為相同的值該值應為系統總可用內存的 50%,但最大不應超過大約 31GB

較大的堆內存可以為節點提供更多用于索引和搜索操作的內存。但節點也需要內存用于緩存,因此使用 50% 可以在兩者之間保持健康的平衡。出于同樣的原因,在生產環境中應該避免在與 Elasticsearch 相同的節點上運行其他高內存占用的進程。

通常,堆使用率會呈鋸齒狀波動,在最大堆使用量的 30% 到 70% 之間。這是因為 JVM 會逐漸增加堆使用率,直到垃圾回收過程釋放出內存。當垃圾回收過程無法跟上時,就會出現高堆使用率。一個高堆使用率的跡象是垃圾回收無法將堆使用率降低到大約 30%。

在上面的圖像中,你可以看到 JVM 堆的正常鋸齒狀變化。

你還會看到有兩種類型的垃圾回收:年輕代(young) GC 和老年代(old)?GC。

在健康的 JVM 中,垃圾回收理想情況下應滿足以下條件:

  • 年輕代?GC 處理速度快(在 50 毫秒內完成)。
  • 年輕代 GC 執行頻率不高(大約每 10 秒一次)。
  • 老年代 GC 處理速度快(在 1 秒內完成)。
  • 老年代 GC 執行頻率不高(每 10 分鐘或更久一次)。

當堆內存使用過高或 JVM 性能不佳時的解決方法

堆內存使用增加可能由多種原因引起:

分片過多( Oversharding )

請在這里參閱關于分片過多的文檔。

聚合數據量過大( Large aggregation sizes )

為了避免聚合數據量過大,請在查詢中盡量減少聚合桶( size )的數量。

GET /_search
{"aggs" : {"products" : {"terms" : {"field" : "product","size" : 5}}}
}

你可以使用慢查詢日志( slow logs ),并通過以下方式在特定索引上啟用它:

PUT /my_index/_settings
{"index.search.slowlog.threshold.query.warn": "10s","index.search.slowlog.threshold.query.info": "5s","index.search.slowlog.threshold.query.debug": "2s","index.search.slowlog.threshold.query.trace": "500ms","index.search.slowlog.threshold.fetch.warn": "1s","index.search.slowlog.threshold.fetch.info": "800ms","index.search.slowlog.threshold.fetch.debug": "500ms","index.search.slowlog.threshold.fetch.trace": "200ms","index.search.slowlog.level": "info"
}

執行時間長的查詢很可能是資源密集型的操作。

批量索引請求過大( Excessive bulk index size )

如果你發送的是大型請求,這可能導致堆內存消耗過高。嘗試減小批量索引請求的大小。

映射問題( Mapping issues )

特別是當你使用了 fielddata: true 時,這可能會大量占用 JVM 堆內存。

堆內存大小設置不當( Heap size incorrectly set )

你可以通過設置環境變量手動定義堆內存大小:

ES_JAVA_OPTS="-Xms2g -Xmx2g"

在你的 Elasticsearch 配置目錄中編輯 jvm.options 文件:

-Xms2g
-Xmx2g

環境變量設置優先于文件設置。

需要重啟節點才能使設置生效。

JVM 新代比例設置不當( JVM new ratio incorrectly set )

通常不需要手動設置這個值,因為 Elasticsearch 默認會設置此值。這個參數定義了 JVM 中 “新生代” 和 “老年代” 對象可用空間的比例。

如果你發現老年代 GC 變得非常頻繁,可以嘗試在 Elasticsearch 配置目錄中的 jvm.options 文件中專門設置這個值。

-XX:NewRatio=3

在大型 Elasticsearch 集群中管理堆內存使用和 JVM 垃圾回收的最佳實踐是什么?

在大型 Elasticsearch 集群中管理堆內存使用和 JVM 垃圾回收的最佳實踐是確保堆內存大小設置為可用內存的 50% 的最大值,并根據特定用例優化 JVM 垃圾回收設置。監控堆內存大小和垃圾回收指標以確保集群運行在最佳狀態是非常重要的。具體來說,重要的是監控 JVM 堆內存大小、垃圾回收時間和垃圾回收暫停時間。此外,還需要監控垃圾回收周期的數量以及在垃圾回收中花費的時間。通過監控這些指標,可以識別堆內存或垃圾回收設置的潛在問題,并在必要時采取糾正措施。

想要獲得 Elastic 認證嗎?了解下一期 Elasticsearch 工程師培訓的時間!

Elasticsearch 包含了許多新功能,幫助你為特定用例構建最佳的搜索解決方案。深入我們的示例筆記本,了解更多內容,開始免費云試用,或者立即在本地機器上嘗試 Elastic。

原文:Elasticsearch heap size usage and JVM garbage collection - Elasticsearch Labs

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78920.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78920.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78920.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++之類和對象:構造函數,析構函數,拷貝構造,賦值運算符重載

前提:如果一個類是空類,C中空類中真的什么都沒有嗎,不是的,編譯器會自動生成6個默認成員函數。默認成員函數:用戶沒有顯式實現,編譯器會生成的成員函數稱為默認成員函數。 默認成員函數:構造函…

【專題五】位運算(1):常見位運算操作總結

📝前言說明: 本專欄主要記錄本人的基礎算法學習以及LeetCode刷題記錄,按專題劃分每題主要記錄:(1)本人解法 本人屎山代碼;(2)優質解法 優質代碼;&#xff…

小草GrassRouter多卡聚合路由器聚合衛星、MESH網絡應用解決方案

一、多網融合解決方案 衛星網絡融合? 支持接入衛星通信模塊,在無地面網絡覆蓋的極端場景(如偏遠山區、海洋救援)下,形成“5G衛星”雙鏈路冗余傳輸,衛星鏈路可作為核心通信備份,確保關鍵指令和視頻數據實…

【Mybatis】Mybatis基礎

文章目錄 前言一、搭建MyBatis1.1 創建maven工程1.2 加入log4j日志功能1.3 MyBatis的增刪改查1.4 核心配置文件詳解 二、MyBatis獲取參數值的兩種方式2.1 單個字面量類型的參數2.2 多個字面量類型的參數2.3 map集合類型的參數2.4 實體類類型的參數2.5 使用Param標識參數 三、 M…

AI四大邊界

大模型訓練的邊界并非由單一因素決定,而是技術、倫理、法律及實際應用需求共同作用的結果。以下從四個維度解析其邊界來源: 一、技術邊界:資源與能力的雙重限制 計算資源瓶頸 成本與算力:大模型訓練依賴海量GPU/TPU資源&#xff…

Twitter 工作原理|架構解析|社交APP邏輯

這是對Twitter 工作原理|架構解析|社交APP邏輯_嗶哩嗶哩_bilibili的學習,感謝up小凡生一 在兩年半前,埃隆馬斯克收購了Twitter,并且進行了一系列重大改革。今天我們來解析一下這個全球知名社交平臺的架構。首先&#x…

Java基礎學習內容大綱

Java基礎學習內容大綱 第一階段:建立編程思想 ? Java概述:如何快速學習Java技術、Java歷史、Java特點、Sublime、Java運行機制、JDK、轉義字符、Java開發規范、Java API ? 變量:數據類型、變量基本使用、數據類型轉換 ? 運算符:運算符介紹、算數運算符、關系運算符、…

如何對多維樣本進行KS檢驗

對于形狀為 ( 10000 , 1 , 304 ) (10000, 1, 304) (10000,1,304)的三維數據,若需使用scipy.stats.ks_2samp進行KS檢驗,可按以下步驟處理: 數據降維 KS檢驗要求輸入為一維數組,需將三維數據展平或按特定維度聚合: ? 方…

在 VMware 虛擬機中安裝 Windows7

文章目錄 前言1.安裝VMware 虛擬機1. VMware虛擬機軟件安裝2. 虛擬機創建配置(超詳細步驟)3. Windows7系統安裝 3、安裝 VMware tools4. VMware Tools安裝與優化5. 總結與常見問題 前言 最近有不少朋友在問如何在電腦上同時使用多個操作系統&#xff0c…

直播預告|TinyVue 組件庫高級用法:定制你的企業級UI體系

TinyVue 是一個跨端跨框架的企業級 UI 組件庫,基于 renderless 無渲染組件設計架構,實現了一套代碼同時支持 Vue2 和 Vue3,支持 PC 和移動端,包含 100 多個功能豐富的精美組件,可幫助開發者高效開發 Web 應用。 4 月 …

分治而不割裂—分治協同式敏捷工作模式

分治而不割裂:解密敏捷協同工作模式如何驅動大企業持續領跑 在數字化浪潮中,亞馬遜僅用11天完成Prime Day全球技術架構升級,華為5G基站項目組創造過單周迭代47個功能模塊的紀錄,這些商業奇跡的背后,都隱藏著一個共性秘…

Python列表全面解析:從基礎到高階操作

一、為什么需要列表? 在Python中,列表是可變有序序列,用于存儲多個元素的容器。相較于單一變量存儲獨立值,列表能更高效地管理批量數據,其特點包括: ?引用存儲:列表元素存儲的是對象的引用?…

Spring知識點梳理

一、Spring(Spring Framework) 1、IOC(控制反轉) 1)什么是IOC控制反轉? 為了解藕,有反轉就有“正轉”,“正轉”就是程序員手動 new對象;“反轉”就是將對象的創建、對…

SpringBoot啟動后自動執行方法的各種方式-筆記

1. SpringBoot啟動后自動執行方法的各種方式 1.1 PostConstruct 注解 作用:在依賴注入完成后執行初始化方法。 適用場景:需要在Bean初始化時執行某些操作(如配置、預加載數據)。 注意:該方法在Bean初始化階段執行&…

基礎知識-java流steam

Java Stream 流詳解 一、Stream 概述 #mermaid-svg-ZXmu5UZgAcGGq8EN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZXmu5UZgAcGGq8EN .error-icon{fill:#552222;}#mermaid-svg-ZXmu5UZgAcGGq8EN .error-text{fil…

8.Android(通過Manifest配置文件傳遞數據(meta-data))

配置文件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><applicationandroid:allowBackup"tr…

java 解析入參里的cron表達式,修改周時間

文章目錄 前言一、java 解析入參里的cron表達式,修改周時間二、使用步驟1.示例 總結 前言 一、java 解析入參里的cron表達式,修改周時間 示例&#xff1a; 第一種: 0 0 0,16 ? * 0,1 第2種 0 0 0,16 ? * 1-7 第3種 0 0 0,16 ? * ? 第4種 0 0 0,16 ? * * 二、使用步驟 1…

DTO,VO,PO,Entity

1. DTO (Data Transfer Object) 定義 DTO 是數據傳輸對象&#xff0c;用于在不同系統或層之間傳輸數據。 目的 簡化數據傳輸&#xff0c;降低耦合&#xff0c;通常只包含需要傳輸的字段&#xff0c;避免暴露內部實現細節。 使用場景 Controller 和 Service 或 遠程調用 之…

從零搭建高可用分布式限流組件:設計模式與Redis令牌桶實踐

一、需求背景與設計目標 在分布式系統中&#xff0c;面對突發流量時需要一種精準可控的流量控制手段。我們的組件需要具備&#xff1a; 多維度限流&#xff08;用戶/IP/服務節點/自定義表達式&#xff09;分布式環境下精準控制開箱即用的Spring Boot Starter集成高擴展性的架…

Node.js 事件循環和線程池任務完整指南?

在 Node.js 的運行體系中&#xff0c;事件循環和線程池是保障其高效異步處理能力的核心組件。事件循環負責調度各類異步任務的執行順序&#xff0c;而線程池則承擔著處理 CPU 密集型及部分特定 I/O 任務的工作。接下來&#xff0c;我們將結合圖示&#xff0c;詳細剖析兩者的工作…