2

我有一个单节点弹性搜索集群。它通过 Rancher(在 k8s 上运行 fluentd pod 来收集日志)从 Kubernetes 集群接收日志。我在 centos 7 上将 elasticsearch 作为服务运行,并提供了 12 GB 的 JVM 堆空间,VM 有 23 GB 的 RAM。但是弹性搜索仍然使用 VM 的所有 RAM,并在启动后因堆空间错误或 OutOFMemory 错误而不断关闭。

如果它几乎完全填满,我们可以设置一些配置来清除内存/堆以防止崩溃吗?

  1. 为什么即使只分配了 12 GB 的堆空间,elasticsearch 也会使用 VM 的所有 RAM?
  2. 为什么停止服务需要 15-20 分钟?
  3. 我怎样才能减少它的内存消耗?
  4. 如何减少弹性搜索传入数据的负载?

ps提前谢谢。

4

1 回答 1

2

您遇到的是当前使用情况下堆/内存过小的典型案例。考虑到这种用法,您似乎缺乏内存资源来处理您在 ES 实例上抛出的负载。有两种出路:

  1. 首先垂直扩展,即增加节点上的 RAM+堆大小,直到达到 ~30GB 堆(64GB RAM)
  2. 1之后,如果您的节点仍然无法承受负载,请水平扩展,即添加一个新节点以在两个虚拟机之间分散负载

现在回答你的问题:

  1. Elasticsearch JVM 进程使用您分配的堆,但作为 Elasticsearch 核心的搜索引擎 Lucene 不通过堆并利用直接 RAM 内存,这解释了为什么您看到剩余内存用过的。我在上面分享的第一个链接中对此进行了解释
  2. 可能有很多原因
  3. 在不了解您的用例、您在做什么以及如何发送数据的情况下很难回答
  4. 相同的答案

随时提供有关容量、索引请求频率等的更多详细信息

于 2021-09-16T05:55:37.693 回答