`
weitao1026
  • 浏览: 1054011 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Elasticsearch内存分配设置详解

 
阅读更多

Elasticsearch默认安装后设置的内存是1GB,对于任何一个现实业务来说,这个设置都太小了。如果你正在使用这个默认堆内存配置,你的集群配置可能会很快发生问题。
 
这里有两种方式修改Elasticsearch的堆内存(下面就说内存好了),最简单的一个方法就是指定ES_HEAP_SIZE环境变量。服务进程在启动时候会读取这个变量,并相应的设置堆的大小。设置命令如下:

export ES_HEAP_SIZE=10g

此外,你也可以通过命令行参数的形式,在程序启动的时候把内存大小传递给它:

./bin/elasticsearch -Xmx10g -Xms10g

备注:确保Xmx和Xms的大小是相同的,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源,可以减轻伸缩堆大小带来的压力。
一般来说设置ES_HEAP_SIZE环境变量,比直接写-Xmx10g  -Xms10g更好一点。

把内存的一半给Lucene


一个常见的问题是配置一个大内存,假设你有一个64G内存的机器,按照正常思维思考,你可能会认为把64G内存都给Elasticsearch比较好,但现实是这样吗, 越大越好?
 
当然,内存对于Elasticsearch来说绝对是重要的,用于更多的内存数据提供更快的操作,而且还有一个内存消耗大户-Lucene。
 
Lucene的设计目的是把底层OS里的数据缓存到内存中。Lucene的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问。
 
Lucene的性能取决于和OS的交互,如果你把所有的内存都分配给Elasticsearch,不留一点给Lucene,那你的全文检索性能会很差的。
 
最后标准的建议是把50%的内存给elasticsearch,剩下的50%也不会没有用处的,Lucene会很快吞噬剩下的这部分内存用于文件缓存。

不要超过32G


这里有另外一个原因不分配大内存给Elasticsearch,事实上jvm在内存小于32G的时候会采用一个内存对象指针压缩技术。
 
在java中,所有的对象都分配在堆上,然后有一个指针引用它。指向这些对象的指针大小通常是CPU的字长的大小,不是32bit就是64bit,这取决于你的处理器,指针指向了你的值的精确位置。
 
对于32位系统,你的内存最大可使用4G。对于64系统可以使用更大的内存。但是64位的指针意味着更大的浪费,因为你的指针本身大了。浪费内存不算,更糟糕的是,更大的指针在主内存和缓存器(例如LLC, L1等)之间移动数据的时候,会占用更多的带宽。
 
Java 使用一个叫内存指针压缩的技术来解决这个问题。它的指针不再表示对象在内存中的精确位置,而是表示偏移量。这意味着32位的指针可以引用40亿个对象,而不是40亿个字节。最终,也就是说堆内存长到32G的物理内存,也可以用32bit的指针表示。
 
一旦你越过那个神奇的30-32G的边界,指针就会切回普通对象的指针,每个对象的指针都变长了,就会使用更多的CPU内存带宽,也就是说你实际上失去了更多的内存。事实上当内存到达40-50GB的时候,有效内存才相当于使用内存对象指针压缩技术时候的32G内存。
 
这段描述的意思就是说:即便你有足够的内存,也尽量不要超过32G,因为它浪费了内存,降低了CPU的性能,还要让GC应对大内存。

1TB内存的机器


32GB是ES一个内存设置限制,那如果你的机器有很大的内存怎么办呢?现在的机器内存普遍增长,你现在都可以看到有300-500GB内存的机器。

首先,我们建议编码使用这样的大型机
其次,如果你已经有了这样的机器,你有两个可选项:

  • 你主要做全文检索吗?考虑给Elasticsearch 32G内存,剩下的交给Lucene用作操作系统的文件系统缓存,所有的segment都缓存起来,会加快全文检索。

  • 你需要更多的排序和聚合?你希望更大的堆内存。你可以考虑一台机器上创建两个或者更多ES节点,而不要部署一个使用32+GB内存的节点。仍然要 坚持50%原则,假设 你有个机器有128G内存,你可以创建两个node,使用32G内存。也就是说64G内存给ES的堆内存,剩下的64G给Lucene。

如果你选择第二种,你需要配置cluster.routing.allocation.same_shard.host:true。这会防止同一个shard的主副本存在同一个物理机上(因为如果存在一个机器上,副本的高可用性就没有了)。

 

swapping是性能的坟墓


这是显而易见的,但是还是有必要说的更清楚一点,内存交换到磁盘对服务器性能来说是致命的。想想看一个内存的操作必须是快速的。
 
 
如果内存交换到磁盘上,一个100微秒的操作可能变成10毫秒,再想想那么多10微秒的操作时延累加起来。不难看出swapping对于性能是多么可怕。
 
最好的办法就是在你的操作系统中完全禁用swapping。这样可以暂时禁用:

swapoff -a

为了永久禁用它,你可能需要修改/etc/fstab文件,这要参考你的操作系统相关文档。
 
如果完全禁用swap,对你来说是不可行的。你可以降低swappiness 的值,这个值决定操作系统交换内存的频率。这可以预防正常情况下发生交换。但仍允许os在紧急情况下发生交换。
 
对于大部分Linux操作系统,可以在sysctl 中这样配置:

vm.swappiness = 1

备注:swappiness设置为1比设置为0要好,因为在一些内核版本,swappness=0会引发OOM(内存溢出)

简单地说这个参数定义了系统对swap的使用倾向,默认值为60,值越大表示越倾向于使用swap。可以设为0,这样做并不会禁止对swap的使用,只是最大限度地降低了使用swap的可能性。

通过sysctl -q vm.swappiness可以查看参数的当前设置。

修改参数的方法是修改/etc/sysctl.conf文件,加入vm.swappiness=xxx,并重起系统。这个操作相当于是修改虚拟系统中的/proc/sys/vm/swappiness文件,将值改为XXX数值。

如果不想重起,可以通过sysctl -p动态加载/etc/sysctl.conf文件,但建议这样做之前先清空swap。


 
最后,如果上面的方法都不能做到,你需要打开配置文件中的mlockall开关,它的作用就是运行JVM锁住内存,禁止OS交换出去。在elasticsearch.yml配置如下:

bootstrap.mlockall: true
分享到:
评论

相关推荐

    Elasticsearch 8.1.2 Linux版本

    3. **修改配置文件**:主要修改`elasticsearch.yml`,包括设置节点名称、集群名称、数据路径、内存分配等。 4. **启动服务**:使用`./bin/elasticsearch`启动Elasticsearch服务,或者通过systemd进行系统化管理。 ...

    elasticsearch-head插件

    **Elasticsearch-Head插件详解** Elasticsearch-Head是一款非常实用的Elasticsearch管理工具,它以Web界面的形式提供了对Elasticsearch集群的可视化监控和管理功能。这款插件设计简洁,易于使用,可以帮助用户更好...

    elasticsearch-5.6.4-head.tar

    2. **内存分配**:根据服务器资源合理调整Elasticsearch的内存分配,避免因内存不足导致的性能问题。 3. **插件兼容性**:确保安装的插件与Elasticsearch版本兼容,否则可能会引发运行时错误或不稳定行为。 4. **...

    ElasticSearch----Elasticsearch服务器开发2.0.zip

    **Elasticsearch——分布式搜索引擎开发详解** Elasticsearch(简称ES)是一款强大的开源分布式全文搜索引擎,基于Lucene库,但提供了更高级别的API和管理功能。它被广泛应用于日志分析、实时监控、数据搜索等领域...

    elasticsearch5-head安装

    3. **修改配置**: 在`config/elasticsearch.yml`文件中,根据实际需求进行配置,如设置集群名称、节点角色、内存分配等。 4. **启动Elasticsearch**: 执行`bin/elasticsearch`(Windows系统可能为`bin\elastic...

    ElasticSearch 安装资源

    - **内存要求**:Elasticsearch需要足够的内存运行,推荐至少分配512MB的堆内存给每个节点,生产环境中建议更多。 - **权限设置**:确保Elasticsearch目录和文件的权限设置正确,避免因权限问题导致无法启动。 - **...

    elasticsearch-2.4.6-安装后

    **Elasticsearch 2.4.6 安装与配置详解** Elasticsearch 是一个开源的、分布式的全文搜索引擎,以其高效、灵活和强大的搜索功能而受到广大开发者的青睐。在2.4.6版本中,它提供了稳定性和性能的优化,是许多企业级...

    ElasticSearch.zip

    **Elasticsearch 入门详解** Elasticsearch(简称 ES)是一种基于 Lucene 的开源全文搜索引擎,被广泛应用于大数据分析、日志收集、实时搜索等领域。它的设计目标是分布式、可扩展、高可用且易用,支持RESTful API...

    elasticsearch-analysis-ik-7.8.0.zip

    Elasticsearch 分析插件——IK 分析器详解 Elasticsearch 是一款强大的开源搜索引擎,广泛应用于全文检索、数据分析等领域。在处理中文数据时,由于中文词汇的复杂性,需要一个有效的中文分词器来进行文本预处理。...

    elasticSearch

    为了提高 Elasticsearch 的性能,需要关注索引设置,比如分片数量、副本数量、内存分配等。此外,合理的字段映射和分析器选择也是提升搜索效率的关键。 **7. 安全与监控** Elasticsearch 提供了 X-Pack 插件,包含...

    elasticsearch-head

    **Elasticsearch-Head 插件详解** Elasticsearch 是一款功能强大的开源搜索引擎,它提供了分布式、全文检索、实时分析的存储与检索解决方案。而 `elasticsearch-head` 是一个非常实用的Elasticsearch管理界面插件,...

    ElasticSearch的Head插件

    **Elasticsearch Head 插件详解** Elasticsearch(简称ES)是一款强大的开源搜索引擎,广泛应用于数据检索、分析和可视化。为了便于管理和监控ES集群,开发者们开发了一系列的工具,其中"Head插件"就是其中之一,它...

    elasticsearch-7.8.0版本windows版本安装包

    4. 修改配置文件:打开 `config/elasticsearch.yml`,根据实际需求修改配置,如设置节点名称、内存分配、网络绑定地址等。 5. 启动服务:双击 `bin\elasticsearch.bat` 或通过命令行运行来启动Elasticsearch。注意,...

    elasticsearch浏览器插件

    **Elasticsearch浏览器插件详解** Elasticsearch是一款开源、分布式、实时的搜索与数据分析引擎,广泛应用于大数据处理和搜索引擎领域。随着版本的更新,它提供了更强大的功能和更高的性能,而“elasticsearch...

    elasticsearch6.4windows版本

    3. **配置**:打开解压后的配置文件`elasticsearch.yml`,根据你的需求调整设置,如内存分配、网络绑定等。 4. **运行**:启动Elasticsearch服务,可以通过命令行进入解压目录的bin目录,然后运行`elasticsearch....

    elasticsearch-6.8.6.zip

    《Elasticsearch 6.8.6:Windows版详解与应用》 Elasticsearch(简称ES)是一款基于Lucene的开源搜索引擎,以其分布式、实时、全文检索、高可扩展性等特性,在大数据处理和实时分析领域广泛应用。在本文中,我们将...

    Elasticsearch-7.6.1安装包

    - **内存设置**:确保 Elasticsearch 能够正确分配内存,避免 OutOfMemoryError: ```yaml bootstrap.memory_lock: true ``` - **安全设置**:在生产环境中,推荐启用安全认证: ```yaml xpack.security....

    ElasticSearch2.0安装 & 1.7.2升级日志

    根据服务器硬件情况适当调整内存分配,一般推荐分配给 Elasticsearch 的内存为服务器物理内存的一半。 - **示例命令**: ```bat set ES_JAVA_OPTS=-Xms2g -Xmx2g ``` 这里 `-Xms2g` 和 `-Xmx2g` 表示最小和最大...

    elasticsearch实战源码 (黄申译)

    **Elasticsearch实战源码详解** Elasticsearch是一款开源的、分布式的全文搜索引擎,由Java编写,设计用于处理海量数据的快速检索。黄申翻译的《Elasticsearch实战》一书,深入浅出地介绍了Elasticsearch的核心概念...

Global site tag (gtag.js) - Google Analytics