Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ES03# Elasticsearch性能调优点梳理

ES03# Elasticsearch性能调优点梳理

作者头像
瓜农老梁
发布于 2022-04-28 00:05:36
发布于 2022-04-28 00:05:36
66800
代码可运行
举报
文章被收录于专栏:瓜农老梁瓜农老梁
运行总次数:0
代码可运行

引言

本文主要梳理了Elasticsearch集群常见优化点,就一些主要项能够在实践中指导使用,本文主要内容有:

  • JVM参数调优
  • 系统参数调优
  • 写性能调优点
  • 读性能调优点
  • 分片均衡优化案例

一、JVM参数调优

1.参数设置

修改jvm参数可以通过config/jvm.options.d/jvm.options调整,不建议直接修改config/jvm.options,通过-Xms和-Xmx设置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-Xms15g
-Xmx15g

2.参数大小

设置JVM堆内存配置机器内存一半,JVM内存配置不超过32G

备注:参见官方文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.elastic.co/guide/en/elasticsearch/reference/current/advanced-configuration.html#set-jvm-options

二、系统参数调优

1.文件描述符限制

1.1 设置最大文件数

设置用户的打开的最多文件数,将account换成实际用户。

命令:vim /etc/security/limits.conf

内容:如下修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# End of file
account soft nofile 65535
account hard nofile 65535
* soft nofile 65535
* hard nofile 65535
1.2 查看文件描述符

输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET _nodes/stats/process?filter_path=**.max_file_descriptors

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "nodes" : {
    "UsN0qcWUTC68THnK0N9wLA" : {
      "process" : {
        "max_file_descriptors" : 1048576
      }
    },
    //...
}

备注:参见官方文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/file-descriptors.html

2.关闭系统交换区

2.1 执行禁用命令

命令:sudo swapoff -a

2.2 设置swappiness

将swappiness设置为1,通常情况下不交换,只在紧急情况允许少量交换。

  • swappiness=0 仅在内存不足的情况下,当剩余空闲内存低于vm.min_free_kbytes limit时,使用交换空间
  • swappiness=1 内核版本3.5及以上、Red Hat内核版本2.6.32-303及以上,进行最少量的交换,而不禁用交换

修改vim /etc/sysctl.conf,添加如下内容,添加后执行sysctl -p让其生效。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vm.swappiness=1
2.3 锁定地址空间

为了提高数据访问和操作效率,将进程使用的地址空间锁定在物理内存中,防止交换到swap空间。

1.开启内存锁

修改config/elasticsearch.yml中的bootstrap.memory_lock参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bootstrap.memory_lock: true

2.检查锁是否开启

输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET _nodes?filter_path=**.mlockall

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "nodes" : {
    "m8c-TdL1RbK1M7goGTCTUQ" : {
      "process" : {
        "mlockall" : true
      }
    },
    "-3lP6pM8SHq1-ulpGQybWQ" : {
      "process" : {
        "mlockall" : true
      }
    },
    "6HCT0tLPQ7uKoJPnYPlO1A" : {
      "process" : {
        "mlockall" : true
      }
    }
  }
}

3.给ES用户授权

修改/etc/security/limits.conf,添加如下内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# allow user 'elasticsearch' mlockall
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited

备注:参见官方文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html

3.虚拟内存限制

系统参数max_map_count限制一个进程拥有的虚拟内存数量,默认值为65536。

修改vim /etc/sysctl.conf,添加如下内容,添加后执行sysctl -p让其生效。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vm.max_map_count=262144

备注:参见官方文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html

4.进程数量限制

操作系统对每个用户创建进程的限制, 官方建议为Elasticsearch user至少设置4096,可以调整的更大一些

命令:ulimit -u 655350

修改 vim /etc/security/limits.conf

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* soft nproc 655350

5.系统优化其他点

  • 文件系统缓存会缓存I/O操作,确保至少物理内存的一半
  • 使用好的硬件,例如:SSD硬盘
  • 单节点数据建议控制在2TB,最大不超过5TB
  • 搜索性能要求搞得尽可能SSD,按照1:10配置内存磁盘

备注:参见官方文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.elastic.co/guide/en/elasticsearch/reference/current/max-number-of-threads.html

三、写性能调优点

1.多线程批量请求

批量写入: 具体一次写入多少document,需要测试给出。例如:建一个索引,单节点单分片,不断调整写入数量测试100,200,800,1000...等

多线程: 需要关注服务端返回的TOO_MANY_REQUESTS (429) 异常

2.增加refresh_interval间隔

写入过程:数据写入时,先保存在Index buffer,满足refresh_interval为间隔时长后,定期清空buffer,生成segment供检索。

增加refresh_interval时长,比如:30秒,可以避免生成过多的segment。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "index": {
    "refresh_interval": "30s",
}

3.增加indexing buffer缓存区

Indexing缓存区用于存储新的document,当缓存区满了后会写入segment落盘,index_buffer_size默认为整个堆内存的10%,min_index_buffer_size指定缓存区允许的最小值,默认为48mb。

修改elasticsearch.yml添加参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
indices.memory.index_buffer_size: 30%
indices.memory.min_index_buffer_size: 96mb

4.设置副数量为零

在初始化第一次加载的时候设置副本为0,加载完成后再调整副本数量。如果日志类场景可以考虑将副本设置为0,提升性能的同时会牺牲

可靠性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "index": {
    "number_of_replicas": "0"
  }
}

5.使用文档自增ID

如果自己设置文档ID,ElasticSearch会校验在分片中是否重复,避免不必要的校验使用自增ID。

6.分区均衡

设置合理的分片数确保均匀分布到所有数据节点上,通过参数index.routing.allocation.total_share_per_node限定每个索引在每个节点上可分配的主分片数,例如等于平均数或者略大于平均数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "index": {
    "routing": {
      "allocation": {
        "total_shards_per_node": "2"
      }
    }
  }
}

7.Translog配置

降低写磁盘的频率

  • Index.translog.durability:事务日志,默认request每次请求都会落盘,修改为async,异步写入
  • index.translog.sync_interval: 设置为60s,每分钟执行一次
  • Index.translog.flush_threshod_size: 默认512M,可以适当调大一些,当translog超过该值触发flush

8.Bulk/线程池/队列设置

客户端设置

  • 单个bulk请求体不要太大,官方建议5~15M
  • 单个bulk请求超时足够长,建议60s以上
  • 写入段尽量将数据轮训到不同的节点,使用负载均衡

服务端设置

  • 服务端线程池设置为核数+1
  • 队列大小适当增加,也需要注意过大会成为 GC 的负担

elasticsearch.yml配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## Threadpool Settings ##

# Search pool
threadpool.search.type: fixed
threadpool.search.size: 20
threadpool.search.queue_size: 100

# Bulk pool
threadpool.bulk.type: fixed
threadpool.bulk.size: 60
threadpool.bulk.queue_size: 300

# Index pool
threadpool.index.type: fixed
threadpool.index.size: 20
threadpool.index.queue_size: 100

# Indices settings
indices.memory.index_buffer_size: 30%
indices.memory.min_index_buffer_size: 96mb

# Cache Sizes
indices.fielddata.cache.size: 15%
indices.fielddata.cache.expire: 6h
indices.cache.filter.size: 15%
indices.cache.filter.expire: 6h

# Indexing Settings for Writes
index.refresh_interval: 30s
index.translog.flush_threshold_ops: 50000

9.额外优化项

9.1 不检索的字段

只聚合不搜索的字段,index设置为false。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "mappings": {
    "properties": {
      "foo": {
        "type": "integer",
        "index": false
      }
    }
  }
}

9.2 不适用dynamic mapping

对字符串不要使用默认的dynamic mapping,字段数量过多,对性能产生比较大的影响

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "mappings": {
    "dynamic": false,
    "properties": {}
  }
}

9.3 关闭_source

关闭_source,减少IO操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"mappings": {  
    "_source": {  
        "enabled": false  
    }
} 

10.索引示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "index": {
    "lifecycle": {
      "name": "xxx_log_store"
    },
    "routing": {
      "allocation": {
        "total_shards_per_node": "2"
      }
    },
    "refresh_interval": "30s",
    "number_of_shards": "30",
    "translog": {
      "sync_interval": "60s",
      "durability": "async"
    },
    "number_of_replicas": "0",
    "mappings": {
      "dynamic": false,
      "properties": {}
    }
  }
}

备注:参见官方文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Indexing buffer setting
https://www.elastic.co/guide/en/elasticsearch/reference/current/indexing-buffer.html
Tune for indexing speed
https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html
Tune for disk usage
https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-disk-usage.html

四、读性能调优点

1.文档建模

  • 避免嵌套类型的数据,查询速度会慢几倍
  • 避免父子类型的数据,查询速度慢几百倍

2.禁用脚本

尽量将数据先行计算,然后保存到ElasticSearch中,避免使用查询脚本Script,可以使用ingest Pipeline并入需要的字段

3.禁用通配符

禁止使用*开头的通配符查询,性能会很差

4.注意分片数量

一个查询访问每一个分片,分片过多,开销增加

5.基于时间的索引

在索引的名字中增加时间信息,按照每天/每周/每月的方式进行划分,将只读的索引进行force merge减少segment的数量

6.使用Filter Context

尽量使用Filter Context,利用缓存机制,减少不必要的算分

备注:参见官方文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html

五、分片均衡优化案例

下面案例中ES集群中有15个节点,索引只有30个主分片,没有设置副本。通过设置total_shards_per_node(每个节点中最多分片数)不同的值,观察主分片在各个节点的均衡情况。

1.没有设置total_shards_per_node

备注:上图为没有设置total_shards_per_node参数,30个分片被分布在5个节点中,节点最多分片8,最少分片2,分片不均衡。

2.设置total_shards_per_node=3

备注:当设置total_shards_per_node=3时,30个分片被分布在14个节点中,节点最多分片数3,最少分片数2,分片比较均衡。

3.设置total_shards_per_node=2

备注:当设置total_shards_per_node=2时,30个分片被分布在15个节点中,每个节点分片数均为2,分片均衡。

4.性能情况

备注:当分片分配均衡时,写入性能也非常高,下图为28.5万/秒。当严重不均衡时,性能不足其一半。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 瓜农老梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【ES三周年】Elasticsearch 索引速度评估与调优
早在去年十一月就看到了腾讯云 ES 三周年征文活动,但仅限内部员工:https://cloud.tencent.com/developer/article/2155081,十二月后终于推出了全量的征文活动:https://cloud.tencent.com/developer/article/2192790
远哥制造
2023/02/17
2.4K0
【ES三周年】Elasticsearch 索引速度评估与调优
一次看完28个关于ES的性能调优技巧,很赞,值得收藏!
因为总是看到很多同学在说Elasticsearch性能不够好、集群不够稳定,询问关于Elasticsearch的调优,但是每次都是一个个点的单独讲,很多时候都是case by case的解答,本文简单梳理下日常的Elasticsearch使用调优,以下仅为自己日常经验之谈,如有疏漏,还请大家帮忙指正。
程序员白楠楠
2020/11/24
3K0
Elasticsearch索引和检索优化与压测监控总结
先来看看es的整体架构图,上面有多个重要模块,今天主要写在lucene上面的index模块与search模块的优化经历,力求简要写出改变了configuration之后,会给es cluster带来什么样的影响。
王知无-import_bigdata
2020/06/11
1.4K0
Elasticsearch深入:数据持久化过程
Elasticsearch 存储的基本单元是shard, ES中一个Index 可能分为多个shard, 事实上每个shard 都是一个Lucence 的Index,并且每个Lucence Index 由多个Segment组成, 每个Segment事实上是一些倒排索引的集合, 每次创建一个新的Document, 都会归属于一个新的Segment, 而不会去修改原来的Segment; 且每次的文档删除操作,会仅仅标记Segment中该文档为删除状态,而不会真正的立马物理删除, 所以说ES的index 可以理解为一个抽象的概念。
HLee
2020/12/28
4.5K0
Elasticsearch深入:数据持久化过程
好奇?!Elasticsearch 25 个必知必会的默认值
技术交流群中有小伙伴提及:“es 节点默认1000 个分片的限制”?这引发了我对Elasticsearch 默认值的关注。
铭毅天下
2020/06/04
7.4K1
Elasticsearch性能优化实战指南
在当今世界,各行各业每天都有海量数据产生,为了从这些海量数据中获取想要的分析结果,需要对数据进行提取、转换,存储,维护,管理和分析。 这已然远远超出了普通处理工具、数据库等的实现能力,只有基于的分布式架构和并行处理机制的大数据工具所才能实现这些功能。 Elasticsearch是响应如前所述大多数用例的最热门的开源数据存储引擎之一。
铭毅天下
2019/07/31
1.8K0
Elasticsearch API汇总
描述:health是一个简洁的,一行表示了来自/_cluster/health的相同的信息。
HLee
2020/12/28
1.2K0
Elasticsearch API汇总
【Elasticsearch系列之四】腾讯云ES数据基本操作
注意:本教程提供的示例代码仅适用于腾讯云Elasticsearch 7.x版本,不确定是否适用于其他版本,其他版本的示例代码请参见官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-index_.html
Vicwan
2020/04/21
1.8K0
Elasticsearch高级调优方法论之——根治慢查询!
Elasticsearch是非常灵活且功能丰富的搜索引擎,它提供了许多不同查询数据的方法。在实战业务场景中,经常会出现远远低于预期查询速度的慢查询。作为分布式系统的Elasticsearch,可能有各种影响查询性能的因素,包括外部因素,如负载均衡设置,网络延迟(带宽,NIC卡/驱动程序)等。
猿天地
2019/10/09
5.3K0
Elasticsearch高级调优方法论之——根治慢查询!
Elasticsearch调优实践
本文基于ES 5.6.4,从性能和稳定性两方面,从linux参数调优、ES节点配置和ES使用方式三个角度入手,介绍ES调优的基本方案。当然,ES的调优绝不能一概而论,需要根据实际业务场景做适当的取舍和调整,文中的疏漏之处也随时欢迎批评指正。
技术姐
2018/07/04
13.9K3
Elasticsearch调优实践
ES运维实战之系统性能调优
文件句柄 Linux中,每个进程默认打开的最大文件句柄数是1000,对于服务器进程来说,显然太小,通过修改/etc/security/limits.conf来增大打开最大句柄数
大数据真好玩
2020/11/03
9690
ElasticSearch优化系列三:索引过程
大家可能会遇到索引数据比较慢的过程。其实明白索引的原理就可以有针对性的进行优化。ES索引的过程到相对Lucene的索引过程多了分布式数据的扩展,而这ES主要是用tranlog进行各节点之间的数据平衡。所以从上我可以通过索引的settings进行第一优化: "index.translog.flush_threshold_ops":"10000" "refresh_interval" : "1s" 这两个参数第一是到translog数据达到多少条进行平衡,默认为5000,而这个过程相对而言是比较浪费时间和资
用户1332428
2018/03/09
1.3K0
ElasticSearch-7.10 参考手册
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
马说
2021/06/30
5.7K0
ElasticSearch-7.10 参考手册
Elasticsearch JVM 堆内存使用率飙升,怎么办?
这是系列文章的第四篇,主要探讨:Elasticsearch JVM 堆内存使用率飙升,怎么办?
铭毅天下
2022/04/06
3.8K0
Elasticsearch JVM 堆内存使用率飙升,怎么办?
ES配置详解和主从搭建
配置详细 ##################### Elasticsearch Configuration Example ##################### # # 只是挑些重要的配置选项进行注释,其实自带的已经有非常细致的英文注释了! # https://www.elastic.co/guide/en/elasticsearch/reference/current/modules.html # ################################### Cluster #####
付威
2020/01/21
4.9K0
Elasticsearch调优实践
背景 Elasticsearch(ES)作为NOSQL+搜索引擎的有机结合体,不仅有近实时的查询能力,还具有强大的聚合分析能力。因此在全文检索、日志分析、监控系统、数据分析等领域ES均有广泛应用。而完整的Elastic Stack体系(Elasticsearch、Logstash、Kibana、Beats),更是提供了数据采集、清洗、存储、可视化的整套解决方案。  本文基于ES 5.6.4,从性能和稳定性两方面,从linux参数调优、ES节点配置和ES使用方式三个角度入手,介绍ES调优的基本方案。当然,ES
腾讯技术工程官方号
2018/07/12
3.7K1
干货 | Elasticsearch开发人员最佳实战指南
几个月以来,我一直在记录自己开发Elasticsearch应用程序的最佳实践。本文梳理的内容试图传达Java的某些思想,我相信其同样适用于其他编程语言。我尝试尽量避免重复教程和Elasticsearch官方文档中已经介绍的内容。本文梳理的内容都是从线上实践问题和个人总结的经验汇总得来的。
铭毅天下
2020/04/08
1.7K0
干货 | Elasticsearch开发人员最佳实战指南
Elasticsearch 6.x版本全文检索学习之集群调优建议
https://www.elastic.co/guide/en/elasticsearch/reference/6.7/setup.html
别先生
2019/11/14
5910
CentOS下 elasticsearch集群安装
4.修改/root/elasticsearch-node3/config/elasticsearch.yml 为如下内容(注意红色部分为三个节点不一致的地方)
肖哥哥
2018/08/02
6520
CentOS下 elasticsearch集群安装
万文Elasticsearch巧妙的架构详解
本书作为 Elastic Stack 指南,关注于 Elasticsearch 在日志和数据分析场景的应用,并不打算对底层的 Lucene 原理或者 Java 编程做详细的介绍,但是 Elasticsearch 层面上的一些架构设计,对我们做性能调优,故障处理,具有非常重要的影响。
大数据老哥
2022/02/17
7600
万文Elasticsearch巧妙的架构详解
相关推荐
【ES三周年】Elasticsearch 索引速度评估与调优
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验