批次大小对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,可以说是完全没有差异了,极端值才会显著降低性能。

相关推荐
0和1的舞者12 小时前
接口自动化(四):logging 日志配置 + Allure 测试报告从安装到使用
测试开发·自动化·接口·接口自动化·测试·知识
神秘代码行者15 小时前
Git Restore 命令教程
大数据·git·elasticsearch
踏雪羽翼16 小时前
Android 应用冷启动优化
android·性能优化·性能·启动·冷启动·应用冷启动
Elastic 中国社区官方博客17 小时前
Jina Reranker v3:用于 SOTA 多语言检索 的 0.6B 列表式重排序器
大数据·人工智能·elasticsearch·搜索引擎·ai·jina
七夜zippoe17 小时前
设计模式在Python中的优雅实现:从新手到专家的进阶指南
开发语言·python·设计模式·性能优化·pythonic
卓码软件测评18 小时前
首版次软件认证测试机构【Apifox GraphQL支持详解:查询、变更和订阅】
测试工具·ci/cd·性能优化·单元测试·测试用例
范桂飓18 小时前
大模型性能优化方向
人工智能·性能优化
Dxy123931021618 小时前
ES的DSL编写规则规则讲解
大数据·elasticsearch·搜索引擎
啃火龙果的兔子18 小时前
在已有项目目录下添加远程仓库
大数据·elasticsearch·搜索引擎
吴Wu涛涛涛涛涛Tao19 小时前
抖音思路复刻:iOS 卡死(ANR)监控 + 自动符号化全流程实战
ios·性能优化