Elasticsearch高RSS内存消耗

我在弹性search实例中看到内存消耗过高。

我设置了ES_HEAP_SIZE = 4g。

ES的启动命令开始于: /usr/lib/jvm/java-8-oracle/jre/bin/java -Xms4g -Xmx4g

到现在为止还挺好。

但是我看到超过7GB的RSS内存消耗。

这里是/ proc / status输出: http : //pastebin.com/mXW6Vnfc

但是当我运行jstat -gc一切都看起来很正常,我看到了大约3.7GB的OC和270MB的EC( http://pastebin.com/c84urvSM )。

这是sorting的pmap输出: http : //pastebin.com/GG92Ercr

你有什么想法,为什么内存消耗如此之高?

另外,ES在OpenVZ下的虚拟服务器上运行。

这个问题可能在JVM中,如果您启动了多个ES实例,请使用Java Mission Control进行调查http://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-1998576 .html或jconsole https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html 。 这会给你一个想法,为什么它消耗这么多的记忆。

请记住,JVM在堆内存之外使用GC和其他进程。 用-xms 1024启动ES,然后继续增长。 另外据我记得,Java采取-xms,-xmx参数作为MB没有GB,只是在安全的一面转换一切为MB。

使用jvisualvm查看堆消耗 (以及更多),这是java官方debugging和分析工具,默认情况下使用java安装。

将其附加到elasticsearch过程中,检查-Xmx和-Xms标志是否具有正确的值并查看graphics。 这非常简单。

java进程应该总是有4 GB的堆,因为你设置了最小和最大的堆。 它应该消耗4-4.5 GB的系统,因为有一些开销来pipe理堆没有作为堆的一部分。

无论如何,Java不允许进程使用比configuration更多的堆(如果尝试的话,它会终止进程)。 计算机上可能还有其他内容正在使用内存。 使用tophtop来查看其他正在运行的进程。

您使用ES_HEAP_SIZE设置的是在JVM上运行的程序可用的Java堆大小。 除此之外,JVM还有其自己的开销,GC的开销(它的数据不被认为是Java堆),每个正在运行的线程都需要内存来存放它的堆栈(你有多less个线程,栈大小是多less)。 ElasticSearch可能本身不使用堆外存储,但总是要注意。

我听说过更换内存分配器帮助减less了JVM总占用空间的情况(jemalloc与glibc malloc)。 最后,我会尝试一个不同的(更新的?)JVM版本或不同的GCalgorithm,如果可能的话…