当前位置: 首页 > 知识库问答 >
问题:

关于弹性搜索内存使用情况

程树
2023-03-14

我目前正在使用弹性搜索 0.9.19。我正在使用的机器有大约 300GB 的磁盘空间,上面的 RAM 约为 23GB。我已经为弹性搜索分配了大约 10GB 的内存。我的操作是写入密集型的。它们大约是 1000docs/s。我只在机器上运行弹性搜索,没有其他进程。文档大小不大。它们很小,只有不超过 10 个字段。弹性搜索仅在一台具有 1 个分片和 0 个副本的计算机上运行。

当我发送 1000 个文档/秒时,使用的内存开始迅速增加。虽然我只为弹性搜索分配了 10GB RAM,但仍然消耗了近 21GB 的 RAM,最终弹性搜索过程导致堆空间不足。稍后我需要清除操作系统缓存以释放所有内存。即使我停止发送弹性搜索,1000docs/s,内存也不会自动清除。

因此,例如,如果我以大约 1000doc/s 的写入操作运行弹性搜索,我发现它很快就达到了 18 GB RAM 的使用量,后来当我将写入操作减少到只有 10 docs/s 时,使用的内存仍然显示大约 18 GB。我认为这应该随着写入操作数量的减少而下降。我正在使用批量 API 来执行我的写入操作,每个查询的大小为 100 个文档。当写入操作约为 1000docs/秒时,数据来自 4 台计算机

这些是我在做顶部后得到的数字

内存:总计 24731664k,已使用 18252700k,6478964k 空闲,322492k 缓冲区

交换:总计 4194296k,已使用 0k,4194296k 免费,8749780k 缓存

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND

1004 弹性 20 0 10.7g 8.3g 10m S 1 35.3 806:28.69 java

请告诉是否有人有任何想法,这可能是什么原因。由于这个问题,我必须停止我的申请。我想我缺少任何配置。我已经阅读了此处弹性搜索的所有与缓存相关的文档 http://www.elasticsearch.org/guide/reference/index-modules/cache.html

我还尝试使用清除缓存 API 清除缓存,并尝试刷新 api。但没有得到任何改善。

提前谢谢。

共有3个答案

章岳
2023-03-14

要考虑的另一件事是弹性搜索的 Ram / 存储比率应该

是。1:16 为了获得最佳性能。

这意味着 - 如果您使用 64 GB 内存,那么存储将是 1024 GB 或 1TB .

景鸿才
2023-03-14

我认为您的摄取对于集群容量来说太重了。然后数据会堆积在内存中。您应该监视磁盘I / O,它应该是瓶颈。

然后你应该:

  • 减慢摄取速度(你可以使用更强大的队列,如Kafka,Rabbit MQ等...,或者使用logstash的持久队列系统)
  • 使用快速 SSD 硬盘驱动器加快 IO 容量
  • 添加更多节点(并调整索引的分片)以获得更好的 I/O 并行性

作为小的优化,您可以通过以下方式稍微提高性能:

  • 增加refresh_interval。此操作会消耗 RAM,因此避免在大量摄取节点中刷新可能会有很大帮助
  • 如果要在索引中进行首次引入,请尝试删除处于引入阶段的所有副本,并在引入后重新添加副本
魏波娃
2023-03-14

总结一下邮件列表线程的答案:问题是 Ruby 客户端无法限制其插入,并且随着大量文档的添加,Lucene 内存使用量确实在增长。我认为提交频率也可能存在问题:不时提交以将新添加的文档刷新到磁盘非常重要。OP 仍然存在问题吗?如果没有,您可以发布解决方案吗?

 类似资料:
  • 我试图从弹性搜索集群中获取数据。索引名称:testIndex类型:testType主机:localhost端口:8080 我想使用弹性搜索5.4版本,使用RestClient,我想使用多重匹配查询获取数据。 示例查询如下所示。 最好的方法是什么?我是否可以使用QueryBuilder构建查询并将其用于rest客户端。

  • 由于已经有很多关于连字符的问题,我已经尝试了以下解决方案: 使用字符筛选器:ElasticSearch-在名称中使用连字符进行搜索。 所以我做了这个映射: 所以char筛选器似乎没有在搜索字符串上执行?我该怎么做才能让它起作用?

  • 我使用Elasticsearch允许用户输入要搜索的术语。例如,我要搜索以下属性'name': 如果使用以下代码搜索或,我希望返回此文档。 我尝试过做一个bool must和做多个术语,但它似乎只有在整个字符串都匹配的情况下才起作用。 所以我真正想做的是,这个词是否以任何顺序包含两个词。 有人能帮我走上正轨吗?我已经在这上面砸了一段时间了。

  • 如果弹性文档中提到长度超过上面的ignore_设置的字符串将不会被索引或存储,请任何人帮助解释关于上述ignore的疑问。对于字符串数组,上面的ignore_将分别应用于每个数组元素,长度大于上面的ignore_的字符串元素将不会被索引或存储。 这是否意味着,如果我添加的数据长于长度,那么它将不允许在ES中发布数据 https://www.elastic.co/guide/en/elasticse

  • 当我执行ps-aef grep elasticsearch HeapDumpOnOutOfMemoryError时看到了这一点 501 373 47 1 0 2:29pm ttys004 0:04.14/usr/bin/Java-xms4g-xmx4g-xss256k-djava.awt.headless=true-xx:+useparnewgc-xx:+useparnewgc-xx:+usepa

  • 我从ElasticSearch得到以下错误。 我在Ubuntu上运行Elasticsearch 1.7.2。 我做错了什么?

  • 关于如何打开缓存有什么建议吗?

  • 我有以下格式的弹性搜索文档 } } 我的要求是,当我搜索特定字符串(string.string)时,我只想获得该字符串的FileOffSet(string.FileOffSet)。我该怎么做? 谢谢