May 10, 2018 - JVM_OPT 제거 관련

현재 서버에 설정되어있는 jvm 옵션.

JAVA_OPTS="-verbosegc -server -Xms6144m -Xmx6144m -XX:NewRatio=5  -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=0 -XX:CMSInitiatingOccupancyFraction=75 -Djava.security.egd=file:/dev/urandom -Dscouter.config=/usr/local/tomcat7/conf/scouter.conf -Duser.timezone=GMT+09:00 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat7/logs/memory_err.log"

시작시 최소, 최대 메모리를 설정한 6144m 을 제외한 나머지 추가 옵션은

-XX:NewRatio=5  -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=0 -XX:CMSInitiatingOccupancyFraction=75

총 6개 의 추가 옵션이 존재합니다. 위의 옵션은 Elasticsearch 설치시 적용된든 기본옵션이기도 합니다.

1번. -XX:NewRatio=5

해당 옵션은 추후 설명할 3번 항목때문에 설정된 것으로 보입니다. 제가 관리하는 프로젝트는 싱글 Thread 처리로 인해 부분 lock 이 발생함에 따라, 대부분의 DAO 커넥션을 위한 Dao 객체를 new 객체로 변환하였기 때문에,

newRatio 옵션을 default 로 처리하는 방안에 대해 고민하였습니다. 실제 NewRatio=5가 되면 new 영역은 전체 메모리의 1/6 밖에 되지 못함으로, 해당 기능에 대한 지연현상이 있을 수 있어, 해당 기능을 제거하는 것이 유리해보였습니다.

2번. -XX:+UseParNewGC

Eden Space 를 multi thread 로 정리하는데 사용합니다. Eden Space의 경우 새롭게 생성된 객체들을 의미하는데, 해당 객체들을 multi thread로 GC 처리한다는것을 의미합니다. 사용할 thread 수는 -XX:ParallelGCThreads 로 결정하는데 해당 옵션은 들어가있지 않으므로, 기본값인 CPU core 수로 처리됩니다.

  • 장점
  • Scavenge GC(default Copying Collector) 처리 속도를 비약적으로 상승
  • 단점
  • thread 수를 과하게 늘릴 경우 thread contention(경합) 에 의해 성능 저하가 발생

특히 서버당 여러 인스턴스를 띄워야하는 경우에 전체 VM에 대해 ParallelGCThreads 의 총합이 CPU core 수를 넘기지 않도록 별도 옵션처리로 총합에 대한 관리가 필요합니다. 현재는 각 서버마다 단일 인스턴스를 띄우기 때문에, 그대로 유지하는 것을 고민해봤으나, 추후 여러 인스턴스를 띄울 때 4개 이상의 JVM 을 사용될때 총합에 대한 별도 관리가 필요하여 삭제하는 것이 유리해보였습니다.

3번. -XX:+UseConcMarkSweepGC

객체가 일정 횟수 이상 Scavenge GC 에 살아남으면, To Space 에서 Old Generation 으로 승격됩니다. 이때 일정 횟수는 -XX:MaxTenuringThreshold 로 설정 가능한데, 해당 옵션을 0으로 주었기 때문에, eden의 모든 객체가 한번의 gc 주기에 생존하면 바로 old generation 으로 옮겨지게 됩니다. 그 때, Old Generation 을 위한 병렬 collercor를 -XX:+UseConcMarkSweepGC (이하 CMS)로 활성화가 가능합니다.

GC 과정을 4개의 phase 로 진행되며,

initial marking > concurrent marking > second remarking > concurrent sweeping

순으로 진행되게 됩니다.

  • 장점
  • Full GC 및 Out Of Memory Error 를 피하는 데 좋습니다.
  • 단점
  • CPU 비용이 비싸다고 합니다.

concurrent marking phase 에서 하나 이상의 CPU core 가 할애되어야 하며, concurrent sweeping phase 에서 하나의 CPU core 가 할애되어야 한다고 합니다. 참고로, CMS 는 initial mark 와 remark phase 에서 stop-the-world pause 발생하기 때문에, -XX:+CMSParallelRemarkEnabled (remark 시 일시중단을 하지 않도록 함.) 와 같이 사용하길 권장하기에 해당 기능이 추가로 설정된 것으로 보입니다.

해당 CMS 는 4 CPU core 보다 더 많은 core 가 꽂힌 대형 시스템에서 OOME 를 주기적으로 경험하는 경우에만 사용하는 것이 좋다고 하며, CMS 알고리즘이 효율적으로 동작하기 위해 -Xmn 은 전체 heap 의 1/4 로 설정하는 것이 좋다고 합니다. (이로인해 1번항목의 NewRatio=5 설정을 한 걸로 추정) CMS 를 켜면 -XX:+UseParNewGC 가 같이 켜지므로, ParallelGCThreads 를 별도로 관리해 주어야 합니다. (현재 옵션에 없으므로 해당 서버의 cpu갯수)

4번. -XX:CMSInitiatingOccupancyFraction=75

3번 항목에서 CMS를 설정하였을 경우에 보조하기 위해 처리한 것으로 보입니다.
Full GC가 빈번하게 발생하던 예전 플랫폼 환경에서, CMS로 Full GC를 제어하려고 한 것으로 보이고,
Old 영역이 너무 꽉 찾을때 CMS가 실행되면서, CMS 중에 CMS가 중단되고 Full GC등이 발생하는 경우를 제어하기 위해 적용한걸로 추정됩니다.

결론

이 1,2,3,4번 항목 전부 전부 CMS 로 Full GC나 OOME를 제어하기 위해 만들어진 것으로 파악되었습니다. 서버 증설 및 서버 확장으로 인해 현재 Full GC 가 거의 없는 상황에선 필요하지 않은 옵션으로 보였기 때문에, 서버 1대에 해당 옵션을 제거한 후 테스트 하였으며, 성능이슈는 발생하지 않았습니다.

감사합니다.

적용한 서버와 적용하지 않은 서버와의 차이는 GC 발생율이 1/2로 줄은 것으로 최종 확인이 완료하여 전체 적용이 완료되었습니다.

이미지

Apr 28, 2018 - IntelliJ_IDEA 기본 설정

인텔리제이 설정

1. 플러그인 설치

Camelcase

카멜케이스 변환 플러그인

Java Method Reference Diagram

기본적으로 Ctrl+ALt+U(윈도우기반 단축키 기준)을 하면 UML을 보여주는데 이 플러그인을 설치하면 메소드 레퍼런스도 볼 수 있음 UML을 볼때 연관 Class들을 source explorer 에서 선택한 상태에서 보면 유용합니다.

Nyan Progress Bar : 고양이 Progress Bar

  • https://plugins.jetbrains.com/plugin/8575-nyan-progress-bar
String manipulation : alt + m (텍스트 편집기, 카멜케이스등의 가이드 제공)
Translation   : 번역기
grep console  : log에 색깔 입히기(특정단어만 log창에 띄울수있음.)
generateAllSetter
  : 객체 생성하고, alt + enter setter 자동 생성(객체생성시 생성한 객체에 alt_enter 시 setter에 대한 메뉴등장)
codeglance  : 스크롤 옆에 화면 파일에 대한 전체 flow 축소하여 보여줌
Power Mode ll : 타자를 입력시 불꽃효과
gittoolbox : 푸시한 사람과 푸시 시간이 출력됨 (무거움)

2. 단축키

ctrl + E

최근 작업 소스

shift + shift

만능 서치

VM 용량 변경작업

windows

IDE_HOME\bin\<product>[bits][.exe].vmoptions

mac

/Applications/<Product>.app/Contents/bin

SVN checkout 시 에러날 경우

Cannot load supported formats: Cannot run program "svn": CreateProcess error=2, The system cannot find the file specified
_Settings -> Version Controll -> Subversion -> Use command line client

위와 같은 내용을 체크 해제하라는 글을 봤는데, 2018.01 버전에서는 해당 옵션이 보이지않습니다.

결국 svn 재설치를 하여 해결했습니다.
Slik-Subversion-1.9.7-x64.msi설치합니다.

Version Control > Subversion 의 경로를,

C:\Program Files\SlikSvn\bin\svn.exe

로 설정합니다.

프로퍼티 에디터

Settings -> Editor -> file encoding -> Transparent native-to-ascii conversion 체크

이미지

해당 기능을 체크하면, 한글이 유니코드로 깨져서 보여지는 것이 한글로 변환되어 보여지게 됩니다.

VM 파라미터

경로 :

- 64bit : C:\Program Files\JetBrains\IntelliJ IDEA 2018.1.2\bin\idea64.exe.vmoptions

VM 옵션

-Xms256m
-Xmx2048m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-Duser.name=bymin
-Dfile.encoding=UTF-8
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Dfile.encoding=UTF-8 는 꼭 해줘야합니다. 콘솔창 등에서 한글이 깨지지 않게 하기 위한 설정값입니다.

TOMCAT VM 파라미터

-Dfile.encoding=UTF-8
-Dfile.client.encoding=UTF-8
-Dfile.encoding.override=UTF-8

TOMCAT SSL 설정

옵션에 있는 https 포트 설정은 왜 만들어 져있는지 모르겠으나, 해당 값에 대한 설정 처리가 안됩니다. 실제 톰캣 경로의 server.xml을 수정해서 ssl 설정을 마무리했다는 글밖에 없으며, 별도의 instance를 생성하여 처리하는 방안밖에는 없어 보입니다. (이클립스의 서버별 tomcat의 분리 instance를 자동으로 생성하는 부분이 아쉽습니다.)

Exception in thread “main” java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>

servlet 을 provided로 설정했을 경우, intelliJ에서는 별도의 Main class 에서 동작시에는, IntelliJ 설정에서 include dependencies with “Providd” scope 체크를 해야합니다.

폰트설정

Ctrl+Alt+S > 키워드: Font를 친 후

Gradle 5.0 version 이슈

Gradle 5.0 이상의 경우 인텔리J 2019.1 버전으로 올리지 않으면 에러가 발생합니다.

IntelliJ 단축키 모음

ctrl + alt + L 전체 코드 재정렬 ctrl + Z undo ctrl + shift + Z redo shift + shift 모든검색 ctrl + D 줄복사


참조


Apr 28, 2018 - Connect Error: Can't connect to local MySQL server through socket '/var/lib/mysql'

Connect Error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)

mysql 오류

mysql로 localhost에 접속하려고 할 때, 다음과 같은 오류가 발생했습니다.

$ mysql -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)

인터넷을 통해 해결방법을 찾아보았는데, root 계정으로 symbolic link 설정하라는 글을 봤습니다.

$ ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock

그렇게 했는데도 처리가 안됩니다. 여러가지 방법을 사용해봤는데, 데이터베이스가 전체적으로 깨진것으로 파악되며, 아예 전부 리셋하지 않으면 방법이 없어보입니다.

개인서버이며, mysql 에서 mariadb로 변환하면서 생긴 오류로 파악되어, 인터넷의 여러방법을 찾아봤지만, 해결책을 찾을 수 없었습니다.

어쩔 수없이, crontab -e 에 1분간 shell script 를 등록했습니다.

* * * * * sh /home/mysql_start.sh

별도의 쉘스크립트를 생성하였고, 해당 스크립트는,

/usr/sbin/service mysql start >> /home/mysql.log 2>&1

1분마다 계속 mysql 을 start 시킵니다. 라이브 운영되는 서버라면 mariadb를 dump 하여 다시 마이그레이션처리를 해야할 이슈로 보입니다.