Elasticsearch 写入性能排查“五板斧”
可考虑 "_source": { "enabled": false }或 includes/excludes,减小写入和存储(会牺牲 reindex/update 能力,需按业务权衡)。日常排查时,一般先跑 1 + 2(延迟/队列 + reject)就能判断是「写入路径堵了」还是「refresh/merge 拖后腿」,再按上面顺序往下细查即可。看各节点的 indexing.index_curren
第一板斧:先看「写完了没有」——索引延迟与 refresh

看什么:
写入是进了内存 / translog 就返回,还是等 refresh 后才可见。若业务侧感觉「写入慢」,先区分是「客户端等很久」还是「数据可见慢」。
索引延迟(indexing pressure)
GET _cat/indices?v&h=index,pri,rep,docs.count,store.size,search.throttledGET /_nodes/stats?pretty&filter_path=**.indexing
看各节点的 indexing.index_current、indexing.index_failed、indexing.delete_current。
若 index_current 长期很高或 index_failed 在涨,说明写入在排队或失败。
refresh 是否拖慢
写入期可临时把 refresh_interval 调大(如 30s 或 -1),看写入 QPS/延迟是否明显变好。
若调大后明显好转,说明 refresh 太频繁是瓶颈之一(尤其是小批量、高 QPS 写入)。
结论:
若这里就发现 indexing 队列长期堆积或失败增多,瓶颈在「写入路径」;若主要是「数据可见慢」,多半是 refresh 或后续段合并。
👉 欢迎加入小哈的星球,你将获得: 专属的项目实战(多个项目) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
-
新项目:《Spring AI 项目实战》正在更新中..., 基于 Spring AI + Spring Boot 3.x + JDK 21;
-
《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍;演示地址:http://116.62.199.48:7070/
-
《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/;
-
专栏阅读地址:https://www.quanxiaoha.com/column
截止目前,累计输出 100w+ 字,讲解图 4013+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有4200+小伙伴加入

第二板斧:看「卡在谁那儿」——线程池与 reject
看什么:

ES 写入主要用两类线程池:write(写 translog/段)和 index(索引文档)。任一满了就会 reject,客户端会拿到 429 或 es_rejected_execution_exception。
GET _cat/thread_pool/write?v&h=node_name,name,active,queue,rejected,completedGET _cat/thread_pool/index?v&h=node_name,name,active,queue,rejected,completedGET _nodes/stats/thread_pool?pretty
重点看:
rejected 是否在涨(历史累计或看一段时间内的增量)。
Elasticsearch 出现 “429 rejected” 报错,怎么办?
queue 是否经常很大(说明处理不过来)。
若 write 或 index 有 reject:
短期:适当调大 thread_pool.write.queue_size / thread_pool.index.queue_size(治标)。
长期:加节点、减单节点写入压力,或优化写入方式(见下一板斧)。
第三板斧:看「磁盘与段合并」——merge 与 I/O
看什么:

写入会产很多小段,merge 会吃 I/O 和 CPU。若 merge 跟不上,段数暴增,后续查询和写入都会变慢。
GET _cat/segments/?vGET _nodes/stats/fs,indices/indexing?pretty
segments:单索引段数是否很多(例如单索引几百上千个段就偏多)。
merge:
GET _nodes/stats/indices/merges?pretty
看 merges.current、merges.total、merges.total_time_in_millis。若长期有大量 merge 在进行,且磁盘 util 很高,瓶颈在 I/O 或 merge 策略。
可做:
写入期调大 index.translog.flush_threshold_size,减少 flush 频率(会略增恢复时间)。
非实时场景,写入完再对历史索引做 forcemerge(控制 max_num_segments),避免在写入高峰做。
看磁盘 util、iowait,必要时换更快盘或增加节点分散 I/O。
第四板斧:看「写入方式」——bulk 与 refresh
看什么:

单条写、小 bulk、或 bulk 过大,都会导致吞吐差或容易触发 reject。
单次 bulk 大小:
建议单次 5~15MB(按 body 算)。
-
太小:请求次数多,协调与网络开销大。
-
太大:容易超时、单次占线程久,易导致 reject。
条数经验:
-
若单条文档 1~2KB,单次 2000~5000 条常见;
-
若单条 10KB+,要相应减少条数,把单次 body 控在 5~15MB 内。
refresh:
大批量导入时,先把该索引 refresh_interval设为 -1,导入完再改回并执行一次 _refresh,能明显减轻写入时的 I/O 与 CPU 峰值。
可做:
在客户端打日志:每批条数、单批 body 大小、是否经常 429/rejected。若 reject 伴随「单批很大」或「并发很高」,优先调小 bulk size 或略降并发。
第五板斧:看「索引与文档本身」——mapping 与 source
看什么:

mapping:
是否大量 dynamic、过多嵌套、很多不需要检索的字段仍默认建索引,都会拉高写入成本。
不参与检索的字段建议 "index": false,大文本/存储型用 "enabled": false的 object。
_source:
若不需要完整 _source,可考虑 "_source": { "enabled": false }或 includes/excludes,减小写入和存储(会牺牲 reindex/update 能力,需按业务权衡)。
副本:
写入期可先把 number_of_replicas设为 0,写完再改回,减少写入放大量(需能接受短暂无副本)。
小结:按顺序来的「几板斧」清单
|
顺序 |
板斧 |
主要看/做 |
|---|---|---|
|
1 |
索引延迟与 refresh |
cat/indices、nodes/stats 的 indexing;调大 refresh_interval 做对比 |
|
2 |
线程池与 reject |
_cat/thread_pool 的 write/index 的 queue、rejected;有 reject 就优化并发/bulk 或扩容 |
|
3 |
段与 merge、I/O |
_cat/segments、merges、磁盘 util;必要时调 flush、错峰 forcemerge |
|
4 |
bulk 与 refresh 用法 |
bulk 5~15MB/批;大批导入关 refresh |
|
5 |
mapping 与 _source |
关掉不必建索引的字段;视情况精简 _source |
日常排查时,一般先跑 1 + 2(延迟/队列 + reject)就能判断是「写入路径堵了」还是「refresh/merge 拖后腿」,再按上面顺序往下细查即可。
👉 欢迎加入小哈的星球,你将获得: 专属的项目实战(多个项目) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
-
新项目:《Spring AI 项目实战》正在更新中..., 基于 Spring AI + Spring Boot 3.x + JDK 21;
-
《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍;演示地址:http://116.62.199.48:7070/
-
《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/;
-
专栏阅读地址:https://www.quanxiaoha.com/column
截止目前,累计输出 100w+ 字,讲解图 4013+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有4200+小伙伴加入


1. 我的私密学习小圈子,从0到1手撸企业实战项目~ 2. 那些回老家的程序员,现在过得怎么样? 3. 面试官:什么是 fail-fast?什么是 fail-safe? 4. 拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。 点“在看”支持小哈呀,谢谢啦
更多推荐

所有评论(0)