ElasticSearch:堆大小与swap设置

19 篇文章 0 订阅
18 篇文章 1 订阅

译自ES官方对于JVM参数的建议,原文见: https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html



堆空间的配置方法

ElasticSearch的默认设置中,给服务分配了1GB的堆空间。对于大多数实例来说,这个值都太小了。如果你使用默认的堆空间大小,那么你的集群配置是有问题的。

有两种方式可以修改ElasticSearch的堆大小。最容易的一种就是设置一个叫 ES_HEAP_SIZE 的环境变量。当系统服务启动时,它会读到这个环境变量并将它应用于堆。

你可以执行以下命令行:

export ES_HEAP_SIZE=10g

还有另一种方式,你可以在启动ElasticSearch的命令上带参数,如果觉得这样更方便的话:

./bin/elasticsearch -Xmx10g -Xms10g 

一般来说,如果你不需要特别设置-Xmx和-Xms的话,比较推荐使用ES_HEAP_SIZE环境变量。

把内存留一半给Lucene

有一个常见的现象:给堆分配太大空间了。比如说你有一台64GB的机器——这已经是让人赞叹的配置,而你想把这64GB的内存全部给ElasticSearch。越多越好不是吗?

对于ElasticSearch来说,堆空间很重要。它用到很多内存中的数据结构来保证应用的快速响应。但是,ElasticSearch中有一个很重要的部分是不用堆内存的:Lucene。

Lucene在设计上主要使用了基于底层操作系统内存的数据结构。Lucene段(segment)就保存在各个文件中。因为段是不可变的,这些文件永远不会改变。这非常有利于使用内存来缓存,底层操作系统乐于将经常被访问的段放在内存里来加快访问速度。

Lucene的性能依赖于与操作系统的这种互动。如果你把所有的可用内存都给了ElasticSearch对,留给Lucene的内存就不够了。这将严重影响全文搜索的性能。

标准建议是:50%的可用内存给ElasticSearch堆,剩下的50%保持自由——它们不会闲置,Lucene会愉快地吞噬掉这些留下来的内存。

别超过32GB!

不分配过于庞大的堆空间给ElasticSearch还有另一个原因。如我们所知,JVM的对象指针压缩只能在堆小于32GB的场景下使用

在Java中,所有的对象都在堆中分配,并通过一个指针引用。普通对象指针(OOP - Ordinary object pointers)会指向这些对象,指针的长度是CPU的本地字长:32bit或64bit,这取决于处理器。引用指针里存储的是一个确切的内存地址。

在32位操作系统中,这意味这堆的最大大小是4GB。对于64位系统来说,堆可以很大,但是64位指针意味着会占用更多的空间,因为指针长度更长了。比浪费空间更糟糕的是,更长的指针在主存储和高速缓存之间移动时,需要占用更大的带宽(LLC,L1等等)。

Java使用了一种被称为压缩指针的方法来解决这个问题。压缩指针指的是,不再用指针指向内存中的精确地址,而是将引用指向一个对象偏移量(object offsets)。这意味着一个32位的指针可以指向40亿的对象,而不是40亿位(byte)。最终,这意味着在指针压缩的情况下,堆依然采用32位指针,但允许增长到32GB的物理大小。

一旦超过了这个神奇的30-32GB的边界,指针会切换会普通对象指针(oop)。指针的大小增长,更多的CPU至内存带宽使用,你在大量的损失调有效内存。实际上,一个40至50GB的堆相当于一个32GB的使用了引用压缩的堆。

这个故事的寓意是:即使你有空闲的内存,也尽量避免越过32GB的堆边界。这会浪费内存,降低CPU性能,并让GC和大堆做斗争。

swap(交换区)是性能终结者

这应该显而易见了,但仍然需要明确的写出来:把内存换成硬盘将毁掉服务器的性能,想象一下:涉及内存的操作是需要快速执行的。如果介质从内存变为了硬盘,一个10微秒的操作变成需要10毫秒。而且这种延迟发生在所有本该只花费10微秒的操作上,就不难理解为什么交换区对于性能来说是噩梦。

最好的选择是禁用掉操作系统的交换区。可以用以下命令:

sudo swapoff -a

来禁用,你可能还需要编辑/etc/fstab文件。细节可以参考你的操作系统文档。

如果实际环境不允许禁用掉swap,你可以尝试降低swappiness。此值控制操作系统使用交换区的积极性。这可以防止在正常情况下使用交换区,但仍允许操作系统在紧急情况下将内存里的东西放到交换区。

对于大多数Linux系统来说,这可以用sysctl值来配置:

vm.swappiness = 1

* 将此值配置为1会比0好,在kernal内核的某些版本中,0可能会引起OOM异常。

最后,如果两种方法都不可用,你应该在ElasticSearch的配置中启用mlockall.file。这允许JVM锁定其使用的内存,而避免被放入操作系统交换区。

在elasticsearch.yml中,做如下设置:

bootstrap.mlockall: true

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch是一个开源的分布式搜索和分析引擎,它是基于Apache Lucene库构建的。它被设计用于处理大规模数据集的快速搜索和分析,并具有高可靠性和可扩展性。 以下是关于Elasticsearch 6.5的一些主要特性和功能: 1. 分布式架构:Elasticsearch使用分布式架构,可以在多个节点上存储和处理数据。这使得它能够处理大规模数据集,并提供高可用性和容错能力。 2. 实时搜索:Elasticsearch提供实时搜索功能,可以在毫秒级别内返回搜索结果。它使用倒排索引来加速搜索操作,并支持复杂的查询和过滤。 3. 多种数据类型支持:Elasticsearch支持多种数据类型,包括文本、数字、日期、地理位置等。它可以根据数据类型进行索引和搜索,并提供各种数据处理功能。 4. 分布式文档存储:Elasticsearch使用JSON格式来存储文档,并将其分布在多个节点上。每个文档都有一个唯一的ID,可以通过ID进行检索和更新。 5. 强大的查询语言:Elasticsearch提供丰富的查询语言,可以进行全文搜索、精确匹配、范围查询、聚合等操作。它还支持模糊搜索、拼写纠正和近似匹配等功能。 6. 实时分析和聚合:Elasticsearch可以对大规模数据集进行实时分析和聚合操作。它支持各种聚合函数,如求和、平均值、最大值、最小值等,并提供可视化工具来展示分析结果。 7. 可扩展性和高可用性:Elasticsearch可以轻松地水平扩展,通过添加更多的节点来处理更大的数据集。它还支持数据复制和故障转移,以确保数据的高可用性和可靠性。 8. 插件生态系统:Elasticsearch拥有丰富的插件生态系统,可以扩展其功能。这些插件可以用于数据导入、数据可视化、安全认证等方面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值