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

Elasticsearch 合理内存分配

 
阅读更多

Elasticsearch默认安装后设置的内存是1GB,对于任何一个业务部署来说,这个都太小了。如果你正在使用这些默认堆内存配置,你的集群配置可能有点问题。

这里有两种方式修改Elasticsearch的堆内存(下面就说内存好了),最简单的一个方法就是指定ES_HEAP_SIZE环境变量。服务进程在启动时候会读取这个变量,并相应的设置堆的大小。举例,你可以用下面的命令设置它

export ES_HEAP_SIZE=10g

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

./bin/elasticsearch -Xmx10g -Xms10g

备注:确保Xmx和Xms的大小是相同的,防止程序在运行时改变大小,这个是很废的。

一般来说设置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的线是很很重要的,那如果你的机器有很大的内存怎么办呢?现在的机器内存普遍增长,你现在都可以看到有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。这样可以暂时禁用:
sudo swapoff -a

为了永久禁用它,你可能需要修改/etc/fstab文件,这要参考你的操作系统相关文档。

如果完全禁用swap,对你来说是不可行的。你可以降低swappiness 的值,这个值决定操作系统交换内存的频率。这可以预防正常情况下发生交换。但仍允许os在紧急情况下发生交换。

对于大部分Linux操作系统,可以在sysctl 中这样配置:
vm.swappiness = 1
备注:swappiness设置为1比设置为0要好,因为在一些内核版本,swappness=0会引发OOM(内存溢出)

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

参考地址:https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html.

 

http://my.oschina.net/TOW/blog/598702

分享到:
评论

相关推荐

    elasticsearch服务器安装包

    12. **性能优化**:Elasticsearch的性能受硬件、内存分配、索引设置等因素影响。优化包括调整heap大小、使用合适的数据类型、合理分配分片等。 13. **备份与恢复**:可以使用Elasticsearch的 `_snapshot` API进行...

    Elasticsearch 8.1.2 Linux版本

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

    elasticsearch-5.6.4-head.tar

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

    最新版windows elasticsearch-8.1.1-windows-x86_64.zip

    - 解压“elasticsearch-8.1.1-windows-x86_64.zip”到任意目录,创建`config`目录下的`elasticsearch.yml`配置文件,调整内存分配、网络设置等。 - 配置`jvm.options`以调整JVM参数,如堆内存大小。 - 修改`...

    最完整的Elasticsearch 基础教程

    - 下载并解压Elasticsearch,根据系统环境配置相关参数,如内存分配、网络设置等。 - 启动服务,通过浏览器访问`http://localhost:9200`进行健康检查。 4. **索引管理** - 创建索引:`PUT /index_name`,定义...

    最新版windows elasticsearch-7.13.2-windows-x86_64.zip

    2. 配置设置:修改`config/elasticsearch.yml`文件,根据实际需求调整内存分配、网络端口、路径等参数。 3. 环境变量:设置`JAVA_HOME`环境变量指向JDK的安装路径,因为Elasticsearch基于Java运行。 4. 启动服务:...

    elasticsearch-6.7.0 linux 版本

    Elasticsearch的性能优化涉及多方面,包括硬件配置、内存分配、索引设置、搜索分析器调整等。合理的硬件配置(如SSD存储、足够的内存)是基础,优化索引设置(如字段类型、分析器)和搜索策略(如过滤器缓存、查询...

    elasticsearch6.1.0+elasticsearch head

    - **配置优化**:根据实际需求调整 Elasticsearch 的配置参数,如内存分配、线程池大小等,以提升性能。 - **数据模型设计**:合理设计索引映射,选择合适的字段类型,以便于数据检索和分析。 - **安全设置**:...

    elasticsearch2.4.6

    例如,你可以设置监听的 IP 地址、端口和最大内存分配。 **2. 启动与管理** 启动 Elasticsearch 使用以下命令: ```bash sudo bin/elasticsearch ``` 确保 Elasticsearch 正常运行,可以访问 `...

    elasticsearch超详细安装部署手册

    - **内存分配**:合理配置JVM内存,避免因内存不足导致的问题。 - **安全设置**:根据需求启用或禁用安全特性,如`xpack.security.enabled`。 - **集群健康**:监控集群状态,确保所有节点正常连接。 通过以上步骤...

    Elasticsearch7.0实例精解 源代码.zip

    9. **搜索性能优化**:通过设置倒排索引、合理分配分片、优化查询语句、使用缓存等手段,可以提升Elasticsearch的搜索性能。 10. **安全性**:Elasticsearch 7.0引入了内置的安全特性,如使用X-Pack插件实现用户...

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

    此外,还需关注内存分配、JVM参数调整,以优化性能。 接着,学习Elasticsearch的数据模型至关重要。文档(Documents)是ES的基本操作单元,它们被索引到一个或多个索引(Indices)中,每个索引可以有多个类型...

    最新版windows elasticsearch-8.2.0-windows-x86_64.zip

    3. 性能调优:根据硬件资源调整设置,如索引碎片数量、内存分配、线程池大小等。 4. 监控与报警:利用Elasticsearch内置的监视功能或第三方工具,监控集群状态并设置报警,确保系统的稳定运行。 总之,Elastic...

    Elasticsearch权威指南(中文).pdf

    5. **Shard路由**:合理分配数据和查询请求,避免热点分片。 **六、监控与运维** 1. **健康检查**:通过`/_cluster/health`接口查看集群状态。 2. **指标监控**:监控CPU、内存、磁盘、网络等系统资源。 3. **日志...

    最新版windows elasticsearch-7.16.2-windows-x86_64.zip

    5. **配置文件**:在解压后的目录中,`elasticsearch.yml`是主要的配置文件,用户可以在这里调整内存分配、网络设置、索引策略等参数以适应具体需求。 6. **JVM设置**:Elasticsearch依赖Java虚拟机(JVM),因此...

    elasticsearch-7.5.1-win64.rar

    解决这个问题通常需要检查和调整Elasticsearch的配置文件(如`elasticsearch.yml`),确保节点的资源分配合理,并且监控系统资源使用情况。 Elasticsearch 7.5.1版本引入了多项改进,比如增强了索引性能、优化了...

    最新版windows elasticsearch-8.5.3-windows-x86-64.zip

    Elasticsearch 8.5.3 是一个高度可扩展的开源全文搜索引擎,广泛应用于数据分析、日志聚合、实时监控等领域。这款最新版本针对Windows x86_64架构进行了优化,确保在Windows操作系统上能够高效运行。以下是关于...

    Elasticsearch集成Hadoop最佳实践

    - **硬件配置**: 根据数据量和查询需求,合理分配 CPU、内存和存储资源。内存足够大可以提高搜索速度,SSD 存储可以提升 I/O 性能。 - **JVM 调整**: 调整 Elasticsearch 和 Hadoop 的 JVM 参数,如堆大小、垃圾...

    elasticSearch

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

    ElasticSearch相关安装包

    5. **配置文件**:Elasticsearch的配置主要在`elasticsearch.yml`文件中进行,包括设置节点名称、网络地址、内存分配等。务必根据实际需求进行调整,以确保最佳性能。 6. **集群设置**:如果你想让多个节点组成一个...

Global site tag (gtag.js) - Google Analytics