반응형

Oracle Enterprise Manager를 재설치하던중 새로이 발생한 트러블을 정리해둔다.

과거 포스팅 한 EM재설치 수순의 (2) 를 실행하다가 다음의 에러가 발생했다.

>SQL> drop user sysman cascade;
>drop user sysman cascade
>*
>行1でエラーが発生しました。:
>ORA-00604: 再帰SQLレベル1でエラーが発生しました。
>ORA-00942: 表またはビューが存在しません。
>
>
>SQL> drop user mgmt_view cascade;
>drop user mgmt_view cascade
>          *
>行1でエラーが発生しました。:
>ORA-01918: ユーザー'MGMT_VIEW'は存在しません
>
>
>SQL> drop role mgmt_user;
>drop role mgmt_user
>          *
>行1でエラーが発生しました。:
>ORA-01919: ロール'MGMT_USER'は存在しません
>
>
>SQL> drop public synonym mgmt_target_blackouts;
>drop public synonym mgmt_target_blackouts
>                    *
>行1でエラーが発生しました。:
>ORA-01432: 削除するパブリック・シノニムが存在しません。
>
>
>SQL> drop public synonym setemviewusercontext;
>drop public synonym setemviewusercontext
>                    *
>行1でエラーが発生しました。:
>ORA-01432: 削除するパブリック・シノニムが存在しません。


이미 OEM의 리포지토리가 전부 삭제되었을때 나오는 메세지이다. 하지만 이후 계속 진행하다가 수순 (4)에서 emca -a -c 커맨드를 실행하면 최종적으로 다음의 메세지가 출력되며 설치작업을 실패하였다.

>SEVERE: Repository already exists.  Fix the error(s) and run EM Configuration As
>sistant again in standalone mode.
>Could not complete the configuration. Refer to the log file for details

기존 리포지토리가 전부 삭제되지 않았다는 뜻이다.




이 현상이 발생하는 이유는 EM의 관리자권한을 가진 유저인 sysman의 스키마 딕셔너리 정보에 문제가 발생해서 정합성을 잃어버렸기 때문인데 이를 해결하기 위해서는 해당 DB를 재작성할 필요가 있다. 그러기 위해서는 다음 커맨드를 실행한다.

$ORACLE_HOME/rdbms/admin/catqueue.sql

이후 다시 EM의 재설치수순을 밟아보면 정상적으로 진행되는것을 확인할 수 있다.


이상.

출처 : http://elflord.egloos.com/2355582
반응형
반응형

테스트용 Oracle10g 운용서버의 Enterprise Manager에 문제가 생긴건 거진 두달전 이야기이다. 그동안 줄곧 복구해야겠다고 마음먹었으나 기타 업무가 산적해있던 관계로 줄곧 미루어오다가 드디어 전번주부터 수복작업에 착수했다.

일단 증상으로는 Enterprise Manager에 접속이 되지않고 기동명령을 내리면 기동되었다는 메세지가 나오지만 스테이터스를 확인하면 여전히 not running 상태로 표시된다.

일주일동안 줄곧 OiSC에 문의하고 적용하며 테스트 한 결과 오늘에야 간신히 복구가 가능했다.

결국 내린 해결책은 문제점을 찾아내서 고치는게 아니라 기존의 Enterprise Manager 의 설정 및 Repository, 그리고 서비스 구성파일을 깔끔하게 지워버리고 나서 구성 요소를 새로 인스톨하는 방법이었다. (엘레강스한 방법을 원했건만 결국 무식하게 힘으로 밀어붙이는 방법밖에 알 수 없었다. ㅠㅠ)
이 방법은 Enterprise Manager에 관계된 자료만 손대므로 DB의 데이터는 당연히 안전하다.

복구과정 및 결과를 기록해둔다.
(단 이 과정은 RAC환경에서 ASM을 적용한 서버의 경우이다. 그렇지 않은 경우는 적절히 고쳐야 함.)

Oracle10g Enterprise Manager 복구(재구성) 순서

1) Management Repository 를 삭제한다.

% cd $ORACLE_HOME/sysman/admin/emdrep/bin
% ./RepManager < 호스트 이름 > < 리스너 포트 번호 > < SID > -sys_password < SYS 유저 패스워드 > -action drop

2) DBA권한을 가진 유저로 SQL*Plus 에 접속해서 다음의 명령을 실행한다.

drop user sysman cascade;
drop user mgmt_view cascade;
drop role mgmt_user;
drop public synonym mgmt_target_blackouts;
drop public synonym setemviewusercontext;

3) Enterprise Manager 서비스 구성파일을 삭제한다.

% emca -c -x < DB_NAME > 을 실행.

※ < DB_NAME > 은 초기화 파라메터 db_name 에서 지정하는 값으로 < SID > 가 아닌점에 주의할것.
※ ORACLE_HOME, ORACLE_SID 가 미리 설정되어 있는 환경에서 해야할 필요가 있음. (그냥 오라클 유저로 하는게 제일 속편하다.)

4) Enterprise Manager 서비스 구성파일을 새롭게 설치하기위해 다음 명령을 실행한다.

% emca -a -c

※ -a : ASM 환경에서 설정하는 옵션.
※ -c : Real Application Cluster 환경에서 설정하는 옵션.

5) 4)를 실행하면 다음의 입력을 요구받는다.

리스너의 포트번호
클러스터 이름(모를경우 ORACLE_HOME/install/cluster.ini 에서 cluster_name 으로 지정된 값 확인)
데이터베이스 이름 (초기화 파라메터 dbname 에 지정된 값)
서비스 이름(데이터베이스의 service_name. lsnrctl status < 리스너 이름 > 등으로 확인가능 )
통지용 메일주소:(입력안해도 무관, 걍 엔터)
통지용 메일게이트웨이:(역시 입력안해도 무관, 걍 엔터)
ASM ORACLE_HOME [ ... ] (디폴트설정이면 그냥 엔터)
ASM포트 [ ... ] (역시 디폴트설정이면 그냥 엔터)
ASM유저 롤 [ SYSDBA ] (역시 디폴트설정이면 그냥 엔터)
ASM유저 이름 [ SYS ] (역시 디폴트설정이면 그냥 엔터)
ASM유저패스워드
DBSNMP유저 패스워드
SYSMAN유저 패스워드
SYS유저 패스워드

6) 이상으로 작업종료. Enterprise Manager 가 정상기동 되었는지 확인해본다.

출처 : 오라클 KROWN

이상.
반응형
반응형


유저 : root
파일 : /etc/inittab
시스템 : aix 5.3

주의사항 : respawn 옵션이 있기전에 넣어야 정상적으로 작동
 # USER SHELL #
myroute:2:once:/usr/local/bin/sys_route.sh > /dev/console 2>&1
mydbstart:2:wait:/usr/local/bin/dbstart > /dev/console  2>&1
myjeusstart:2:once:/usr/local/bin/jeusstart > /dev/console 2>&1
mymegatier:2:once:/usr/local/bin/megatierstart > /dev/console 2>&1
#############

myroute 는 라우팅 설정을 하는 파일
mydbstart 는 oracle 을 시작하고 리스너 까지 실행
myjeusstart는 제우스 시작을 함
mymegatier 연계 솔루션을 시작함.

단 mydbstart는 wait를 걸어 실행하고 쉘이 끝날 때까지 기다림.

모든 .sh 쉘 파일은 실행가능한 옵션으로 설정함 (chmod +x 파일명.sh)

su - 사용자계정 -c (실행명령)

파일 : /usr/local/bin/sys_route.sh
 # 시스템 라우팅 세팅 쉘
# 기본 라우팅 설정 세팅
 /usr/sbin/route add 0.0.0.0 -netmask 0.0.0.0 192.168.0.1 -if en2

파일 : /usr/local/bin/dbstart
 su - oracle -c /oracle/product/102/VMS/bin/dbstart

파일 :  /oracle/product/102/VMS/bin/dbstart

#!/usr/bin/sh
# ORACLE START
/oracle/product/102/VMS/bin/sqlplus '/as sysdba' <<-EOF
startup
exit 0

EOF

# LISTENER START
/oracle/product/102/VMS/bin/lsnrctl start


파일 : /usr/local/bin/jeusstart
su - emdnet -c /home/jeus5/bin/jboot


위와 같이 설정하면 정상적으로 작동함...

단.....

AIX에서 inittab 파일에서 default init 설정을 확인하면 대부분이 level 2이므로

/etc/rc.d/rc2.d/ 밑에 S01파일명 형태의 link를 걸어도 무방하다~
반응형
반응형

유닉스도 여러종류가 있는데 어떤 유닉스인가요? hp,sun,ibm...등등..

.profile에 넣어서는 오라클이 자동실행이 되질 않습니다....

sun unix기준으로 자동으로 오라클이 올라오게 하려면...


sun solaris 부팅 시 oracle DB를 auto startup하도록 하는 데 관련된 화일들이다.

/etc/inittab : o/s의 초기화 과정을 조절하는 화일
/etc/rc2 : 부팅 run-level 2 에서 사용되는 스크립트
/etc/rc0 : 부팅 run-level 0 에서 사용되는 스크립트
/etc/rc2.d/S99dbstart : /etc/init.d/dbstart 에 대한 symbolic link
/etc/rc0.d/K01dbshut : /etc/init.d/dbshut 에 대한 symbolic link
/var/opt/oracle/oratab : 시스템에 설치된 오라클 인스턴스에 대한 정보.

(참고)
/etc/init.d/dbstart, dbshut 화일은 super user(root)로 생성하시고,
symbolic link도 super user로 만드시기 바랍니다.
이 화일들은 super user가 owner가 되도록 하고, super user(root)만이
실행 가능하도록 해야 합니다.


1. 먼저 vi /etc/inittab 화일을 열어보십시오.

ap::sysinit:/sbin/autopush -f /etc/iu.ap
fs::sysinit:/sbin/rcS >/dev/console 2>&1 is:3:initdefault:
p3:s1234:powerfail:/usr/sbin/shutdown -y -i5 -g0 >/dev/console 2>&1
s0:0:wait:/sbin/rc0 >/dev/console 2>&1 s1:1:wait:/usr/sbin/shutdown -y -iS -g0 >/dev/console 2>&1 s2:23:wait:/sbin/rc2 >/dev/console 2>&1 s3:3:wait:/sbin/rc3 >/dev/console 2>&1 s5:5:wait:/sbin/rc5 >/dev/console 2>&1 s6:6:wait:/sbin/rc6 >/dev/console 2>&1 fw:0:wait:/sbin/uadmin 2 0 >/dev/console 2>&1 of:5:wait:/sbin/uadmin 2 6 >/dev/console 2>&1 rb:6:wait:/sbin/uadmin 2 1 >/dev/console 2>&1 sc:234:respawn:/usr/lib/saf/sac -t 300
co:234:respawn:/usr/lib/saf/ttymon -g -h -p "`uname -n` console login: " -T
sun
-d /dev/console -l console -m ldterm,ttcompat

s1부터 s6까지 os file들에 대해 위와 같이 device redirection이 연결되어
있으면 됩니다.

------------------------------------------------------------------------
s2:23:wait:/sbin/rc2 >/dev/console 2>&1
위와 같이 설정하면 run-level 2일 경우 /sbin/rc2 스크립트가 실행된다.
/sbin/rc2 는 /etc/rc2.d 디렉토리에 들어있는 스크립트를 실행한다.
만약 스크립트가 S 로 시작하면 /sbin/rc2 는 이 스크립트에 startup 파라미
터를 부여하고 여기서 지정된 프로세스를 실행시킨다.
따라서 /etc/rc2.d/S99dbstart 화일을 사용하여 dbstart를 실행한다.

shutdown 과정도 거의 비슷하다. /etc/inittab 에 다음과 같은 라인을 보자.

s0:0:wait:/sbin/rc0 >/dev/console 2>&1
이것은 /sbin/rc0 를 실행시키는데 /sbin/rc0 는 /etc/rc0.d 디렉토리에
들어있는 스크립트를 실행시킨다.
스크립트 이름이 K 로 시작하면 이것은 stop 파라미터를 갖고 실행되어서 이
스크립트에 지정된 프로세스를 정지시킨다.
따라서 /etc/rc0.d/K01dbshut 스크립트는 stop 파라미터를 갖고 실행되며
이 스크립트는 $ORACLE_HOME/bin/dbshut 스크립트를 실행시켜서 오라클을
shutdown 시킨다.
------------------------------------------------------------------------


2. 그 다음에 vi /etc/rc2 화일을 한번 열어보세요.

이 스크립트 화일은 run-level 2에서 사용되는 스크립트입니다.
특별히 수정할 내용은 없으나, 이 화일이 존재하는지 확인해 보십시오.

PATH=/usr/sbin:/usr/bin
set `/usr/bin/who -r`
if [ x$9 = "xS" -o x$9 = "x1" ]
then
echo 'The system is coming up. Please wait.'
BOOT=yes
...


3. 그 다음에 vi /etc/rc0 화일을 한번 열어보세요.

이 스크립트 화일은 run-level 0에서 사용되는 스크립트입니다.
특별히 수정할 내용은 없으나, 이 화일이 존재하는지 확인해 보십시오.

PATH=/usr/sbin:/usr/bin

echo 'The system is coming down. Please wait.'

# make sure /usr is mounted before proceeding since init scripts
# and this shell depend on things on /usr file system
/sbin/mount /usr > /dev/null 2>&1

# The following segment is for historical purposes.
# There should be nothing in /etc/shutdown.d.
if [ -d /etc/shutdown.d ]
then
for f in /etc/shutdown.d/*
{
if [ -s $f ]
then
/sbin/sh ${f}
fi
}
fi
...


4. /etc/init.d/dbstart 와 /etc/init.d/dbshut 스크립트를 만들어야 합니다.
그 내용은 각각 다음과 같이 한 줄로 작성합니다.

/etc/init.d/dbstart 화일은 다음과 같이 만듭니다.
su - -c <$ORACLE_HOME>/bin/dbstart
/etc/init.d/dbshut 화일은 다음과 같이 만듭니다.
su - -c <$ORACLE_HOME>/bin/dbshut



5. /etc/rc2.d/S99dbstart 화일을 /etc/init.d/dbstart에 대한 link로 생성합니다.

ln -s /etc/init.d/dbstart /etc/rc2.d/S99dbstart


6. /etc/rc0.d/K01dbshut 화일을 /etc/init.d/dbshut에 대한 link로 생성합니다.

ln -s /etc/init.d/dbshut /etc/rc0.d/K01dbshut


7. /var/opt/oracle/oratab 화일을 엽니다.

oratab 화일은 일반 텍스트 화일로서 시스템에 설치된 오라클 인스턴스에 대한
정보를 가지고 있는데 보통 3개의 필드로 이루어져 있으며,
첫번재 필드는 ORACLE_SID, 두번째 필드는 ORACLE_HOME, 세번째 필드는 Y 또는
N으로 구성되어 있습니다. 해당 인스턴스를 auto startup 시키려면 세번째
필드가 반드시 Y로 세팅되어 있어야 합니다.

아래에 예를 참조하세요.

ORA805:/oracle4/ora8/app/oracle/product/8.0.5:Y
ORA815:/oracle4/ora8i/app/oracle/product/8.1.5:Y

(주)
만약, <$ORACLE_HOME>/bin/dbstart 수행에 오류가 있으면 기존의 dbstart 화
일을 다른 path에 rename하고, 아래 내용만 가지고 <$ORACLE_HOME>/bin/ 아래
에 dbstart 화일을 다음과 같이 만든다.

svrmgrl connect internal
startup
exit
EOF


Example
-------
none


Reference doc-uments
-------------------
none



블루틴참조


반응형
반응형
http://219.232.242.145/


무료 IPTV 시청 프로그램
반응형
반응형
Oracle C++ Call Interface (OCCI) is an Application Programming Interface (API) that provides C++ applications access to data in an Oracle database. This API is a significant improvement to the Oracle Call Interface (OCI) API as far as ease of use is concerned. Engineers who have written JDBC (Java Database Connectivity) code will find the OCCI API to be quite similar to that of JDBC

1) The table that is used in the example code is:

Code: SQL
CREATE TABLE EMP(
    empno     NUMBER,
    ename     VARCHAR2(10),
    hireDate  Date);
2) Database Query : Select the contents of the EMP table

Code: Cpp
#include <DbManager.h>
#include <iostream>

using namespace std;

using namespace oracle::occi;

const string sqlString("select empno, ename, hiredate from emp");

const string dateFormat("DD-MON-YYYY HH24:MI:SS");

int main(int argc, char **argv)

{
    if (argc != 2)
    {
        cerr << "\nUsage: " << argv[0] << " <db-user-name>\n" << endl;
        exit(1);
    }
   
    // Initialize OracleServices
   
    DbManager* dbm = NULL;
   
    OracleServices* oras = NULL;
   
    Statement *stmt = NULL;
   
    ResultSet *resultSet = NULL;
   
    try
    {
       
        // Obtain OracleServices object with the default args.
       
        dbm = new DbManager(userName);
       
        oras = dbm->getOracleServices();
       
        // Obtain a cached connection
       
        Connection * conn = oras->connection();
       
        // Create a statement
       
        stmt = conn->createStatement(sqlString);
       
        int empno;
       
        string ename;
       
        Date hireDate;
       
        string dateAsString;
       
        // Execute query to get a resultset
       
        resultSet = stmt->executeQuery();
       
        while (resultSet->next())
        {
           
            empno = resultSet->getInt(1)// get the first column returned by the query;
           
            ename = resultSet->getString(2)// get the second column returned by the query
           
            hireDate = resultSet->getDate(3)// get the third column returned by the query
           
            dateAsString="";
           
            //You cannot check for null until the data has been read
           
            if (resultSet->isNull(1))
            {
                cout << "Employee num is null... " << endl;
            }
            if (resultSet->isNull(2))
            {
                cout << "Employee name is null..." << endl;
            }
            if (resultSet->isNull(3))
            {
                cout << "Hire date is null..." << endl;
            }
            else
            {
                dateAsString=hireDate.toText(dateFormat);
            }
            cout << empno << "\t" << ename << "\t" << dateAsString << endl;
           
        }
       
        // Close ResultSet and Statement
       
        stmt->closeResultSet(resultSet);
       
        conn->terminateStatement(stmt);
       
        // Close Connection and OCCI Environment
       
        delete dbm;
       
    }
    catch (SQLException& ex)
    {
        if (dbm != NULL)
        {
            dbm->rollbackActions(ex, stmt, resultSet); // free resources and rollback transaction
        }
    }
    catch (ExoException& ex1)
    {
        cerr << "\nCaught ExoException:\n" << ex1.getExceptionText() << endl;
        exit(2);
    }
   
    return 0;
}

반응형
반응형

정말 감사합니다.
쉽게 해결될 듯도 합니다.

>안녕하세요?
>oracle 8i이상버전에서는 지원가능합니다.
>datafile을 copy하고 , tablespace의 metadata를 export받아서 다른서버에 import하면 됩니다.
>
>방법
>
>1. 제약사항
>*O/S 종류가 동일해야 한다.
>*nls_characterset, nls_ncharcaterset이 동일해야 한다.
>*db_block_size가 동일해야 한다.
>*transport할려는 tablespaces에 object를 만든 user는 반드시 다른 서버에 존재해야 한다.
>*transport할려는 tablespace set은 self-contained tablespace이여야 한다.
>*sys user로 exp/imp한다.
>(tablespace ts01에 연관된 object가 ts02에도 존재 한다면 두개의 tablespace를 transport해야 한다.
>LOB data, partitioned table, index, table등의 기타 object들은 transport할려는 tablespace set에 포함되어야 한다. 따라서 이것을 옮기기전에 옮길려구 하는 테이블이 self-contained tablespace인지를 파악후에 작업하는것이 필요하다.)
>
>2. self-containd tablespace인 확인방법
>declare
>begin
>dbms_tts.transport_set_check('TS01,TS02',TRUE);
>end;
>/
>실행후
>SELECT * FROM TRANSPORT_SET_VIOLATIONS;
>뷰를 확인해서 선택된 것이 없다면 self-contained tablespace들이다.
>TS01,TS02 : transport할려는 tablespace들이다.
>TRUE : referencial constraint에 대해 self-contained 여부를 check해준다
>
>2. source 서버에서의 작업
>* 옮기려는 tablespace들에 대해 read only로 만든다.(파일 copy시 변경작업이 일어 나지 못하도록 하기위해서)
>alter tablespace ts01 read only;
>alter tablespace ts02 read only;
>
>*tablespaces에 속해 있는 모든 datafile을 대상 서버로 copy한다.(ts01.dbf, ts02.dbf)
>
>*console에서 tablespace의 metadata를 export받는다.
>exp 'sys/oracle as sysdba' file=transtest10.dmp transport_tablespace=y tablespaces=ts01,ts02(windows)
>
>exp 'sys/oracle as sysdba' file=transtest10.dmp transport_tablespace=y tablespaces=ts01,ts02(unix : 816 이상에서)
>
>* export받은 metadata(transtest10.dmp )를 대상서버로 copy한다.
>
>3. 대상 서버에서의 작업
>* transport tablespace에 object를 만든 user에 대해 대상서버에도 user를 생성해준다.
>*console에서 import한다.
>imp 'sys/oracle as sysdba' file=transtest10.dmp transport_tablespace=y
>datafiles=/경로/ts01.dbf,/경로/ts02.dbf (windows)
>
>imp 'sys/oracle as sysdba' file=transtest10.dmp transport_tablespace=y
>datafiles=/경로/ts01.dbf,/경로/ts02.dbf (unix : 816 이상에서)
>
>4. source 서버에서 기존의 tablespaces들을 이용하려면 read write로 바꿔준다.
>alter tablespace tp01 read write;
>alter tablespace tp02 read write;
>
>5. source 서버에서 기존의 tablespaces들이 필요없을 경우 삭제한다.
>alter tablespace tp01 including contents;-->datafile을 console에서 삭제한다.(9i이전 버전)
>alter tablespace tp02 including contents and datafiles;(9i 이상에서 tablespace 및 datafile도 자동으로 삭제한다.)
>
>
>수고하세요
>Good Job
>-----------------------------------------------------------------
>
>
>
>>현재 사용하고 있는 서버에서 한개의 테이블스페이스만 다른 서버로 옮기려고합니다.
>>대상 TableSpace가 워낙 자료가 많아 Export를 받기에는 역부족이고 (시간상으로)
>>해서 DataFile을 이용하여 옮길수 있는 방법이 없는지 문의를 드립니다.
>

출처 : http://www.koug.net/xe/4116
반응형
반응형

앞선 IBM JVM 튜닝 - 2 포스팅에서 AF를 줄이는 방안을 연구해 보자고 했다.

AF란 결국 아래의 두 논리의 경합이다.
1. heap memory상에는 움직일수 없는 객체들이 존재한다. (unmovable objects)
2. heap memory에 객체가 할당되기 위해서는 연속된 memory공간이 필요하다. (contiguous memory block)

여기서 '움직일수 없는 객체(unmovable object)'의 두가지 type에 대해 살펴보도록 하자.

pinned objects

  • java heap 영역이 아닌 space로 부터 참조를 당하고 있는 객체들을 말한다.
    (여기서 java heap 영역이 아닌 space란 말은 native heap, thread stack등의 영역을 의미하는데 이는 포스팅 진행중 설명하겠다.)
  • jvm 내부 스트럭처의 일부분 혹은, jni의 내부의 변수, 혹은 다른 pinned objects등에 의해 reference를 가진 객체를이 해당된다.

dosed objects

  • 순간적으로 pinned objects화 된 객체등을 의미한다.
  • java 코드내의 local variable, 혹은 method 간의 호출에 사용되는 parameter 객체들이 될 수있다.
  • GC Thread가 돌때, 위에서 설명한 dosed object들은 active로 간주되어 GC의 대상에서 벗어나게 되고,이후 GC Thread에 의해서 reference 참조 여부가 결정된 후, 일반 객체처럼 수거된다.

아래의 그림을 보면 쉽게 이해가 갈 것이다.

이러한 unmovable objects들 중, 다행히 dosed object들은 생명이 짧다. 따라서 곧 mark-sweep될 가능성이 많다.
하지만, 문제는 pinned object들 이다. 이 녀석들은 대부분 긴 생명력을 자랑하면서, 제한된 Heap 공간에 자기 멋대로 자리를 틀어 버리기 때문이다.
필연적으로 이러한 pinned objects들이 다수 존재하게 되면, 그만큼 AF가 발생할 확률이 높다는 말이 된다.

그렇다면, 어떠한 방법이 있을까?

사례 1) Heap사용률은 높지 않지만, 다수의 pinned object에 의해 AF가 발생.
이경우는, pinned objects들만 사용할 수 있는 전용공간을 Heap상에 만들어 주면 된다.
이때 사용되는 대표적인 옵션은 아래와 같다.
-Xknnn  -Xpiii[k][,ooo[k]] 

  • nnn is the maximum number of classes used by the application,
  • iii is the size of the primary pinned cluster, 
  • ooo is the size of the overflow pinned clusters in bytes, and
  • Using k changes value from bytes to kilobytes.

윗 영문해설은 'ibm'사이트에서 발췌한 항목에 대한 설명인데, 개인적으로는 다음과 같이 이해하고 있다.
 'nnn'은 메모리에 로딩된 application class의 총 개수를 의미하며, 'iii'는 pinned objects를 연속된 공간에 묶기 위한 cluster된 공간의 크기인데, WAS등이 부팅되면서 로딩시키는 class들 중, pinned성격의 object들이 먼저 위치하는 공간의 크기를 의미하며, 'ooo'는 JVM Runtime시 종종 생성되고 사라지는 pinned object들이 위치하는 공간이다.
통상, -Xk로 표현되는 옵션을 'KCluster'라고 부르며, -Xp로 표현되는 옵션을 'PCluster'라고 부른다.

통상적인 경우, 1.3.1_07 이상 및 1.4.2 이상의 ibm jdk에서는 이를 산출하기 위한 back data를 볼 수 있는 옵션을 제공하고 있다.

  • 1.3.1_07 이상의 1.3대 jvm
    -verbosegc -Xtgc2
  • 1.4.2 이상의 jvm
    -verbosegc -Dibm.dg.trc.print=st_verify

위의 설정이 작동하게 되면, standard out 에 아래와 같은 로그가 찍히게 된다.
<GC(VFY-SUM): pinned=3000(classes=2755/freeclasses=0) dosed=9388 movable=1045582 free=3340>
해석해 보면, 총 2755개의 application class들이 로딩되어 있으며, 이중 unmovable object로는 pinned objects가 3000개, 그리고 순간 pinned화 된 dosed object가 9388개 존재한다. 기타 movable한 object는 1045582개 존재하며, mark가 끊긴 object들은 3340개 존재한다.

위와같은 로그를 획득하였다면, -Xk와 -Xp의 sizing을 해 보자.

  • -Xk sizing
    통상적으로 로딩된 class개수의 10%정도를 더 설정해 주는 것을 권고한다. 위의 data를 기반으로 산출해 보면 아래와 같다.
    2755 + (2755x0.1) = 3030, 따라서 -Xk3030과 같이 설정한다.
  • -Xp sizing
    이부분에 대한 명쾌한 설명을 하고 있는 자료를 본적이 없다. IBM에서도 아래와 같이 설명하고 있다.
    If the problem still persist after setting a -Xk value then you may want to look at setting  -Xp as well and examining the application code to see if you can reduce the size of the larger objects that are being requested.
    Sizing the -Xp option is a complex task and should only be done with assistance from IBM Support.


    위에서 설명한데로, -Xpiii[k][,ooo[k]]형식이 되는데, 'iii'는 pinned objects를 연속된 공간에 묶기 위한 cluster된 공간의 크기인데, WAS등이 부팅되면서 로딩시키는 class들 중, pinned성격의 object들이 먼저 위치하는 공간의 크기를 의미하며, 'ooo'는 JVM Runtime시 종종 생성되고 사라지는 pinned object들이 위치하는 공간으로 이해한다.

    따라서, -Xk옵션으로 별다른 개선효과가 없다면, AF가 발생했을 당시의 gc로그를 기반으로, AF를 유발한 object 크기를 유형별로 산출하여, 단위시간에 몰리는 object크기의 총 합정도를 설정하여, 반복테스트를 통하여 가장 좋은 성능을 발휘하는 임계치를 찾는 방법을 사용해야 할 것 같다.

사례 2) unmovable obejcts는 많지 않지만, 다수의 dosed objects들에 의한 AF발생.

  • -Xcompactgc
    모든 GC사이클 수행시마다, compact를 수행한다. 성능은 크게 감소할 것을 감수해야 한다.
    하지만, 해당 옵션을 활성화 시켜서 AF가 많이 줄어 든다고 판단되면, dosed objects들에 의한 AF가 많다라고 간주하는데 판단기준이 될 수 있다.
  • -Xpartialcompatgc
    compact trigger가 자주 발생한다. 즉, 기존의 full compaction을 점진적(incremental)으로 진행한다.
    비활성화는 -Xnopartialcompactgc로 설정하면 되고, full compaction 모드로 작동하게 된다.
  • -Xgcpolicy
    IBM JVM 튜닝 - 1 을 참조한다.

사례 3) unmovable obejcts는 많지 않지만, 다수의 large size objects들에 의한 AF발생.
large object를 위한 loa(large object area)영역을 지정한다.

  • jdk 1.4 이상
    -Xloratio : loa 영역의 크기를 백분률로 지정한다. 
                   loa 영역을 지정한 경우, 통상적으로 Xmx영역을 일정비율 늘려줘야 한다. 
                   공식은 아래와 같다.               
                                       New Xmx = Current Xmx / (1 - loratio)
  • jdk 1.5이상
    -Xloa : 64k 이상의 large object들만을 담는 loa(large object area)를 활성화 한다.
    -Xloainitial : loa영역의 초기 백분률로 0~0.95의 수치를 지정한다. 기본값은 0.05(5%)이다.
    -Xloamaximum : loa영역의 최대 백분률로 0~0.95의 수치를 지정한다. 기본값은 0.5(50%)이다.



포스팅을 마무리하고 보니, IBM JVM 튜닝중 AF쪽에 포커스가 맞추어 진 느낌이다.
다음에는 IBM JVM 전반에 걸쳐 포스팅을 해볼까 한다.

저작자 표시 비영리 변경 금지
반응형

'WAS > JEUS' 카테고리의 다른 글

JEUS 5 세션 공유  (0) 2011.03.09
JEUSMain.xml Datasource 암호 설정  (0) 2011.01.13
제우스 환경 설정 부분  (0) 2009.03.05
JAVA HEAPDUMP 분석방법  (0) 2009.03.05
웹상에서 제우스 로그 확인하기  (0) 2009.03.05
반응형
자 가보자 !


반응형
반응형

인터넷 검색중... 우연히 작은 사진을 확대했을때 깨어지지 않을수 있는 프로그램이 있다는 것을 알았다....


그러나 단지 부드럽게 효과 내는듯한 것 처럼 보일뿐

선명하게 되는것은 아니였다...

그래도 때에 따라서는 핸드폰 사진을 확대할 때 유용할 것 같아서 올린다...


다운로드 주소 : http://sourceforge.net/projects/imageenlarger/


반응형

+ Recent posts