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

相关推荐
Mitch3111 小时前
【漏洞复现】CVE-2015-3337 Arbitrary File Reading
elasticsearch·网络安全·docker·漏洞复现
Mitch3111 小时前
【漏洞复现】CVE-2015-5531 Arbitrary File Reading
web安全·elasticsearch·网络安全·docker·漏洞复现
永恒,怎么可能2 小时前
关于博客系统的自动化功能测试报告
自动化·测试
苏三说技术3 小时前
Redis 性能优化的18招
数据库·redis·性能优化
喝醉酒的小白3 小时前
Elasticsearch(ES)监控、巡检及异常指标处理指南
大数据·elasticsearch·搜索引擎
程序猿会指北5 小时前
【鸿蒙(HarmonyOS)性能优化指南】内存分析器Allocation Profiler
性能优化·移动开发·harmonyos·openharmony·arkui·组件化·鸿蒙开发
孤水寒月5 小时前
Git忽略文件.gitignore
git·elasticsearch
程序猿会指北8 小时前
【鸿蒙(HarmonyOS)性能优化指南】启动分析工具Launch Profiler
c++·性能优化·harmonyos·openharmony·arkui·启动优化·鸿蒙开发
LKAI.12 小时前
搭建Elastic search群集
linux·运维·elasticsearch·搜索引擎
彭亚川Allen21 小时前
优化了2年的性能,没想到最后被数据库连接池坑了一把
数据库·后端·性能优化