ES03# Elasticsearch性能调优点梳理
引言
本文主要梳理了Elasticsearch集群常见优化点,就一些主要项能够在实践中指导使用,本文主要内容有:
JVM参数调优系统参数调优写性能调优点读性能调优点分片均衡优化案例一、JVM参数调优1.参数设置
修改jvm参数可以通过config/jvm.options.d/jvm.options调整,不建议直接修改config/jvm.options,通过-Xms和-Xmx设置。
-Xms15g-Xmx15g2.参数大小
设置JVM堆内存配置机器内存一半,JVM内存配置不超过32G
备注:参见官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/advanced-configuration.html#set-jvm-options二、系统参数调优1.文件描述符限制1.1 设置最大文件数
设置用户的打开的最多文件数,将account换成实际用户。
命令:vim /etc/security/limits.conf
内容:如下修改
#Endoffileaccountsoftnofile65535accounthardnofile65535*softnofile65535*hardnofile655351.2 查看文件描述符
输入:
GET_nodes/stats/process?filter_path=**.max_file_descriptors
输出:
{"nodes":{"UsN0qcWUTC68THnK0N9wLA":{"process":{"max_file_descriptors":1048576}},//...}
备注:参见官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.htmlhttps://www.elastic.co/guide/en/elasticsearch/reference/current/file-descriptors.html2.关闭系统交换区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让其生效。
vm.swappiness=12.3 锁定地址空间
为了提高数据访问和操作效率,将进程使用的地址空间锁定在物理内存中,防止交换到swap空间。
1.开启内存锁
修改config/elasticsearch.yml中的bootstrap.memory_lock参数
bootstrap.memory_lock:true
2.检查锁是否开启
输入:
GET_nodes?filter_path=**.mlockall
输出:
{"nodes":{"m8c-TdL1RbK1M7goGTCTUQ":{"process":{"mlockall":true}},"-3lP6pM8SHq1-ulpGQybWQ":{"process":{"mlockall":true}},"6HCT0tLPQ7uKoJPnYPlO1A":{"process":{"mlockall":true}}}}
3.给ES用户授权
修改/etc/security/limits.conf,添加如下内容。
#allowuser"elasticsearch"mlockallelasticsearchsoftmemlockunlimitedelasticsearchhardmemlockunlimited
备注:参见官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html3.虚拟内存限制
系统参数max_map_count限制一个进程拥有的虚拟内存数量,默认值为65536。
修改vim /etc/sysctl.conf,添加如下内容,添加后执行sysctl -p让其生效。
vm.max_map_count=262144
备注:参见官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html4.进程数量限制
操作系统对每个用户创建进程的限制, 官方建议为Elasticsearch user至少设置4096,可以调整的更大一些
命令:ulimit -u 655350
或
修改 vim /etc/security/limits.conf
*softnproc6553505.系统优化其他点文件系统缓存会缓存I/O操作,确保至少物理内存的一半使用好的硬件,例如:SSD硬盘单节点数据建议控制在2TB,最大不超过5TB搜索性能要求搞得尽可能SSD,按照1:10配置内存磁盘
备注:参见官方文档
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。
{"index":{"refresh_interval":"30s",}3.增加indexing buffer缓存区
Indexing缓存区用于存储新的document,当缓存区满了后会写入segment落盘,index_buffer_size默认为整个堆内存的10%,min_index_buffer_size指定缓存区允许的最小值,默认为48mb。
修改elasticsearch.yml添加参数
indices.memory.index_buffer_size:30%indices.memory.min_index_buffer_size:96mb4.设置副数量为零
在初始化第一次加载的时候设置副本为0,加载完成后再调整副本数量。如果日志类场景可以考虑将副本设置为0,提升性能的同时会牺牲
可靠性。
{"index":{"number_of_replicas":"0"}}5.使用文档自增ID
如果自己设置文档ID,ElasticSearch会校验在分片中是否重复,避免不必要的校验使用自增ID。
6.分区均衡设置合理的分片数确保均匀分布到所有数据节点上,通过参数index.routing.allocation.total_share_per_node限定每个索引在每个节点上可分配的主分片数,例如等于平均数或者略大于平均数。
{"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超过该值触发flush8.Bulk/线程池/队列设置客户端设置
单个bulk请求体不要太大,官方建议5~15M单个bulk请求超时足够长,建议60s以上写入段尽量将数据轮训到不同的节点,使用负载均衡服务端设置
服务端线程池设置为核数+1队列大小适当增加,也需要注意过大会成为 GC 的负担elasticsearch.yml配置
##ThreadpoolSettings###Searchpoolthreadpool.search.type:fixedthreadpool.search.size:20threadpool.search.queue_size:100#Bulkpoolthreadpool.bulk.type:fixedthreadpool.bulk.size:60threadpool.bulk.queue_size:300#Indexpoolthreadpool.index.type:fixedthreadpool.index.size:20threadpool.index.queue_size:100#Indicessettingsindices.memory.index_buffer_size:30%indices.memory.min_index_buffer_size:96mb#CacheSizesindices.fielddata.cache.size:15%indices.fielddata.cache.expire:6hindices.cache.filter.size:15%indices.cache.filter.expire:6h#IndexingSettingsforWritesindex.refresh_interval:30sindex.translog.flush_threshold_ops:500009.额外优化项
9.1 不检索的字段
只聚合不搜索的字段,index设置为false。
{"mappings":{"properties":{"foo":{"type":"integer","index":false}}}}
9.2 不适用dynamic mapping
对字符串不要使用默认的dynamic mapping,字段数量过多,对性能产生比较大的影响
{"mappings":{"dynamic":false,"properties":{}}}
9.3 关闭_source
关闭_source,减少IO操作
"mappings":{"_source":{"enabled":false}}10.索引示例
{"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":{}}}}
备注:参见官方文档
Indexingbuffersettinghttps://www.elastic.co/guide/en/elasticsearch/reference/current/indexing-buffer.htmlTuneforindexingspeedhttps://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.htmlTunefordiskusagehttps://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,利用缓存机制,减少不必要的算分
备注:参见官方文档
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万/秒。当严重不均衡时,性能不足其一半。
相关阅读
-
世界热推荐:今晚7:00直播丨下一个突破...
今晚19:00,Cocos视频号直播马上点击【预约】啦↓↓↓在运营了三年... -
NFT周刊|Magic Eden宣布支持Polygon网...
Block-986在NFT这样的市场,每周都会有相当多项目起起伏伏。在过去... -
环球今亮点!头条观察 | DeFi的兴衰与...
在比特币得到机构关注之后,许多财务专家预测世界将因为加密货币的... -
重新审视合作,体育Crypto的可靠关系才能双赢
Block-987即使在体育Crypto领域,人们的目光仍然集中在FTX上。随着... -
简讯:前端单元测试,更进一步
前端测试@2022如果从2014年Jest的第一个版本发布开始计算,前端开发... -
焦点热讯:刘强东这波操作秀
近日,刘强东发布京东全员信,信中提到:自2023年1月1日起,逐步为...