关于弹性搜索内存的使用

时间:2012-11-25 14:18:35

标签: elasticsearch

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

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

因此,例如,如果我使用1000doc/s编写操作运行弹性搜索,那么我发现它很快就达到了18 GB Ram的使用时间,之后当我将写操作减少到只有10个docs / s时使用的内存仍然显示大约18 GB。我认为应该减少写入操作的数量。我使用批量API来执行每个查询大小为100个文档的写操作。当写入操作大约为1000docs / sec时,数据来自4台机器

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

内存:24731664k总计,18252700k使用,6478964k免费,322492k缓冲

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

PID用户公关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

我还尝试使用clear cache API清除缓存,并尝试使用flush api。但没有任何进步。

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

然后您应该:

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

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

  • 增加refresh_interval。此操作会消耗RAM,因此在您需要大量提取节点时避免刷新会很有帮助
  • 如果您是在索引中进行首次提取,请尝试在提取阶段删除所有副本,并在提取之后重新添加副本