티스토리 뷰
GC Tuning을 실제로 시작해보자.
0. 튜닝 순서
순서는 다음과 같다.
1) 가용메모리 확인
2) jvm 프로세스 사용메모리 확인
3) jvm 내부 메모리 확인및 FC 시간체크
4) 분석후 New 와 Old영역비율 설정. jvm restart 후 하루 지나 다시 모니터링
1. System 전체 메모리 확인
# free
total used free shared buffers cached
Mem: 1019556 905732 113824 0 72084 136476
-/+ buffers/cache: 697172 322384
Swap: 4193276 261824 3931452
리눅스에서는 실제 free메모리는 free + cache의 값이다. 그러므로 실제로는 400MB정도가 남아있다. (buffers/cache는 여유메모리를 여러 캐싱의 목적에 사용하는 것이다).전체 1G 중에서 600메가 사용중이고, 400a메가가 남아있다.
2. JVM Tomcat process의 메모리를 확인해 보자
ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,cmd --sort -rss | head -n 5
너무 길기 때문에 .bash_profile 파일안에 alias설정을 해놓았다.
# vi .bash_profile
alias memory="ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,cmd --sort -rss | head -n 5"
# source .bash_profile
# memory
USER PID PPID RSS SIZE VSZ %MEM %CPU TIME CMD
root 1300 1 295604 1297740 1400944 28.9 0.3 00:08:27 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat7/endorsed -classpath /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat7 -Dcatalina.home=/usr/local/tomcat7 -Djava.io.tmpdir=/usr/local/tomcat7/temp org.apache.catalina.startup.Bootstrap start
mysql 995 1 170468 843356 888616 16.7 0.1 00:03:29 /usr/sbin/mysqld
root 1634 1497 31932 117960 350632 3.1 1.3 00:32:21 /usr/bin/python ./server.py
root 1500 1499 8480 1282968 1387716 0.8 0.1 00:03:38 /usr/bin/java -jar -Dsolr.solr.home=las start.jar
확인결과 tomcat java가 실제사용중메모리(RSS) 300메가, 최대 alloc되어있는메모리는 1.4기가 정도까지 늘어날수 있게 설정되어있다.
3. JVM내의 new/old 메모리 정보
일단 하루사이에 JVM 정보가 아래와 같이 변했다.
어제)
jstat -gcutil 1300
S0 S1 E O P YGC YGCT FGC FGCT GCT
100.00 0.00 77.03 86.82 98.72 104 0.368 1 0.373 0.741
admin@ubuntu:/usr/local/tomcat7/bin# jstat -gccapacity 1300
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX
5312.0 169984.0 6912.0 640.0 640.0 5632.0 10624.0 339968.0
OGC OC PGCMN PGCMX PGC PC YGC FGC
13640.0 13640.0 21248.0 169984.0 24128.0 24128.0 104 1
오늘)
jstat -gcutil 1300
S0 S1 E O P YGC YGCT FGC FGCT GCT
100.00 0.00 78.30 86.82 98.74 104 0.368 1 0.373 0.741
jstat -gccapacity 1300
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX
5312.0 169984.0 6912.0 640.0 640.0 5632.0 10624.0 339968.0
OGC OC PGCMN PGCMX PGC PC YGC FGC
13640.0 13640.0 21248.0 169984.0 24128.0 24128.0 104 1
4. 현재 GC 확인
원래는 Full GC의 횟수가 많이 증가 했거나 GC시간이 1초 이상이라면 튜닝을 고려해 봐야 하지만,
일단은 많이 사용하는 설정으로 튜닝을 해보자.
현재 내가 test하는 jvm은 아래와 같은 옵션으로 실행된다.
/usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat7/endorsed -classpath /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat7 -Dcatalina.home=/usr/local/tomcat7 -Djava.io.tmpdir=/usr/local/tomcat7/temp org.apache.catalina.startup.Bootstrap start
자바의 버전은 1.7이다. 아래와 같이 확인했다.
# java -version
java version "1.7.0_79"
OpenJDK Runtime Environment (IcedTea 2.5.5) (7u79-2.5.5-0ubuntu0.12.04.1)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)
1.7의 default GC는 ParallelGC이다. (-XX:+UseParallelGC)
일단 UseParallelOldGC로 변경하고 메모리 rate를 변경해 보겠다.
Tomcat/bin의 catalina.sh의 JAVA_OPTS를 찾아수정한다.
JAVA_OPTS=-XX:+UseParallelGC -Xms600m -Xmx800m -XX:NewRatio=3
이상태에서 하루정도 있다가 지켜봐야겠다.
5. 하루 지나 확인해보니,
Full GC는 발생하지 않았지만, New GC가 77회 발생했고, 총 6초를 소모했다. 또한 한번의 new GC당 약 60ms를 소모했다.
약간 높은 편이다. 그래도 FullGC가 일어나지 않았으니 크게 문제라고 생각하지 않아 넘어가도록 하자.
참조
'os' 카테고리의 다른 글
ubuntu에 oracle java8 idk 설치하기. (0) | 2016.12.09 |
---|---|
AWS의 CDN, CloudFront 서비스의 특징과 한계 (0) | 2016.11.28 |
net-snmp (snmp설정) (0) | 2016.03.15 |
[Ubuntu] 우분투 GitLab 설치 (0) | 2016.01.26 |
우분투 Mysql 설치 및 삭제 - install myslq(ubuntu) (0) | 2016.01.26 |