![JVM 메모리 사용량은 어떻게 계산됩니까?](https://linux55.com/image/138278/JVM%20%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EC%82%AC%EC%9A%A9%EB%9F%89%EC%9D%80%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EA%B3%84%EC%82%B0%EB%90%A9%EB%8B%88%EA%B9%8C%3F.png)
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%
표시됩니다 (nagios 경고 트리거).85%
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
힙 크기를 15GB로 제한했지만 JVM은 그 이상, 즉 스택 및 기본 메모리를 사용하며 그 중 일부는 JVM(메타공간)에서 관리됩니다.
이 pmap -x <pid>
명령은 추가 2.5GB가 사용되는 위치(스택, 힙)를 식별하는 데 도움이 될 수 있습니다.
이 ps -o nlwp <pid>
명령은 스레드 수를 제공합니다. 귀하의 경우 각 스레드는 1MB의 메모리를 소비하므로 1000개의 스레드는 1GB를 사용합니다.
이 jstat -gc <pid>
명령은 MU 열 아래에 사용된 메타스페이스의 크기를 표시합니다.
메타스페이스에서 메모리를 사용하는 경우 다음 옵션을 사용하여 메모리를 제한할 수 있습니다.
-XX:MaxMetaspaceSize=1g