我正在调整我的 Elasticsearch 集群,发现内存使用情况不一致。free
在我的实例上运行“ ”:
free
total used free shared buff/cache available
Mem: 30881324 17072320 238216 49736 13570788 13313528
Swap: 0 0 0
30GB
我们看到机器上有。
ES 被调整为使用 50% 的可用内存(或由于 oop 原因最大 30GB),我可以在这里验证-Xms
和-Xmx
标志设置为15078m
:
/bin/java -Xms15078m -Xmx15078m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -XX:+HeapDumpOnOutOfMemoryError -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/etc/elasticsearch -Des.distribution.flavor=default -Des.distribution.type=rpm -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet
但当运行“top”时,我们看到了不同的情况。
%MEM
位于59%
,很多时候会显示85%
或更多(触发 nagios 警报):
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24366 elastic+ 20 0 54.9g 17.5g 1.6g S 267.7 59.3 1849:57 java
答案1
您已将堆大小限制为 15 GB,但 JVM 使用的容量不止于此:堆栈和本机内存,其中一些由 JVM(元空间)管理。
该pmap -x <pid>
命令可能有助于识别额外的 2.5 GB 的使用位置:堆栈、堆。
该ps -o nlwp <pid>
命令将为您提供线程数。在您的情况下,每个线程消耗 1MB 内存,因此一千个线程将使用 1GB。
该jstat -gc <pid>
命令将在 MU 列下显示已用元空间的大小。
如果内存被元空间使用,您可以使用此选项限制其:
-XX:MaxMetaspaceSize=1g