ElasticSearch Index 速度优化 (官方翻译)
使用Bulk请求进行Index
- Bulk请求将产生比单文档index请求有更好的性能。至于Bulk请求中文档数量的大小,建议使用单一节点单一分片进行测试,先试试看100个,然后200个,然后400这样,每次进行翻倍测试,只要速度稳定了,也就是最合适的大小了。但是要注意一下,并不是速度最合适了就OK,因为每次请求总的大小要进行一下控制。并发发送的时候,ES内存压力会很大,一定要避免每次请求超过几十兆,即便是这样插入的性能更好(这个我踩过坑,我这测试超过10M,ES就不接受请求,直接拒绝了)。
使用多个节点或者多线程进行Index
- 一般来说一个线程,即便是使用了Bulk方式进行Index,也无法达到ES集群的瓶颈,所以为了最大限度的利用集群资源,使用多线程或者多进程的方式进行Index是一个很好的选择。这样不仅最大程度利用了集群资源,还帮助减少了fsync的成本。(这个fsync是什么 意思我暂时也没弄明白,后续补充)。
- 要注意一下TOO_MANY_REQUESTS (429) 相应(对应Java Client 则是EsRejectedExecutionException), 这说明ES集群已经跟不上你Index的速度了,使用一些适当的方式限制一下速度吧。(官方文档说暂停Index一会或者使用随机指数函数Backoff)。
- 类似Bulk Index 数量,多线程多进程Index也需要进行人工测试,直到找到一个合适线程数或者进程数。
增加refresh interval
- 默认的 index.refresh_interval 是1s,在index的时候如果没有实时性检索需求,建议可以设置大一些,比如30S,如果不需要检索,等index完成才进行检索的话,可以设置为-1,也就是禁用,等完成index之后在调整回来。
禁用refresh,降低分片副本数
- 如果需要一次index大量数据,最好禁用refresh,也就是将refresh_interval设置为-1,同时index.number_of_replicas 设置为0,也就是不需要副本。尽管这样会增加一些风险(真的很小很小),也就是在索引的时候可能导致数据丢失,但是这样可以大幅度增加索引速度,等完成索引后在增加副本,这样也可以保证数据的可靠性。
禁用Swapping
- 一定确保操作系统禁用了swapping,这对ES性能有很大的提升。
给足够的内存文件系统缓存
- 你应该分配机器的一半内存给ES使用,用于文件系统的缓存。文件系统缓存用于缓冲I/O操作。
使用系统自动生成id
- 当你index一个document使用特定的id,ES需要去检查是否在同一个shard存在相同的ID的文档,这是一个相当昂贵的操作,并且随着文档数量的增加,花费呈指数增长。如果使用自动生成id,ES会跳过这个检查,使得Index速度更快。
使用更快的硬件
- 如果I/O是瓶颈,那么最好考虑为文件系统提供更多内存或者购买更好的服务器。使用SSD硬盘能比一般的硬盘有更好的性能。另外尽量使用本地存储,不要考虑远程存储。也尽可能不要考虑Amazon等虚拟化存储,尽管比较简单的使用,但是性能比本地存储差很多。
- 还有要尽可能冗余副本,以避免节点故障导致数据丢失。也可以用快照备份还原进一步降低数据糗事风险。
Indexing 缓冲大小
如果节点仅仅是大量Index,确保每个分片 indices.memory.index_buffer_size 大于512M,(尽管大于512M没有什么性能改善)。举个例子,默认值是10%,也是说如果你设置的jvm大小是10G,那么Index缓冲大小是1G,足以支撑2个shard的大量索引。
禁用 _field_names
- 简单来说,如果你不需要运行exists查询,那么你就可以禁用_field_names。
ElasticSearch Index 速度优化 (官方翻译)的更多相关文章
- Elasticsearch 调优之 搜索速度优化
本章讨论搜索速度优化:搜索速度与系统资源.数据索引方式.查询方式等多方面 1.为文件系统cache预留足够的内存 1)应用程序一般情况下,读写都会被操作系统“cache” 2)cache保存在物理内存 ...
- Elasticsearch 集群优化-尽可能全面详细
Elasticsearch 集群优化-转载参考1 基本配置 基本配置,5台配置为 24C 125G 17T 的主机,每台主机上搭建了一个elasticsearch节点. 采用的elasticsearc ...
- Tone Mapping算法系列二:一种自适应对数映射的高对比度图像显示技术及其速度优化。
办公室今天停电,幸好本本还有电,同事们好多都去打麻将去了,话说麻将这东西玩起来也还是有味的,不过我感觉我是输了不舒服,赢了替输的人不舒服,所以干脆拜别麻坛四五年了,在办公室一个人整理下好久前的一片论文 ...
- dWebpack编译速度优化实战
当你的应用的规模还很小时,你可能不会在乎Webpack的编译速度,无论使用3.X还是4.X版本,它都足够快,或者说至少没让你等得不耐烦.但随着业务的增多,嗖嗖嗖一下项目就有上百个组件了,也是件很简单的 ...
- [转]Asp.net mvc 网站之速度优化 -- 页面缓存
网站速度优化的一般方法 由于网站最重要的用户体验就是速度,特别是对于电子商务网站而言. 一般网站速度优化会涉及到几个方面: 1. 数据库优化 — 查询字段简历索引,使用数据库连接池和持久化,现在还有种 ...
- 记一次cocos项目的加载速度优化
半个月前,我们用cosos creator做了一个简单的小游戏,也许算不上小游戏吧..一边学cocos,一边做,几经波折后终于上线了.然鹅,功能是实现了,但是加载速度十分感人(毕竟没经验嘛,无辜脸). ...
- Asp.net mvc 网站之速度优化 -- 页面缓存
网站速度优化的一般方法 由于网站最重要的用户体验就是速度,特别是对于电子商务网站而言. 一般网站速度优化会涉及到几个方面: 1. 数据库优化 — 查询字段简历索引,使用数据库连接池和持久化,现在还有种 ...
- web访问速度优化分析
请求从发出到接收完成一共经历了DNS Lookup.Connecting.Blocking.Sending.Waiting和Receiving六个阶段,时间共计38ms.请求完成之后是DOM加载和页面 ...
- ST官方翻译的中文应用笔记汇总
ST官方翻译的中文应用笔记汇总 http://www.51hei.com/stm32/3382.html 官方中文AN:AN3116:STM32? 的 ADC 模式及其应用AN1015:用于提高微控制 ...
随机推荐
- ROS_Kinetic_03 ROS入门向导
ROS_Kinetic_03 ROS入门向导 每个人都有不同的学习习惯和爱好并针对不同的应用进行ROS相关设计与开发, 没有固定不变的学习模式,但以下的内容是通常都会用到的. 1. ROS基础教程 1 ...
- xml解析方式之JAXP解析入门
XML解析 1 引入 xml文件除了给开发者看,更多的情况使用[程序读取xml文件]的内容.这叫做xml解析 2 XML解析方式(原理不同) DOM解析 SAX解析 3 XML解析工具 DOM解析原理 ...
- (NO.00002)iOS游戏精灵战争雏形(八)
子弹的初始化工作前2篇基本做好了,下面就是如何射出子弹. 通常来说,子弹射向目标对象,需要走一条直线.直线由2点定位,分别为发射点和目标点. 发射点就是开枪精灵自身的位置,目标点则为敌方精灵的位置,大 ...
- MinerBean.java 数据库表 miner bean
MinerBean.java 数据库表 miner bean package com.iteye.injavawetrust.miner; import java.util.Date; /** * 数 ...
- C++对象模型(二):The Semantics of Copy Constructors(拷贝构造函数之编译背后的行为)
本文是 Inside The C++ Object Model's Chapter 2 的部分读书笔记. 有三种情况,需要拷贝构造函数: 1)object直接为另外一个object的初始值 2)ob ...
- shell中的wait
cat test1 | uniq > newtest1 & cat test2 | uniq > newtest2 & wait diff newtest1 newtest ...
- spring揭秘 读书笔记 六 bean的一生
我们知道,Spring容器具有对象的BeanDefinition来保存该对象实例化时需要的数据. 对象通过container.getBean()方法是才会初始化该对象. BeanFactory 我们知 ...
- c语言和java的区别
今晚读了一下c程序设计语言,这是一本经典书籍,发现C语言和java有很多是相同的,毕竟java是由c语言进化来的. 我大概从我自己的思考来谈谈不同点 1.c语言是面向过程,主要单位是函数,变量和函数的 ...
- Logistic Regression求解classification问题
classification问题和regression问题类似,区别在于y值是一个离散值,例如binary classification,y值只取0或1. 方法来自Andrew Ng的Machine ...
- 《java入门第一季》之面向对象this关键字
/* 起名字要做到见名知意. this:是当前类的对象引用.简单的记,它就代表当前类的一个对象. 注意:谁调用这个方法,在该方法内部的this就代表谁. this的场景: 解决局部变量隐藏成员变量 * ...