关于 Elasticsearch 内存占用及分配

 

Elasticsearch 和 Lucene 对内存使用情况:

Elasticsearch 限制的内存大小是 JAVA 堆空间的大小,不包括Lucene 缓存倒排索引数据空间。

  • Lucene 中的 倒排索引 segments 存储在文件中,为提高访问速度,都会把它加载到内存中,从而提高 Lucene 性能。所以建议至少留系统一半内存给Lucene。
  • Node Query Cache (负责缓存f ilter 查询结果),每个节点有一个,被所有 shard 共享,filter query查询结果要么是 yes 要么是no,不涉及 scores 的计算。
    集群中每个节点都要配置,默认为:indices.queries.cache.size:10%
  • Indexing Buffer 索引缓冲区,用于存储新索引的文档,当其被填满时,缓冲区中的文档被写入磁盘中的 segments 中。节点上所有 shard 共享。
    缓冲区默认大小: indices.memory.index_buffer_size: 10%
    如果缓冲区大小设置了百分百则 indices.memory.min_index_buffer_size 用于这是最小值,默认为 48mb。indices.memory.max_index_buffer_size 用于最大大小,无默认值。
  • Shard Request Cache 用于缓存请求结果,但之缓存request size为0的。比如说 hits.total, aggregations 和 suggestions.
    默认最大为indices.requests.cache.size:1%
  • Field Data Cache 字段缓存重要用于对字段进行排序、聚合是使用。因为构建字段数据缓存代价昂贵,所以建议有足够的内训来存储。
    Fielddata 是 延迟 加载。如果你从来没有聚合一个分析字符串,就不会加载 fielddata 到内存中,也就不会使用大量的内存,所以可以考虑分配较小的heap给Elasticsearch。因为heap越小意味着Elasticsearch的GC会比较快,并且预留给Lucene的内存也会比较大。。
    如果没有足够的内存保存fielddata时,Elastisearch会不断地从磁盘加载数据到内存,并剔除掉旧的内存数据。剔除操作会造成严重的磁盘I/O,并且引发大量的GC,会严重影响Elastisearch的性能。

Elasticsearch默认安装后设置的内存是1GB,这是远远不够用于生产环境的。
有两种方式修改Elasticsearch的堆内存:

  • 设置环境变量:export ES_HEAP_SIZE=10g 在es启动时会读取该变量;
  • 启动时作为参数传递给es: ./bin/elasticsearch -Xmx10g -Xms10g

给es分配内存时要注意,至少要分配一半儿内存留给 Lucene。
分配给 es 的内存最好不要超过 32G ,因为如果堆大小小于 32 GB,JVM 可以利用指针压缩,这可以大大降低内存的使用:每个指针 4 字节而不是 8 字节。如果大于32G 每个指针占用 8字节,并且会占用更多的内存带宽,降低了cpu性能。

还有一点, 要关闭 swap 内存交换空间,禁用swapping。频繁的swapping 对服务器来说是致命的。
总结:给es JVM栈的内存最好不要超过32G,留给Lucene的内存越大越好,Lucene把所有的segment都缓存起来,会加快全文检索。

参考文档:
https://nereuschen.github.io/...
https://www.elastic.co/guide/...

 

Elasticsearch是一个基于Lucene的分布式搜索引擎,它的性能和稳定性在很大程度上取决于内存分配。本文将详细介绍Elasticsearch内存分配的相关设置。 1. 堆内存分配内存Elasticsearch最重要的内存资源,它用来存储索引和搜索数据Elasticsearch默认的堆内存大小为1GB,可以通过调整jvm.options文件中的-Xms和-Xmx参数来修改堆内存大小。 -Xms参数设置堆内存初始大小,-Xmx参数设置堆内存最大大小。建议将-Xms和-Xmx设置为相同的值,以避免堆内存频繁扩容和收缩。 2. 分片内存分配 Elasticsearch将索引分成多个分片,每个分片都会占用一定的内存资源。分片内存大小可以通过index.memory.shard_*参数进行设置,其中*代表索引的类型(例如index.memory.shard_index_buffer_size)。 建议将分片内存大小设置为堆内存大小的一半左右,以留出足够的内存给其他进程使用。 3. 索引缓存 Elasticsearch中的索引缓存用于加速搜索和聚合操作。索引缓存包括字段数据缓存、位集缓存、过滤器缓存和查询缓存等。 索引缓存大小可以通过index.queries.cache.size和index.fielddata.cache.size参数进行设置。建议将索引缓存大小设置为堆内存大小的20%~30%左右。 4. 搜索线程池 Elasticsearch使用搜索线程池来并发执行搜索操作。搜索线程池的大小可以通过thread_pool.search.size参数进行设置。 建议将搜索线程池大小设置为处理器核心数的1~2倍左右。 5. 网络连接 Elasticsearch中的网络连接包括HTTP连接和节点之间的连接。网络连接数可以通过network.host和network.tcp.connect_timeout参数进行设置。 建议将HTTP连接数和节点之间的连接数分别设置为200~500和50~100左右。 总的来说,Elasticsearch内存分配需要综合考虑堆内存、分片内存、索引缓存、搜索线程池和网络连接等因素。合理的内存分配可以提高Elasticsearch的性能和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值