使用的es版本为5.4.0,整个集群由三个节点组成,每个es配置的内存是4G。在运行过程中,es的内存超过4G,甚至可以达到20G以上。
经过分析和排查,最终确定这个问题和es的索引量有关系。经过一段时间运行,es的索引已经达到数十G以上。es采用mmap的方式将索引文件映射到内存中,随着检索的次数增加,越来越多的数据被操作系统读入到内存中。这部分内存位于系统中,但是又不归es管理,也就是和jvm配置的堆内存大小无关。结果就是导致es总的内存不断增长。
解决该问题的版本是修改es的存储方式,配置参数index.store.type由mmap改成niofs。niofs的性能也很好,对检索的性能影响并不大,并且能够有效的控制内存增长。可以认为这是一种按需读取数据的方式,读取的数据主要在系统的缓存中,这个内存是会被回收掉的,es的内存并不会疯涨。
实际测试表明,更换之后,es的内存最多到4.8G。
网友评论