怎么解决elasticsearch集群占用太多虚拟内存(VIRT)的问题?占用了几十个G,有什么可以对它进行限制的相关设置吗?

我这里是es5.6.4版本的,有十个节点,都是64G内存的配置,集群启动后,具体表现在用top命令查看,发现虚拟内存有70G,80G,严重影响到其他任务的正常运行。
查了官方文档说是从索引文件映射的方式是MMap,会使用到大量虚拟内存,然后就没下文了。
难道默认就是无限制的,虚拟内存会随着集群索引数据量的增长而无限增长吗?
怎么限制住对虚拟内存的占用
请教各位大神帮忙解答一下。
已邀请:

medcl - Elastic 🇨🇳 !

赞同来自: laoyang360 ESWorker zsgking lbx6z

虚拟内存会严重影响其他程序的运行么?
如果没有实际占用,哪些都只是个数字,不用担心。
给 Elasticsearch 设置内存不是越大越好,要根据实际的使用需求来设置,你可以一开始大一点,然后看看实际的生产环境上,
在实际的查询和压力下看看,在一段时间的观察下,具体是跑了多少内存,不够就调大,占用率低就减少内存的分配,
把更多的内存留给系统做分页缓存更好。堆如果设置越大,垃圾堆积起来的 GC 压力会自然增大,也会造成偶尔的 GC 时间变长,影响 ES。

kennywu76 - wood@Ctrip

赞同来自: famoss ESWorker

ES5.x以后,对于lucene索引文件改为mmap的方式进行访问,当索引被打开以后,ES会讲文件映射到虚拟内存空间,但并不会读取到物理内存里。 只有索引文件被访问的时候,才会通过os将读取的部分从磁盘page in到物理内存。 由于虚拟内存并不是实际的物理内存占用,并且os本身会管理映射内存的的page in/page out,看似很大很吓人的虚拟内存占用其实并无任何问题。  并且在物理内存足够的情况下,这种方式通常可以提升ES对索引文件的访问速度。参考:use-lucenes-mmapdirectory-on-64bit
 
根据经验,如果按照官方的建议,给ES heap的内存少于机器可用物理内存的一半,通常不会有什么问题。  实际生产环境种,我们遇到过的相关问题场景: 预留的物理内存大大少于ES heap内存,从而在做大的查询聚合时,因为物理内存紧缺,mmap引起高频度的page in/page out,性能变得很差。

strglee - 公众号: 每日ELK ,每天分享ELK相关知识

赞同来自: ESWorker

存储方式可以改为niofs
https://www.elastic.co/guide/e ... store
 
es 5之前使用mmapfs读取索引文件的部分,而5.0以后改为用mmapfs读取索引文件的全部,大范围的数据搜索可能造成过高的磁盘读IO
 
这是github上的一些讨论 可以看一下
https://github.com/elastic/ela ... 17616
https://github.com/elastic/ela ... 21611  

laoyang360 - [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:blog.csdn.net/laoyang360

赞同来自: ESWorker

关于堆内存配置:
注意:
最大可分配堆内存大小为:
32GB与当前ES宿主机内存二者的最小值。
举例1):ES宿主机内存:128GB,可供分配的堆内存:32GB。(建议31GB)
举例2):ES宿主机内存:32GB,可供分配的堆内存:16GB。

要回复问题请先登录注册