Elasticsearch 写入性能突然下降往往与 Translog 配置密切相关。Translog 负责记录未持久化的操作,默认配置可能在特定负载下成为瓶颈。若 durability 设为 request,每次写入需等待落盘,导致延迟增加;若设为 async,虽提升性能但存在数据丢失风险。突然下降可能源于版本升级默认值变更、磁盘 I/O 饱和或 translog 刷盘频率过高。建议检查 index.translog.durability 及 sync_interval 参数,结合磁盘性能调整缓冲大小,并监控 indices.indexing.index_time 指标,必要时调整为 async 模式或增大 flush_threshold_size 以平衡安全与性能。
别再让 ES 写入拖慢你的应用了:从 Translog 到 Refresh 的实战调优手册 (附避坑清单)-CSDN 博客
关键监控指标速查表:
| 指标路径 | 健康阈值 | 危险信号 | 应急措施 |
|---|---|---|---|
| indices.indexing.index_time | <500ms/bulk | 持续>1s | 立即检查 translog 状态 |
| thread_pool.write.queue | <200 | 持续增长不下降 | 扩容或降级写入流量 |
| jvm.mem.heap_used_percent | <70% | >85% 且频繁 GC | 调整 buffer 大小 |
| fs.io_stats.io_time | <30% | 持续>50% | 优化 refresh 间隔 |
Elasticsearch 写入延迟高?5 种常见病因 + 对应优化方案,立即见效-CSDN 博客
Elasticsearch 作为主流的分布式搜索引擎,在高并发写入场景下可能出现写入延迟升高的问题。该现象通常由多个底层机制共同作用导致,深入理解其核心组件的工作原理是优化性能的前提。分片分配与负载不均 当索引的分片分布不均或主分片过多时,集群的写入压力无法有效分散。某些数据节点可能承担过重的写入负载,而其他节点处于空闲状态,造成“热点”问题。检查分片分布:使用_cat/shardsAPI 查看各节点上的分片数量 合理设置分片数:避免单索引创建过多主分片,建议根据数据量和节点数按需分配 刷新间隔 (refresh_interval) 过短 Elasticsearch 默认每秒自动刷新一次,生成新的段 (segment),以便新写入的数据可被搜索。频繁刷新会加重 I/O 和 JVM 压力。 { "settings": { "refresh_interval":"30s" } } 一键获取完整项目代码 说明:将刷新间隔从默认的 1s 调整为 30s,可显著降低写入开销,适用于对实时性要求不高的场景。段合并策略不当 大量小 segment 会导致查询性能下降,同时增加文件句柄消耗。虽然 Elasticsearch 自动执行段合并,但若写入速率过高,合并速度可能跟不上。
| 参数 | 默认值 | 建议值 |
|---|---|---|
| index.merge.policy.merge_factor | 10 | 20-30 |
| index.merge.policy.max_merge_at_once | 10 | 20 |
集群恢复,当节点离线导致分片状态为 UNASSIGNED 时,如何进行分片重分配?当出现 Elasticsearch bulk 写入性能瓶颈时,可以从哪些方面进行优化
一、集群分片重分配解决方案 手动分片分配 (需确保集群状态 Yellow/Red): PUT _cluster/reroute{"commands":[{"allocate_stale_replica":{"index":"索引名","shard":分片编号,"node":"目标节点 ID"}}]} 一键获取完整项目代码 bash 1 2 3 4 5 6 7 8 9 10 11 12 常用修复步骤:1) 检查分片状态:GET _cat/shards?v&h=index,shard,prirep,state,unassigned.reason 一键获取完整项目代码 bash 1 2) 启用自动分配 (默认开启): PUT _cluster/settings{"transient":{"cluster.routing.allocation.enable":"all"}} 一键获取完整项目代码 bash 1 2 3 4 5 6 3) 调整恢复阈值 (根据硬件调整): PUT _cluster/settings{"transient":{"cluster.routing.allocation.node_initial_primaries_recoveries":4,"cluster.routing.allocation.node_concurrent_recoveries":2}} 一键获取完整项目代码 bash 1 2 3 4 5 6 7 二、Bulk 写入性能优化方案 客户端优化:# 使用多线程批量提交 (Python 示例)fromelasticsearch.helpersimportparallel_bulkforsuccess,infoinparallel_bulk(es,actions,thread_count=4):ifnotsuccess:print(f'Doc failed:{info}') 一键获取完整项目代码 python 1 2 3 4 5 6 服务端核心参数调整:PUT _cluster/settings{"transient":{"indices.memory.index_buffer_size":"15%","index.refresh_interval":"60s","index.translog.durability":"async"}} 一键获取完整项目代码 bash 1 2 3 4 5 6(发布时间是 2025 年 5 月 27 日)
Elasticsearch 索引优化难题全解:为什么你的查询越来越慢?(附压测数据支撑)-CSDN 博客
第一章:Elasticsearch 索引性能下降的根源剖析 Elasticsearch 在大规模数据写入场景下,索引性能可能显著下降。其根本原因通常并非单一因素导致,而是多个系统组件与配置策略相互作用的结果。硬件资源瓶颈 底层硬件是影响索引吞吐量的基础。当节点 CPU 负载过高、磁盘 I/O 延迟上升或内存不足时,写入性能会急剧恶化。特别是使用机械硬盘而非 SSD 时,段合并 (segment merge) 过程极易成为性能瓶颈。JVM 垃圾回收压力 Elasticsearch 运行在 JVM 之上,频繁的 GC 会导致长时间的停顿。若堆内存设置过大,可能导致 Full GC 持续数秒甚至更久,直接反映为索引延迟飙升。建议将堆大小控制在 32GB 以内,并启用 G1GC 垃圾回收器。索引配置不当 默认配置适用于通用场景,但在高写入负载下需针对性优化。例如,过多的副本分片会增加写入开销:{ "settings": { "number_of_replicas":1,//减少副本数可提升写入速度 "refresh_interval":"30s"//延长刷新间隔减少段生成频率 } } AI 写代码 该配置通过降低刷新频率和副本同步次数,有效减轻主分片写入压力。分片设计不合理 单个分片过大 (超过 50GB) 会导致搜索和合并效率下降 分片数量过多会增加集群状态管理负担 建议每个分片大小控制在 10GB~50GB 之间
| 问题类型 | 典型表现 | 解决方案 |
|---|---|---|
| 磁盘 IO 饱和 | merge 速度缓慢 | 更换为 SSD 存储 |
| 频繁 GC | 节点响应延迟突增 | 调优 JVM 参数 |
Elasticsearch 集群写入性能突然衰减问题定位与解决
线上的 Elasticsearch 集群在某一天早上开始写入吞吐下降,环比下降了 30%,但是业务的数据量环比没有下降,从而导致数据积压在 Kafka 中无法消费。写入吞吐下降后,通过查看监控,发现 cpu 使用率和 load 也下降,并没有明显的异常能够表明是 Elasticsearch 集群出了问题,问题变得棘手起来了。问题定位 通过查看 jstack,可以看到有热点线程,大量线程栈顶为 java 时间解析类,并且主要有两种时间解析类栈顶:结合上述时间解析类的堆栈,查看 elasticsearch 源码,发现在北京时间 9 月 29 日 08:00 刚好是一个特殊的时间点,0 时区的 9 月 29 日 00:00, 会触发时间解析类的日期检查函数,判断 29 号是否一个合法的日期:而这个代码里的 if 条件,实际上是会进行编译优化,通过抓取进程的火焰图,可以验证性能下降实际上与编译优化的 Deoptimization 有关,Deoptimization 正常情况下占用 cpu 一般在 0.1%,而下图中实际占用了 19.92%,这就意味着出现编译退化导致解释执行,而 Java 的解释执行相比编译优化执行速度慢了两个数量级。编译退化,实际上是触发了 JDK 的一个 bug(https://bugs.openjdk.java.net/browse/JDK-8227523),在 29 日这个临界时间点附近,可能触发 LocatDate::create() 在带有和不带有日期检查 (switch 分支) 的编译优化代码之间反复切换,当切换超过 400 次之后,就会触发编译退化到解释执行。Presto 也有遇到过类似的问题:http://armsword.com/2019/09/18/solve-presto-system-load-too-high/。此外,从写入的数据字段来看,每条数据会包含 4 个时间字段,会进一步加大进入到 LocateDate::create() 的概率,从而拉低写入性能。解决方案(该信息的时间戳是 2023 年 5 月 25 日)
Elasticsearch 集群慢写入调优
一、描述 随着业务量的持续增长,我们 Elasticsearch(ES) 集群在最近一个月内出现了索引数据写入性能下降的问题。为定位瓶颈,我们对集群进行了全面排查,包括磁盘 IO 性能、节点分片分布情况、单条数据写入大小、索引 mapping 结构、索引段文件数量与大小、以及慢查询日志等多个方面,均未发现明显异常。基于现有分析结果和 ES 集群的运行特性,我们初步判断性能瓶颈可能与集群配置、资源分配或查询负载等潜在因素有关。为进一步提升写入性能,优化集群稳定性与响应速度,特制定以下调优方案,涵盖索引配置优化、集群资源管理、写入流程优化等方面,以期有效缓解写入延迟问题并提升整体性能。(截至 2025 年 6 月 29 日)
FAQ
Translog durability 有哪些模式?
主要有 request 和 async 两种模式。request 模式每个写操作必须等待 translog 落盘才返回,数据安全但吞吐量下降 40%;async 模式定期刷盘 (默认 5 秒),性能提升但故障时可能丢失最近写入。
写入性能下降如何检查 translog?
检查 index.translog.durability 配置,监控 indices.indexing.index_time 指标,若持续>1s 需立即检查 translog 状态,同时观察 thread_pool.write.queue 是否持续增长。
如何优化 refresh_interval 提升写入?
将刷新间隔从默认的 1s 调整为 30s 或 60s,可显著降低写入开销,适用于对实时性要求不高的场景,减少段生成频率。
内存不足对写入性能有何影响?
内存占用导致 page cache 空间减少,继而 ES 写入性能下降,page fault 频率增加,磁盘读 IO 和 CPU 使用率上升,写入吞吐量和延迟相应下降。