Elasticsearch性能调优之索引写入性能优化

2023-06-30

本文主要是 Elasticsearch性能调优之索引写入性能优化 相关的知识问答,如果你也了解,请帮忙补充。

参考知识1 1和2,适合的是,你的es java client程序,可以采取批量写的场景
3,比较通用的,比较合适的是,你对于写入数据到可以读到能够接受比较大的延迟
4,一次性批量导入数据的场景
5/6/7/8/9,通用型,尽量都去做到

1/2/3/4,都是有各自适用的场景,如果场景合适,就尽量用,因为对性能的提升都是很明显的

5/6/7/8/9,其中通用,尽量去优化你的集群,但是其中最重要的,就是3块,filesystem cache更大的内存,给index buffer最充足的内存,一个是用SSD固态硬盘

1、用bulk批量写入

你如果要往es里面灌入数据的话,那么根据你的业务场景来,如果你的业务场景可以支持,可以做到,让你将一批数据聚合起来,一次性写入es,那么就尽量采用bulk的方式,每次批量写个几百条这样子。

bulk批量写入的性能比你一条一条写入大量的document的性能要好很多。但是如果要知道一个bulk请求最佳的大小,需要对单个es node的单个shard做压测。先bulk写入100个document,然后200个,400个,以此类推,每次都将bulk size加倍一次。如果bulk写入性能开始变平缓的时候,那么这个就是最佳的bulk大小。并不是bulk size越大越好,而是根据你的集群等环境具体要测试出来的,因为越大的bulk size会导致内存压力过大,因此最好一个请求不要发送超过10mb的数据量。

2、使用多线程将数据写入es

单线程发送bulk请求是无法最大化es集群写入的吞吐量的。如果要利用集群的所有资源,就需要使用多线程并发将数据bulk写入集群中。为了更好的利用集群的资源,这样多线程并发写入,可以减少每次底层磁盘fsync的次数和开销。一样,可以对单个es节点的单个shard做压测,比如说,先是2个线程,然后是4个线程,然后是8个线程,16个,每次线程数量倍增。一旦发现es返回了TOO_MANY_REQUESTS的错误,JavaClient也就是EsRejectedExecutionException,那么就说明es是说已经到了一个并发写入的最大瓶颈了,此时我们就知道最多只能支撑这么高的并发写入了。

3、增加refresh间隔

默认的refresh间隔是1s,用index.refresh_interval参数可以设置,这样会其强迫es每秒中都将内存中的数据写入磁盘中,创建一个新的segment file。正是这个间隔,让我们每次写入数据后,1s以后才能看到。但是如果我们将这个间隔调大,比如30s,可以接受写入的数据30s后才看到,那么我们就可以获取更大的写入吞吐量,因为30s内都是写内存的,每隔30s才会创建一个segment file。

4、禁止refresh和replia

如果我们要一次性加载大批量的数据进es,可以先禁止refresh和replica复制,将index.refresh_interval设置为-1,将index.number_of_replicas设置为0即可。这可能会导致我们的数据丢失,因为没有refresh和replica机制了。但是不需要创建segment file,也不需要将数据replica复制到其他的replica shasrd上面去。此时写入的速度会非常快,一旦写完之后,可以将refresh和replica修改回正常的状态。

5、禁止swapping交换内存

可以将swapping禁止掉,有的时候,如果要将es jvm内存交换到磁盘,再交换回内存,大量磁盘IO,性能很差

6、给filesystem cache更多的内存

filesystem cache被用来执行更多的IO操作,如果我们能给filesystem cache更多的内存资源,那么es的写入性能会好很多。

7、使用自动生成的id

如果我们要手动给es document设置一个id,那么es需要每次都去确认一下那个id是否存在,这个过程是比较耗费时间的。如果我们使用自动生成的id,那么es就可以跳过这个步骤,写入性能会更好。对于你的业务中的表id,可以作为es document的一个field。

8、用性能更好的硬件

我们可以给filesystem cache更多的内存,也可以使用SSD替代机械硬盘,避免使用NAS等网络存储,考虑使用RAID 0来条带化存储提升磁盘并行读写效率,等等。

9、index buffer

如果我们要进行非常重的高并发写入操作,那么最好将index buffer调大一些,indices.memory.index_buffer_size,这个可以调节大一些,设置的这个index buffer大小,是所有的shard公用的,但是如果除以shard数量以后,算出来平均每个shard可以使用的内存大小,一般建议,但是对于每个shard来说,最多给512mb,因为再大性能就没什么提升了。es会将这个设置作为每个shard共享的index buffer,那些特别活跃的shard会更多的使用这个buffer。默认这个参数的值是10%,也就是jvm heap的10%,如果我们给jvm heap分配10gb内存,那么这个index buffer就有1gb,对于两个shard共享来说,是足够的了。
相似知识
ElasticSearch性能优化实践(JVM调优+ES调优) 参考知识1近一年内对公司的ELK日志系统做过性能优化,也对SkyWalking使用的ES存储进行过性能优化,在此做一些总结。本篇主要是讲ES在ELK架构中作为日志存储时的性能优化方案。随着接入ELK的
es性能调优 参考知识1elk上线所有应用后,发现日志有延迟现象,少则延迟几分钟,多则延迟半个多小时,查看kafka,发现有大量的消息堆积,于是,我就多增加了几台logstash的机器来消费日志,但是经过观察后,日
2022-02-24-Spark-44(性能调优通用调优) 参考知识1计算负载主要由Executors承担,Driver主要负责分布式调度,调优空间有限,因此对Driver端的配置项我们不作考虑通过如下参数就可以明确有多少CPU资源被划拨给Spark用于分布式
JVM性能调优指南(一) 参考知识1-help-server-client-version-showversion-cp-classpath调整为完全解释执行编译模式:调整为编译执行编译模式:最后一行的mixedmode表明J
北大青鸟设计培训:简单的Java性能调优技巧? 参考知识1  大多数JAVA开发人员理所当然地以为性能优化很复杂,需要大量的经验和知识。好吧,不能说这是完全错误的。  优化应用程序以获得最佳性能不是一件容易的
tomcat 性能调优 参考知识1java性能优化原则:代码运算性能内存回收应用配置(影响java程序注意原因是垃圾回收)代码层优化:避免过多的循环嵌套调用和复杂逻辑Tomcat调优主要内容1.增加最大连接数2.调整工作模式
jvm性能调优都做了啥 JVM是最好的软件工程之一,它为Java提供了坚实的基础,许多流行语言如Kotlin、Scala、Clojure、Groovy都使用JVM作为运行基础。一个专业的Java工程师必须要了解并掌握JVM,
北大青鸟java培训:Java性能调优都有哪些技巧? 参考知识1大多数Java开发人员都认为性能优化是复杂的,需要大量的经验和知识。其实这样的说法是有一定的道理的,一般情况下,优化应用程序以获得最好的性能不是一件容易的事。但这并不意味着如果你没有知识,你