【實戰 ES】實戰 Elasticsearch:快速上手與深度實踐-2.2.2線程池配置與寫入限流

👉 點擊關注不迷路
👉 點擊關注不迷路
👉 點擊關注不迷路


文章大綱

  • Elasticsearch批量寫入性能調優:2.2.2 線程池配置與寫入限流深度實踐
    • 1. 線程池核心機制解析
      • 1.1 `Elasticsearch`線程池架構
      • 1.2 `Bulk`線程池工作模型
    • 2. 寫入場景線程池調優
      • 2.1 硬件資源與線程數關系
      • 2.2 隊列深度優化策略
    • 3. 動態限流策略實現
      • 3.1 寫入壓力識別指標
      • 3.2 分級限流方案
    • 4. 性能壓測與效果驗證
      • 4.1 測試環境
      • 4.2 調優前后對比
    • 5. 生產環境最佳實踐
      • 5.1 參數配置黃金法則
      • 5.2 監控預警方案
      • 5.3 故障應急處理流程
    • 總結

Elasticsearch批量寫入性能調優:2.2.2 線程池配置與寫入限流深度實踐


1. 線程池核心機制解析

1.1 Elasticsearch線程池架構

Elasticsearch采用分層線程池設計,不同操作類型使用獨立線程池,下表是ES主要線程池配置對比:

線程池類型默認配置主要職責
bulk線程數=CPU核心數,隊列=200處理批量寫入請求
index線程數=CPU核心數,隊列=200處理單文檔寫入請求
search線程數=round(CPU*1.5)+1處理查詢請求
refresh線程數=1,隊列=1000處理索引刷新操作

1.2 Bulk線程池工作模型

  • 適用場景:處理批量索引/更新/刪除請求,具有高吞吐量特性
  • 設計原則:在CPU密集型IO密集型任務間取得平衡
// 默認Bulk線程池配置源碼ThreadPool.Names.BULK: // 核心線程數(保持活躍的最小線程數)// 默認值:與CPU物理核心數相同(Runtime.getRuntime().availableProcessors()// 調優建議:在純SSD/NVMe環境中可設置為CPU核心數×1.5core = number_of_processors// 最大線程數(線程池擴容上限)// 默認值:與核心線程數相同(Elasticsearch默認不動態擴容)// 調優建議:在存在IO等待的場景可設為CPU核心數×2max = number_of_processors// 線程空閑存活時間(超時后回收多余線程)// 重要性:平衡資源利用與線程創建開銷// 計算公式:max(5, min(1, (core threads)/2)) 單位秒(實際默認30秒)keep_alive = 30s// 任務隊列容量(等待執行的bulk請求數)// ~~警告:隊列過大會導致內存壓力,過小易觸發拒絕~~ // 計算公式:min(200, max(10, core threads × 10)) queue_size = 200// 自動隊列調整(7.x+版本特性)// 工作機制:根據拒絕率動態調整隊列容量(初始200,最大1e5// 啟用條件:需配合"xpack.ml.enabled: true"使用// 注意:生產環境建議關閉(設置為false)并手動管理隊列auto_queue = true
  • 關鍵參數說明:
    • core/max:線程數動態調整范圍
    • auto_queue:自動隊列調整策略(7.x+版本特性)
    • queue_size:隊列積壓容量閾值

2. 寫入場景線程池調優

2.1 硬件資源與線程數關系

  • 通過壓力測試得出不同硬件配置下的最佳線程數:
CPU核心數內存磁盤類型最佳bulk線程數平均吞吐量(docs/s)
416GBHDD412,000
832GBSSD845,000
1664GBNVMe12112,000
32128GBNVMe16235,000
  • 調整公式推導:
    • 最佳線程數 = CPU核心數 × (1 + (IO等待時間/CPU時間))
    • 當使用SSD/NVMe時,建議取CPU核心數的1-1.5倍

2.2 隊列深度優化策略

// 此請求用于更新 Elasticsearch 集群的設置
// PUT 請求方式用于向指定的端點發送數據,以修改或創建資源
// 這里的端點是 /_cluster/settings,表示對集群的設置進行操作PUT /_cluster/settings
{// "persistent" 表示這些設置是持久化的// 持久化設置會在集群重啟后仍然生效// 與之相對的是 "transient" 設置,它只在當前集群會話中有效,重啟后會丟失"persistent": {// "thread_pool.bulk.queue_size"  Elasticsearch 中用于控制批量操作線程池隊列大小的設置項// 批量操作(如 bulk API)是 Elasticsearch 中用于一次性處理多個文檔的操作方式// 當有大量的批量操作請求進入系統時,這些請求會被放入一個隊列中等待處理// 此設置項的值決定了這個隊列最多可以容納多少個請求// 這里將隊列大小設置為 1000,意味著當隊列中的請求數量達到 1000 個時,新的批量操作請求將被阻塞,直到隊列中有請求被處理完畢"thread_pool.bulk.queue_size": 1000}
}
  • 隊列設置黃金法則:
      1. 總內存壓力不超過JVM堆的50%
      1. 每個bulk請求平均大小控制在5-15MB
      1. 監控指標:thread_pool.bulk.rejected需保持為0,出現拒絕需立即擴容

3. 動態限流策略實現

3.1 寫入壓力識別指標

  • 線程池狀態監控示例
// 此請求用于獲取 Elasticsearch 集群中所有節點的線程池統計信息,并僅過濾出與批量操作(bulk)相關的信息
// GET 請求方式用于從指定的端點獲取數據
// 端點 /_nodes/stats/thread_pool 表示獲取所有節點的線程池統計信息
// filter_path=**.bulk 參數用于過濾響應結果,只返回與批量操作相關的統計信息GET /_nodes/stats/thread_pool?filter_path=**.bulk{// "threads" 表示當前批量操作線程池中的線程數量// 這些線程負責處理批量操作請求,線程數量的多少會影響批量操作的處理能力"threads" : 16,// "queue" 表示當前批量操作線程池【隊列】中的請求數量// 當有大量的批量操作請求進入系統,且線程池中的線程都在忙碌時,新的請求會被放入隊列中等待處理// 此值反映了當前等待處理的批量操作請求數量"queue" : 120,// "active" 表示當前【正在執行批量操作】的線程數量// 該值顯示了線程池的忙碌程度,如果 "active" 等于 "threads",說明線程池中的所有線程都在工作"active" : 16,// "rejected" 表示由于線程池隊列已滿而被拒絕的批量操作請求數量// 當隊列中的請求數量達到隊列的最大容量時,新的請求將被拒絕// 此值為 0 表示目前沒有請求被拒絕"rejected" : 0,// "largest" 表示批量操作線程池隊列【曾經達到的最大請求數量】// 該值可以幫助你了解系統在過去的運行過程中,隊列的壓力情況"largest" : 200,// "completed" 表示批量操作線程池【已經完成處理的】請求數量// 此值反映了線程池的歷史處理能力和工作量"completed" : 245600
}
  • 關鍵閾值判斷:
    • 隊列使用率 > 80%,jvm.mem.heap_used_percent > 75%:觸發擴容或限流,隊列過大可能引發OOM
    • Rejected計數 > 0:需立即調整配置
    • Active線程數持續滿載:存在資源瓶頸

3.2 分級限流方案

  • 分級限流配置示例
# 【索引級別】限流(動態生效)
# 此操作可以在不重啟 Elasticsearch 集群的情況下,直接對指定索引進行限流設置,方便靈活調整索引的操作速率
# PUT 請求用于更新資源,這里是更新名為 my_index 的索引的設置PUT /my_index/_settings
{# "index.ops.rate_limit" 是用于設置索引操作速率限制的配置項"index.ops.rate_limit": {# "max" 指定了在一定時間內允許的最大操作數據量# 這里設置為 "100mb",表示在下面指定的時間范圍內,索引操作涉及的數據量最大不能超過 100 兆字節"max": "100mb",# "time" 定義了上述最大操作數據量所對應的時間周期# 設置為 "1s",意味著每秒內索引操作的數據量不能超過 100 兆字節"time": "1s"}
}# 【節點級別】限流(重啟生效)
# 下面的配置需要在 elasticsearch.yml 文件中進行修改,修改后需要重啟 Elasticsearch 節點才能使配置生效# elasticsearch.yml  Elasticsearch 的核心配置文件,用于設置節點的各種參數# "thread_pool.bulk.size" 用于設置批量操作線程池的線程數量
# 這里設置為 16,表示批量操作線程池中將有 16 個線程同時處理批量操作請求
# 線程數量的多少會影響批量操作的處理能力,需要根據節點的硬件資源和業務需求進行合理調整
thread_pool.bulk.size: 16# "thread_pool.bulk.queue_size" 用于設置批量操作線程池的隊列大小
# 當有大量的批量操作請求進入系統,且線程池中的線程都在忙碌時,新的請求會被放入隊列中等待處理
# 這里設置為 500,意味著隊列最多可以容納 500 個批量操作請求
# 如果隊列滿了,新的請求可能會被拒絕,因此需要根據實際情況合理設置隊列大小
thread_pool.bulk.queue_size: 500
  • 限流策略對照表:不同場景限流策略選擇
場景策略生效方式調整粒度
突發流量動態索引級限流即時生效精細
持續高負載節點級線程池調整重啟生效粗粒度
混合工作負載隊列優先級策略版本依賴中等

4. 性能壓測與效果驗證

4.1 測試環境

  • 集群配置:3節點(16CPU / 64GB / NVMe)
  • 數據集:商品日志數據(平均文檔大小2KB)
  • 測試工具:esrally基準測試
    • Elasticsearch Rally(簡稱 esrally )是 Elastic 官方開發的一款用于對 Elasticsearch 進行基準測試的工具。
    • 它可以幫助你評估 Elasticsearch 集群在不同場景下的性能表現,找出性能瓶頸,為集群的優化和擴容提供依據
    • 可以使用 Python 的包管理工具 pip 進行安裝pip install esrally。測試完成后,esrally 會輸出詳細的測試結果,包括索引速率、搜索響應時間、吞吐量等指標。

4.2 調優前后對比

配置項默認配置優化配置提升比例
bulk線程數1624+48%
隊列深度2001000+400%
限流閾值50MB/s-
平均吞吐量78,000 docs/s142,000 docs/s+82%
P99延遲650ms320ms-51%
拒絕請求數1,2000100%
  • 吞吐量變化曲線圖:
500k                                       
400k               ***********             
300k          *****           *****        
200k       ***                     ***     
100k   ****                           **** 0 ┼-------------------------------------默認配置  線程優化  隊列優化  綜合調優

5. 生產環境最佳實踐

5.1 參數配置黃金法則

# 推薦配置模板(elasticsearch.yml)
# 用于優化 Elasticsearch 的性能,根據實際情況合理調整配置提升集群的穩定性和處理能力# "thread_pool.bulk" 用于配置批量操作線程池的相關參數
# 批量操作(如使用 Bulk API 一次性處理多個文檔的索引、更新或刪除操作)是 Elasticsearch 中常用的操作方式,合理配置該線程池能提高批量操作的效率
thread_pool.bulk:# "size" 定義了批量操作線程池中的線程數量# ${CPU_CORES} 代表系統的 CPU 核心數,乘以 1.5 意味著線程池的線程數量是 CPU 核心數的 1.5 # 這樣設置的目的是充分利用 CPU 資源,讓更多的線程同時處理批量操作請求,但又不會過度創建線程導致系統資源耗盡# 例如,如果系統有 8  CPU 核心,那么線程池的線程數量將是 8 * 1.5 = 12 size: ${CPU_CORES} * 1.5# "queue_size" 表示批量操作線程池隊列的最大容量# 當有大量的批量操作請求進入系統,且線程池中的線程都在忙碌時,新的請求會被放入隊列中等待處理# 這里將隊列大小設置為 1000,意味著隊列最多可以容納 1000 個批量操作請求# 如果隊列滿了,新的請求可能會被拒絕,需要根據實際的業務流量和處理能力來調整這個值queue_size: 1000# "auto_queue" 是一個布爾值,【設置為 true 表示啟用自動隊列功能】# 當線程池中的線程都在忙碌時,新的請求會自動進入隊列等待處理# 這有助于避免請求丟失,確保所有請求都能得到處理,但也可能會導致隊列積壓,需要結合隊列大小和實際業務情況進行考慮auto_queue: true# "indices.memory.index_buffer_size" 用于設置索引緩沖區的大小
# 索引緩沖區是 Elasticsearch 用于臨時存儲待索引文檔的內存區域
# 設置為 20% 表示將堆內存的 20% 分配給索引緩沖區
# 較大的索引緩沖區可以減少磁盤 I/O 操作,提高索引性能,但也會占用更多的堆內存,可能會影響其他操作的性能
# 需要根據【系統的內存資源和業務的索引頻率】來合理調整這個比例indices.memory.index_buffer_size: 20%

5.2 監控預警方案

  • 建議設置以下報警閾值:
      1. bulk隊列使用率 > 75% ,持續5分鐘
      1. 節點寫入吞吐量 > 80% ,磁盤順序寫能力
      1. JVM堆內存使用 > 70% ,持續10分鐘

5.3 故障應急處理流程

  • 寫入性能下降處理流程:1. 檢查線程池狀態:GET /_cat/thread_pool?v2. 分析熱點節點:GET /_nodes/hot_threads3. 臨時限流處理:PUT /_cluster/settings(動態調整)4. 縱向擴展:增加批量寫入大小5. 橫向擴展:添加Ingest節點
    
  • Ingest 節點是 Elasticsearch 中一個重要的組件,主要用于在文檔被索引之前對其進行預處理。
    • 這意味著你可以對原始數據進行各種處理,如解析、轉換、添加字段、刪除字段等,以滿足不同的索引和查詢需求。

總結

  • 通過合理配置線程池參數與動態限流策略,可使批量寫入吞吐量提升80%以上,同時保障集群穩定性
  • 建議結合具體硬件配置建立基準性能模型,采用分級限流策略應對不同場景的寫入壓力

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

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

相關文章

VSCode 與 Vim 插件 的 復制粘貼等快捷鍵沖突,優先使用 VSCode 的快捷鍵

VSCode 與 Vim 插件 的 復制粘貼等快捷鍵沖突,優先使用 VSCode 的快捷鍵 在 VSCode 中,如果你發現 Vim 插件(如 VSCodeVim 擴展)與 VSCode 的默認復制粘貼快捷鍵(CtrlC / CtrlV)沖突,并且你想優…

tsconfig.json 配置清單

tsconfig.json 配置清單 基礎結構 {"compilerOptions": {// 編譯選項},"include": [// 指定需要編譯的文件或目錄],"exclude": [// 指定不需要編譯的文件或目錄],"extends": "./base-tsconfig.json","files": […

springboot可以同時處理多少個請求

源碼 ServerProperties Tomcat 配置 參數解析 必須要先建立連接,再用線程處理。 比如max-connection最大連接數,accept-count相當于隊列容量。總連接數二者和 min-spare-treads 核心線程數默認10,max-threads最大線程數默認200。 正常…

Spring 三級緩存 vs 二級緩存:深度解析循環依賴的終極解決方案

目錄 一. 循環依賴的本質矛盾 1. 什么是循環依賴? 2. 矛盾的核心 二. 三級緩存架構解析 三級緩存工作流程圖?編輯 三、為什么必須三級緩存? 1. 二級緩存的致命缺陷 2. 三級緩存的精妙設計 四、場景推演:三級緩存如何解決代理問題 …

視頻流暢播放相關因素

視頻播放的流暢度是一個綜合性問題,涉及從視頻文件本身到硬件性能、網絡環境、軟件優化等多個環節。以下是影響流暢度的關鍵因素及優化建議: 一、視頻文件本身 1. 分辨率與幀率 1.問題:高分辨率(如4K)或高幀率&#…

金融項目實戰

測試流程 測試流程 功能測試流程 功能測試流程 需求評審制定測試計劃編寫測試用例和評審用例執行缺陷管理測試報告 接口測試流程 接口測試流程 需求評審制定測試計劃分析api文檔編寫測試用例搭建測試環境編寫腳本執行腳本缺陷管理測試報告 測試步驟 測試步驟 需求評審 需求評…

LeetCode 25 - K 個一組翻轉鏈表

LeetCode 25 - K 個一組翻轉鏈表 這道題是一個典型的鏈表操作題,考察我們對鏈表的精確操作,包括反轉鏈表、分組處理、遞歸和迭代的結合應用等。還可以通過變體問題延伸到優先隊列操作、歸并、分塊等,這使得它成為面試中的高頻考題之一。 題目…

Leetcode 54: 螺旋矩陣

Leetcode 54: 螺旋矩陣 是一道經典的矩陣遍歷模擬題目,要求我們以螺旋順序遍歷一個二維數組。這個問題在面試中非常經典,考察模擬、數組操作以及邏輯清晰度。掌握本題的高效解法可以迅速給面試官留下好印象。 適合面試的解法:邊界法&#xff…

abseil-cpp:環境搭建

參考: https://abseil.io/docs/cpp/quickstart-cmake abseil-cpp.git/dd4c89b abseil-cpp.git/20240722.1 1. clone代碼倉庫、編譯 git clone https://github.com/abseil/abseil-cpp.git /app/abseil-cpp/ #/app/abseil-cpp/.git/config git checkout 20240722.1git rev-pa…

Storm實時流式計算系統(全解)——下

storm編程案例-網站訪問來源實時統計-需求 storm編程-網站訪問來源實時統計-代碼實現 根據以上條件可以只寫一個類,我們只需要寫2個方法和一個main(),一個讀取/發射(spout)。 一個拿到數據統計后發到redis…

什么是SYN洪范攻擊?

文章目錄 一、什么是SYN洪范攻擊?二、SYN泛洪攻擊原理2.1 TCP 三次握手過程2.2 SYN攻擊過程 三、防御措施 一、什么是SYN洪范攻擊? SYN洪泛攻擊(SYN Flood)發生在OSI第四層,是一種基于?TCP協議三次握手漏洞?的DoS&a…

【嵌入式】MQTT

MQTT 文章目錄 MQTT安裝簡介MQTT客戶端代碼 安裝 安裝Paho MQTT C庫: sudo apt-get install libpaho-mqtt3-dev頭文件包含: #include "MQTTClient.h"編譯選項: gcc -o $ $^ -lpaho-mqtt3c簡介 MQTT協議全稱是(Message Queuing…

ubuntu離線安裝nvidia-container-runtime

參考文章 ubuntu系統docker20.4版本安裝nvidia-container-runtime3.11.0-1版本(離線安裝nvidia-docker) - jokerMM - 博客園 https://zhuanlan.zhihu.com/p/15194336245 一、軟件地址 Index of /nvidia-docker/libnvidia-container/stable/ 從上述地地址——進入對應系統—…

用Python+Flask打造可視化武俠人物關系圖生成器:從零到一的實戰全記錄

用PythonFlask打造可視化武俠人物關系圖生成器:從零到一的實戰全記錄 一、緣起:一個程序小白的奇妙探索之旅 作為一個接觸Python僅13天的編程萌新,我曾以為開發一個完整的應用是遙不可及的事情。但在DeepSeek的幫助下,我竟用短短…

RPA 職業前景:個人職場發展的 “新機遇”

1. RPA職業定義與范疇 1.1 RPA核心概念 機器人流程自動化(RPA)是一種通過軟件機器人模擬人類操作,自動執行重復性、規則性任務的技術。RPA的核心在于其能夠高效、準確地處理大量數據和流程,減少人工干預,從而提高工作…

Full GC 排查

在 Java 中,Full GC(完全垃圾回收)會對整個堆(包括年輕代和老年代,甚至可能包括永久代/元空間)進行垃圾回收,通常會導致較長的停頓(STW,Stop-The-World)。如果…

go語言中字符串嵌套

在Go語言中,字符串嵌套通常是指在字符串中包含另一個字符串。可以通過以下幾種方式實現: 1. 使用雙引號和轉義字符 如果需要在字符串中嵌套雙引號,可以使用轉義字符 \ 來表示內部的雙引號。例如: s : "He said, \"He…

Docker 學習(二)——基于Registry、Harbor搭建私有倉庫

Docker倉庫是集中存儲和管理Docker鏡像的平臺,支持鏡像的上傳、下載、版本管理等功能。 一、Docker倉庫分類 1.公有倉庫 Docker Hub:官方默認公共倉庫,提供超過10萬鏡像,支持用戶上傳和管理鏡像。 第三方平臺:如阿里…

js的簡單介紹

一.javascript(是什么) 是一種運行在客戶端(瀏覽器)的編程語言,實現人機交互效果 作用 網頁特效(監聽客戶的一些行為讓網頁做出對應的反饋)表單驗證(針對表格數據的合法性進行判斷)數據交互(獲取后臺的數據&#xf…

k8s架構及服務詳解

目錄 1.1.容器是什么1.2.Namespace1.3.rootfs5.1.Service介紹5.1.1.Serice簡介 5.1.1.1什么是Service5.1.1.2.Service的創建5.1.1.3.檢測服務5.1.1.4.在運行的容器中遠程執行命令 5.2.連接集群外部的服務 5.2.1.介紹服務endpoint5.2.2.手動配置服務的endpoint5.2.3.為外部服務…