본문 바로가기
프로그램 (PHP,Python)

자바 성능 튜닝 (JVM Option)

by 날으는물고기 2009. 6. 24.

자바 성능 튜닝 (JVM Option)

java pool size 세팅에 대해선 static 파라미터이기 때문에 디비 restart를 하면 적용이 됩니다.

※ Oracle JVM 설치
Oracle 9.0.1에서 Oracle JVM의 모든 구성 요소를 설치하기 위해 ORACLE_HOME 밑에 javavm 폴더 밑에 install 폴더 밑에 initjvm.sql script를 실행함.
주의 : 이 script들은 반드시 SYS 또는 INTERNAL로 실행되어야만 합니다.
설치에 앞서 점검해야 할 사항
권장 사항
SHARED_POOL_SIZE >= 65 MB
JAVA_POOL_SIZE >= 50 MB
SYSTEM tablespace내에 50 MB 이상의 free space
250 MB 이상의 rollback segment space

주의 : 위 사항이 만족되지 않거나 부족한 경우 다음 에러가 발생하거나
script실행 도중 hang이 걸릴 수 있습니다.
ORA-3113 : end-of-file on communication channel
ORA-4030 : out of process memory when trying to allocate %s bytes
ORA-4031 : unable to allocate bytes of shared memory

JVM version 9.0.1 을 설치하기 위한 script

SQL>@$ORACLE_HOME/javavm/install/initjvm.sql;

기타 세팅 스크립트들
-- INITialize (load) XML components in JServer
SQL>@$ORACLE_HOME/xdk/admin/initxml.sql;

-- Loads NCOMP'ed XML Parser
SQL>@$ORACLE_HOME/xdk/admin/xmlja.sql;

-- loads the XMLSQL Utility (XSU) into the database.
SQL>@$ORACLE_HOME/rdbms/admin/catxsu.sql;

-- install the Oracle Servlet Engine (OSE)
SQL>@$ORACLE_HOME/javavm/install/init_jis.sql <$ORACLE_HOME>;

-- Adds the set of default end points to the server
-- with hardcoded values for the admin service
SQL>@$ORACLE_HOME/javavm/install/jisaephc.sql <$ORACLE_HOME>;

-- turn on J Accelerator
SQL>@$ORACLE_HOME/javavm/install/jisja.sql <$ORACLE_HOME>;

-- register EJB/Corba Dynamic Registration Endpoint
SQL>@$ORACLE_HOME/javavm/install/jisdr.sql 2481 2482;

-- init Java server pages
SQL>@$ORACLE_HOME/jsp/install/initjsp.sql;

-- turn on J Accelerator for JSP libs
SQL>@$ORACLE_HOME/jsp/install/jspja.sql;

-- script used to load AQ/JMS jar files into the database
SQL>@$ORACLE_HOME/rdbms/admin/initjms.sql;

-- load RepAPI server classes and publish 'repapi' obj
SQL>@$ORACLE_HOME/rdbms/admin/initrapi.sql;

-- loads sql, objects, extensibility and xml related java
SQL>@$ORACLE_HOME/rdbms/admin/initsoxx.sql;

-- Loads appctxapi.jar for JavaVm enabled Database.Called by jcoreini.tsc
SQL>@$ORACLE_HOME/rdbms/admin/initapcx.sql;

-- script used to load CDC jar files into the database
SQL>@$ORACLE_HOME/rdbms/admin/initcdc.sql;

-- Loads the Java stored procedures as required by the
-- Summary Advisor.
SQL>@$ORACLE_HOME/rdbms/admin/initqsma.sql;

--Initialize sqlj type feature in 9i db
SQL>@$ORACLE_HOME/rdbms/admin/initsjty.sql;

--load java componenets for AQ HTTP Propagation
SQL>@$ORACLE_HOME/rdbms/admin/initaqhp.sql;


자바 성능 튜닝은 JVM 옵션만 튜닝한다고 해서 되는 것은 아니다.

하지만, Application 단에서 튜닝을 모두 마쳤을 경우 가장 마지막에 해야 하는 것이
JVM의 GC 옵션 및 메모리 부분의 튜닝이다.

물론 사람에 따라 방식이 틀려서 GC 옵션을 처음부터 할 수도 있다.


http://www.ibm.com/developerworks/kr/library/au-javaonaix_memory.html

AIX 서버 (IBM JVM을 사용하는 서버)에서 자바 관련 문제가 발생되었을때 해결방안이 정리되어 있다.

그중 가장 마음에 드는 구절은 다음 부분이다. ^^;

메모리 문제는 매우 복잡하고, 해결하기도 매우 어려우며, 진단에도 많은 시간이 요구됩니다. 메모리 관련 문제들은 다음과 같은 이유로 인해 해결하기 매우 어려운 작업입니다.

  • 부적절하게 튜닝 된 OS나 JVM
  • 부적절하게 객체를 관리하는 자바 애플리케이션
  • 부적절하게 할당된 큰 객체 또는 중첩 객체들
  • 단편화(Fragmentation)
  • JNI/네이티브 코드에서 올바르게 릴리스 되지 못한 메모리
  • JVM 메모리 할당과 사용에 대한 이해의 부족


출처 : www.tuning-java.com


OracleJVM 유지 관리
By Madhavi Yeleswarapu & Brian Bombard

SQL과 Java 통합을 위한 OracleJVM 설치와 업그레이드

Java Virtual Machine (JVM)은 썬의 자바 JDK 사양과 호환되는 자바 실행 환경으로서 확장 가능하고, 일반적인 목적으로도 사용 가능합니다. 그런데, Oracle의 구조를 사용하기 위하여 최적화된 OracleJVM (Oracle9i에서는 Oracle9i JVM라 불립니다)은 데이타베이스 내에 내장되어 통합된 JVM입니다. Oracle Support Services (OSS)는 고객이 리포트한 OracleJVM 문제들에 대하여 근본부터 원인까지 철저하고 세밀하게 분석을 하고 있습니다. 그러한 분석에 근거하여, 이 칼럼은 OracleJVM을 설치하고 업그레이드하기 위한 최상의 실행 방법을 제공할 수 있을 것입니다.

OracleJVM 문서 검토

OracleJVM을 설치하거나 업그레이드하기에 앞서 우선 관련 문서를 살펴 보도록 하겠습니다. Oracle9i 자바 개발자 가이드는 JVM의 기본과 함께 JServer가 제공하는 툴들의 기술 개요에 대한 내용들을 포함하고 있습니다. 또한 Oracle9i 자바 내장 프로시저 개발자 가이드는 함수, 프로시저, 데이타베이스 트리거, SQL 메소드 등을 포함하는 자바 내장 프로시저의 개요에 대한 내용을 제공하고 있습니다.

OracleJVM 설치 확인

일반 또는 최소한의 Oracle 데이타베이스 설치는 자동적으로 OracleJVM을 설치합니다. 만약, 사용자 정의 설치에서 OracleJVM을 명시적으로 설치하기를 원한다면, JVM 옵션을 선택하면 됩니다.

OracleJVM의 설치 여부를 확인하고 싶다면, SQL*Plus를 사용해서, JServer 옵션이 설치되었는지를 확인하십시오. SQL*Plus를 시작해서, 아래에서 보는 바와 같이 JServer 옵션 정보를 표지가 포함하는지를 확인할 수가 있습니다:

SQL*Plus: Release 9.0.1.4.0 - Production on Fri Sep 27 14:19:05 2002
(c) Copyright 2001 Oracle Corporation.  All rights reserved.  
Connected to:
Oracle9i Enterprise Edition Release 9.0.1.4.0 - Production
With the Partitioning option
JServer Release 9.0.1.4.0 - Production

설치 전 요구 사항 확인

OracleJVM을 사용자 정의 설치의 일부분으로 설치하기 전에, 중요한 리소스가 잘 설정되었는지를 확인해야만 합니다.

OSS에 보고 되는 OracleJVM 문제들을 분석한 결과, 대략 보고된 문제들의 30%가 설치시의 불충분한 리소스 때문인 것으로 밝혀졌습니다. 그러면, OracleJVM 설치 중에 문제를 발생시키는 가장 일반적인 문제들에 대한 해결책들을 지금부터 다루도록 하겠습니다.

풀 리소스 증가. 공유 풀과 자바 풀은 Oracle 데이타베이스 서버 시작 시에 할당되는 SGA에 위치한 고정된 크기의 메모리 블록들인데, 공유 풀과 자바 풀의 크기들은 각각 SHARED_POOL_SIZE 매개 변수와 JAVA_POOL_SIZE 매개 변수에 의해서 조정됩니다. 그리고, 공유 풀은 자바 클래스들을 데이타베이스로 로드해서 해결하는 동안 클래스 로더에 의해서 사용되어지고, 자바 풀은 모든 특정한 세션의 자바 코드와 데이타를 위해 사용되어 집니다.

SHARED_ POOL_SIZE 매개 변수와 JAVA_POOL_SIZE 매개 변수를 불충분하게 설정하는 것은 OracleJVM 설치 실패의 가장 큰 원인입니다. 만약, 공유 풀과 자바 풀이 너무 낮게 설정되었다면, 다음과 같은 오류를 얻게 될 것입니다.

ORA-4031: unable to allocate bytes of shared memory 

오류 메시지에서 공유 메모리 참조는 혼동을 줄 수가 있습니다. 왜냐하면, 오류는 사용자가 SGA의 메모리 범위 밖에서 실행하고 있다고 지적하고 있기 때문입니다. 그것은 SHARED_POOL_SIZE를 반드시 증가시켜야만 한다는 것을 항상 의미하지는 않습니다; 때로는, 대신에 JAVA_POOL_SIZE를 증가시켜야 할 경우도 있습니다. 즉, 이 문제를 해결하기 위해서는 우선 SHARED_POOL_SIZE를 증가시킵니다. 그렇게 했는데도 문제가 해결되지 않는다면, 그 때는 JAVA_POOL_SIZE를 증가시켜야 합니다.

성공적인 OracleJVM 설치를 위한 추천 값들은:

JAVA_POOL_SIZE: 50MB
SHARED_POOL_SIZE: 70MB

SYSTEM 테이블스페이스에 공간 만들기. OracleJVM를 설치할 때는, SYSTEM 테이블스페이스에 충분한 공간을 갖고 있어야만 합니다. OSS는 OracleJVM을 설치하기 전에 SYSTEM 테이블스페이스에 최소한 50MB의 공간을 갖고 있기를 추천하고 있습니다.

롤백 세그먼트 공간 증가.OSS는 OracleJVM을 설치하기 전에 롤백 세그먼트가 최소한 50MB의 공간을 갖고 있기를 추천합니다.

롤백 리소스의 부족은 OracleJVM 설치 과정 중에 다양한 오류들을 발생시킬 수가 있습니다. 그래서, 스크립트들이 “ORA-29540: class oracle/aurora/rdbms/DbmsJava does not exist.”과 같은 일반적 오류와 함께 실패하는 경우도 있습니다. 그러므로 이와 같은 경우에는 롤백 리소스를 증가시켜서 이러한 오류들을 수정하면 됩니다.

LD_LIBRARY_PATH 설정. "create or replace java system" 과정 동안 ORA-3113과 ORA-7445 같은 에러들이 발생되지 않도록 설치 시에 LD_LIBRARY_PATH가 적당히 설정되어 있어야 하는데, 32 비트 환경에서는 LD_LIBRARY_PATH를 다음과 같이 설정해야만 합니다:

set LD_LIBRARY_PATH=$ORACLE_HOME/lib 


64-bit 환경에서는, LD_LIBRARY_PATH_64을 다음과 같이 설정하십시오:

set LD_LIBRARY_PATH_64=$ORACLE_HOME/lib64

rmjvm.sql 실행한 후에 재시작. 실패한 설치 작업을 깨끗이 하기 위해서는 rmjvm.sql을 실행한 후에 데이타베이스를 종료하고 재시작 해야만 합니다. 만약, rmjvm.sql를 실행하고 있는 도중에 또 rmjvm.sql를 실행하는 경우가 발생한다면, 데이타베이스를 종료하고 재시작 할지를 물어보는 메시지를 보게 될 것입니다.

OracleJVM 설치와 활성화

OracleJVM는 다음 방법들 중 하나를 사용해서 설치할 수가 있습니다:

  • Oracle9i 일반 또는 최소한의 설치는 Oracle9i JVM를 자동으로 설치합니다.
  • Oracle9i 사용자 정의 설치는 JVM 옵션이 선택되었을 때 Oracle9i JVM을 설치합니다.

새로운 또는 기존 데이타베이스에서 다음 방법들 중 하나를 선택함으로써 OracleJVM을 활성화할 수가 있습니다:

  • Database Configuration Assistant (DBCA) 활성화를 사용합니다.
  • 수동 활성화를 사용합니다.

활성화 스크립트 또는 스크립트들을 수동으로 실행할 수는 있지만 반드시 SYS SYSDBA 사용자로서 그것들을 실행해야만 합니다. 만약에 SYSTEM 사용자로서 이 스크립트를 실수로 실행하였다면 “create or replace java system” 과정 중에 부적합한 객체를 생성하거나 또는 권한과 관련 있는 오류들을 발생시킬 것입니다.

이전의 데이타베이스 릴리스에서는 (8.1.7 이전에), initjvm.sql가 OracleJVM 활성화를 위해 실행되어지는 유일한 스크립트이었지만, 릴리스 8.1.7부터는 추가적인 자바 기능들이 데이타베이스와 통합되었습니다. 이 기능들은 OracleJVM을 활성화하기 위하여 추가적인 스크립트들을 필요로 합니다. 그 필요한 활성화 스크립트는 여기에서확인하실 수가 있습니다.

설치 확인

데이타베이스에 정확한 개수의 자바 객체들이 있고, 그것들이 모두 유효하다는 것을 확인함으로써 설치를 검증할 수가 있습니다.

자바 객체의 개수 확인. 모든 자바 객체들이 설치되었다는 것을 확인하기 위해서는 SYS 사용자로 다음 질의들을 실행해 보아야만 합니다:

SELECT COUNT(*) AS "TOTAL_JAVA_OBJECTS" 
 FROM  DBA_OBJECTS 
 WHERE OBJECT_TYPE LIKE 'JAVA%'; 
   
   COUNT(*)
   -------
     10453

JVM이 성공적으로 설치되었다면 Oracle9i 데이타베이스에서는 10,000 개 이상의 객체들을 볼 수가 있습니다. 부적합한 자바 객체가 하나도 없음을 확인하십시오. 한편, 모두가 유효한 자바 객체들인 것을 확인하기 위해서는 다음의 질의를 SYS 사용자로 실행하여야 합니다:

SELECT COUNT(*) AS "TOTAL_INVALID_JAVA_OBJECTS" 
 FROM  DBA_OBJECTS 
 WHERE OBJECT_TYPE LIKE 'JAVA%' 
  AND  STATUS = 'INVALID';

   COUNT(*)
   --------
         0

부적합한 객체가 하나도 없습니다.

다음 단계

Oracle Support Services
oracle.com/kr/support

READ
Oracle9i Documentation
otn.oracle.com/documentation

OTN White Papers
otn.oracle.com/tech/java/java_db/pdf/
OW_30820_JAVA_STORED_PROC_paper.PDF

OracleJVM 업그레이드

OracleJVM과 관련되어OSS에 보고되는 문제들의 약 12%는 OracleJVM 업그레이드와 관련이 있습니다. Oracle 이전 가이드는 데이타베이스를 업그레이드한 후에 적절히 OracleJVM을 업그레이드하기 위해서 jvmu81X.sql 스크립트를 실행하는 프로시저를 기술하고 있습니다. 그런데, 업그레이드 스크립트 실행을 실패하는 것은, SYS 스키마에 부적합한 객체를 만들어 내고, 또는 이 객체들을 다시 컴파일하려는 시도도 실패하게 만들 것입니다. 이 시점에서, initjvm.sql 스크립트를 실행하는 것은 문제를 더욱 더 복잡하게 만들 수가 있는데, 이 때는 DBMS_JAVA 패키지 오류가 발생하게 됩니다. 그러므로 rmjvm.sql 스크립트를 실행하여 OracleJVM을 완전히 제거하고, 설치 스크립트를 사용하여 다시 OracleJVM을 설치하는 것만이 이러한 경우에 있어서의 해결책이 될 것입니다.

업그레이드 스크립트를 실행하기 전에, init.ora 파일에서 _SYSTEM_TRIG_ENABLED 초기화 매개 변수가 FALSE로 설정되어 있는지를 확인하십시오. 만약 초기화 매개 변수가 현재 설정이 안 되어 있다면, 명시적으로 FALSE로 설정해야 합니다. 그리고 업그레이드가 끝난 후에는 다시 TRUE로 설정할 수도 있습니다.

다음 과정은 어떠한 릴리스로부터 업그레이드할 것인가를 확인해 보고, 해당되는 적당한 스크립트를 실행하는 것입니다. 아래는 실행에 필요한 스크립트들의 목록을 보여 주고 있습니다. 이 목록은 모든 Oracle8i 버전들의 스크립트들을 포함하고 있습니다:

릴리스 실행 스크립트
8.1.5 to 8.1.6 jvmu815.sql
8.1.6 to 8.1.7 jvmu816.sql
8.1.7 to 9.0.1 jvmu817.sql

주의: 9.0.1에서 9.2로 업그레이드할 때는, OracleJVM 업그레이드가 9.2의 데이타베이스 업그레이드에서 처리되어야만 합니다.

업그레이드 전부터 있었던 사용자 자바 클래스들의 경우, 업그레이드 스크립트 실행 후에는 계속 제 자리에 있지만, 더 이상 사용할 수가 없게 되었습니다. 그러나, 이 클래스들은 사용될 때는 내재적으로 다시 유효화가 됩니다. 한편, 그 클래스들을 명시적으로 다시 유효화 시키고 싶다면, ALTER JAVA CLASS 명령문을 사용하십시오.

9.2 이전의 릴리스를 업그레이드 할 때는 catxsu.sql 스크립트를 실행하면 됩니다. 그리고, 한번 업그레이드가 끝나게 되면 데이타베이스를 종료하고 재시작하십시오.

패치 세트 적용

패치 세트 적용 시, 패치 세트 readme 파일에 있는 모든 지시 사항들에 따라서 정확히 작업했음에도 불구하고 부적합한 자바 객체들이 남아있는 경우가 있습니다. 이러한 경우에는, 객체들을 수동으로 다시 컴파일을 하면 다시 유효화가 됩니다.

결론

데이타베이스 내에서 안정적으로 OracleJVM을 수행하는 것은 매우 기능적인 면을 갖고 있습니다. 그리고, OracleJVM은 성공적인 설치가 한번만 이루어지면, 아무런 문제 없이 계속 사용할 수가 있습니다. 한편, OracleJVM을 설치하거나 업그레이드할 때는 성공적인 설치 또는 업그레이드를 위하여 최고의 성공 사례들을 참조하시기 바랍니다.

Madhavi Yeleswarapu (madhavi.yeleswarapu @oracle.com)는 약 4년간 Oracle Support Services (OSS) 에서 근무해 왔고 problem avoidance architecture (PAA) JVM 문제를 전공으로 하는 senior technical analyst입니다. Brian Bombard (brian.bombard@oracle.com)는 약 4년간 OSS에서 근무해 왔고 PAA의 program manager입니다.

 

http://www.oracle.com/technology/oramag/oracle/03-mar/o23support.html
http://www.oracle.com/technology/oramag/oracle/03-mar/o23support_l1.html
http://www.oracle.com/global/kr/magazine/webcolumns/2003/o23support.html

728x90

댓글