批次大小对ES写入性能影响初探

问题背景

ES使用bulk写入时每批次的大小对性能有什么影响?设置每批次多大为好?

一般来说,在Elasticsearch中,使用bulk API进行批量写入时,每批次的大小对性能有着显著的影响。具体来说,当批量请求的大小增加时,写入性能通常会提高,因为减少了网络往返时间和磁盘I/O次数。然而,如果批量请求过大,会导致节点上的内存压力增大,进而影响其他请求的性能,甚至可能导致节点崩溃。

实测方案与结果

我在虚拟机环境实测了7种不同批次的大小,从500到10000都有。

结果如下表:

索引消耗的时间与批次大小数据图示:

  • 最慢的10000条每批,吞吐量是18078/秒。
  • 最快是8000条每批,吞吐量是18218/秒。

这图看着很唬人,实际上设定不同的批次大小对写入性能的影响微乎其微,图中所示的数据索引时间单位是毫秒。

表中,程序运行时间单位是秒,即便是观察程序运行总时间,也都是几秒之差。因为波动太小,因此不具有实际调优意义,只能作为一个数据参考。

当然,对于生产环境也可以通过实验来确定最佳的批量大小。可以从较小的批量开始(例如5MB),然后逐渐增加批量大小,观察写入性能的变化。当性能开始下降时,说明批量大小已经过大,应该减小批量大小。通常,一个好的起点是将每批次的数据量设置在5MB到15MB之间。

补充测试

那么将批次大小分别设置为10万,和10呢?取两个较为极端的值。

  • 超大的10万级别:运行了149秒,变慢的趋势有所抬头!
  • 很小10级别:**运行了641秒,明显变慢!果然,批次太小的确是浪费资源!**不过一般也没有开发人员会设置成这个值。

批次大小设置为极小值10的时候,数据反映了另外一个事实,那就是批量写入比单条写入快了不止一倍!

最终所有测试索引都有100万条数据,数据存储空间大小也几乎一致:

结论

经过计算,上述7种单批次大小的100万数据吞吐量差异最大只有千分之7,可以说是完全没有差异了,极端值才会显著降低性能。

相关推荐
金銀銅鐵13 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
念何架构之路14 小时前
go-grpc设计思想
开发语言·后端·golang
system_error_x14 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
Elastic 中国社区官方博客15 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
步行cgn16 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
码事漫谈16 小时前
AI 读你的提示词,其实很没耐心
后端
用户83562907805117 小时前
如何使用 Python 格式化 Excel 单元格中的长文本
后端·python
我命由我1234517 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
IT_陈寒17 小时前
Java性能优化完全指南
前端·人工智能·后端
电子IT笔记17 小时前
对接群晖NAS,上传和删除踩坑记录
前端·后端