第一板斧:先看「写完了没有」——索引延迟与 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:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。
点“在看”支持小哈呀,谢谢啦
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐