在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

Elasticsearch内存配置成系统内存的50%是否合理?

Elasticsearch | 作者 HelloGoo | 发布于2018年04月18日 | 阅读数:14149


把你的内存的(少于)一半给 Lucene编辑

一个常见的问题是给 Elasticsearch 分配的内存 太 大了。 假设你有一个 64 GB 内存的机器, 天啊,我要把 64 GB 内存全都给 Elasticsearch。因为越多越好啊!

当然,内存对于 Elasticsearch 来说绝对是重要的,它可以被许多内存数据结构使用来提供更快的操作。但是说到这里, 还有另外一个内存消耗大户 非堆内存 (off-heap):Lucene。

Lucene 被设计为可以利用操作系统底层机制来缓存内存数据结构。 Lucene 的段是分别存储到单个文件中的。因为段是不可变的,这些文件也都不会变化,这是对缓存友好的,同时操作系统也会把这些段文件缓存起来,以便更快的访问。

Lucene 的性能取决于和操作系统的相互作用。如果你把所有的内存都分配给 Elasticsearch 的堆内存,那将不会有剩余的内存交给 Lucene。 这将严重地影响全文检索的性能。

标准的建议是把 50% 的可用内存作为 Elasticsearch 的堆内存,保留剩下的 50%。当然它也不会被浪费,Lucene 会很乐意利用起余下的内存。

如果你不需要对分词字符串做聚合计算(例如,不需要 fielddata )可以考虑降低堆内存。堆内存越小,Elasticsearch(更快的 GC)和 Lucene(更多的内存用于缓存)的性能越好。


      
按照官方建议把ES的内存设置成系统内存的一半,但是经过很长时间的监控,另一半内存并没有被所描述的Lucene使用,请问这样配置是否合理?是否浪费了我的内存?
如何分配内存更加合理些?
 
 
已邀请:

kennywu76 - Wood

赞同来自: laoyang360 yayg2008 kwan huangzhiwei

事实上,给ES分配的内存有一个魔法上限值26GB,这样可以确保启用zero based Compressed Oops,这样性能才是最佳的。参考:
https://www.elastic.co/blog/a-heap-of-trouble
 
 

kennywu76 - Wood

赞同来自: kwan

在linux利用free命令看一下,cached的使用量应该会比较高,这块是lucene文件读写用到的缓存。

medcl - 今晚打老虎。

赞同来自: kennywu76

没有给 es 的内存肯定不会浪费,至于给 es 的内存有没有浪费,要看 es 的监控了,分配物理内存的一半给 es 是不对的,你物理内存可大可小啊,你看上面文档也说了,要看情况,你 256G 内存你也分配一半给 es 么?

yayg2008

赞同来自:

通常的用法就物理内存的一半,且不超过32G。你是怎样监控未被Lucene使用的? 如@kennywu76所说,Lucene使用的是系统的文件cache功能。

要回复问题请先登录注册