尽管堆大小较小,Elastic Search 仍使用大量内存

尽管堆大小较小,Elastic Search 仍使用大量内存

我们已将 Elastic Search JVM 选项配置/etc/elasticsearch/jvm.options为使用固定堆大小-Xms512m -Xmx512m

检查 Elastic Search 进程时可以确认此功能正在运行:

在此处输入图片描述

然而您会注意到它仍然使用 835M 内存。

如果我们用 ES 检查实际使用的堆大小:

root: curl -sS -XGET "localhost:9200/_cat/nodes?h=heap*&v"
heap.current heap.percent heap.max
     276.1mb           55  494.9mb

它实际上只使用了 276MB 的堆内存 -那么另外的559MB具体用在哪儿呢?我们担心它会导致很多交换/分页问题,​​特别是因为 VIRT 列的大小为 4GB(但我被告知不用担心该列,尽管对我来说它似乎是一个奇怪的高数字)

我们还使用 mlockall 选项禁用了 Elastic Search 的交换,可以通过以下方式确认:

root:~# curl -s localhost:9200/_nodes?pretty|grep mlock
     "mlockall" : true

然而它似乎仍在交换:

for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less
java 128592 kB

我的问题是:

  1. 我们可以做些什么来减少 Elastic Search 消耗的内存大小以确保它固定在 512MB 或尽可能接近这个值?
  2. 确保已禁用交换
  3. 减小 VIRT 列的大小(或者这真的不值得担心?)

答案1

-Xmx512m

此设置仅限制 Elasticsearch 应用程序(JVM 内部)使用的 RAM,而不会限制 JVM 开销所需的 RAM 量。mlockall 也是如此

这就是为什么 Elastic 建议使用 -Xmx 将 50% 的可用 RAM(在操作系统和其他运行软件之后)用于您的 Elasticsearch 应用程序。

关于此内容的好文章:为什么我的 Java 进程比 Xmx 消耗更多的内存

答案2

我建议你查看有关堆大小

无论如何,我认为绝对建议不要为生产服务器上的 elasticsearch 服务分配少于 1GB 的内存。

相关内容