2014년 6월 25일 수요일

Solaris에서의 오라클 메모리[오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]


Solaris에서의 오라클 메모리 

1.        오라클 Process의 소개 

Backgroud Processes : Database Instance가 시작 될 때 생성되며 이름은 “ora_ProcessName_SID”등으로 붙여 집니다. 예를 들어 system monitor background process의 경우 database instance name이 WINK라면 ora_smon_WINK등으로 이름이 부여 됩니다. 

User or Client Processses : 이러한 Processes는 오라클 서버와 작업을 위해 오라클 클라이언트 프로그램이 시작될 때 클라이언트 쪽에 생성 됩니다. 오라클 클라이언트 프로그램이란 SQL*Plus, SQLLDR, EXP등을 이야기 합니다. 이러한 Processes는 대체로 Command의 이름과 같은 프로세스의 이름이 생성됩니다, 예를 들면 SQL*Loader의 명령인 SQLLDR을 실행 시키면 SQLLDR이라는 User Process가 만들어 지는 겁니다. 

Shadow or Server Processes : 이러한 프로세스가 하는 일은 오라클 클라이언트의 요청을 오라클 Database와의 사이에서 전달하는 역할을 합니다. Shadow Process는 단일 클라이언트 Process에 대한 dedicated 또는 MTS 환경에서의 multi-thread server가 될 수 있습니다. 

2.        Oracle Memory Usage 

Oracle memory의 사용은 2가지 타입으로 나누어 지는데 private 또는 shared 입니다. 
Private memory는 오직 Single Process에 의해 사용되어 지며 그게 반해 shared memory는 1개 이상의 Process에 의해 사용되어 집니다. 

Oracle에서 shared memory의 대부분은 SGA 입니다. SGA는 모든 background processes와 shadow processes에 대한 가상 어드레스 공간으로 매핑 됩니다. 

“top”, “pd –lf”와 같은 명령으로 표시되는 메모리의 사용 현황은 shared와 private를 구분하지 못하며 각각의 background와 shadow processes안에서 SGA의 현황만을 보여 줍니다. 

3.        omemuse 

Unix Shell script인 “omemuse”는 /usr/proc/bin/pmap에 의존해서 간단히 프로세스의 메모리 사용을 확인 할 수 있는 명령 입니다. 도움말을 얻기 위해서는 다음과 같이 “h” 옵션을 이용 합니다. 

% omemuse h 

이 스크립트는 기술한 Oracle Processes에 대응하는  pmap을 실행 시켜 얼마나 많이 어던 타입의 메모리가 이용 되는지에 대한 리포트를 만들어 냅니다. 

모든 oracle shadow process와 background processes에 대한 메모리 사용에 대한 Snapshop 을 얻기 위해서는 다음과 같이 하면 됩니다. 

%omemuse SB 

이 명령은 모든 oracle의 shadow, background 프로세스에 의해 사용되는 shared memory에 따라 oracle shared processes에 대한 private memory와 모든 background process에 대한 총 private memory를 표시 합니다. 

4.        다음은 솔라리스 환경에서 오라클이 사용하는 메모리에 대한 리포트를 만들어 주는 간단한 C 프로그램 입니다. 

#!/usr/bin/sh 

# Copyright 2001 Oracle Corporation 

# program: omemuse (Oracle MEMory USagE) 
# by Richard Gulledge 

# modification history: 
# date        by        comments 
# ----------  --------  ---------------- 
# 11/15/1999  rgulledg  original program 
# 04/16/2001  rgulledg  minor usage check mods 


usage() 

echo "Usage: $0 [ SB ]" 
echo "Usage: $0 [ P <pid> ]" 
echo "Usage: $0 [ h ]" 
echo " " 
echo "specify 'S' for Oracle shadow processes" 
echo "specify 'B' for Oracle background processes (includes shared memory SGA)" 
echo "specify 'h' for help" 
echo " " 


echo " " 


# check usage 

if [ $# = "0" ];then 
  usage;exit 1 
fi 
Parm1=$1 
if [ $Parm1 = "h" ];then 
  echo "This script uses the Sun Solaris pmap command to determine memory usage" 
  echo "for Oracle server [B]ackground processes and/or [S]hadow processes." 
  echo "An individual [P]rocess can also be specified." 
  echo " " 
  echo "Although the Oracle server background processes memory usage should" 
  echo "remain fairly constant, the memory used by any given shadow process" 
  echo "can vary greatly.  This script shows only a snapshot of the current" 
  echo "memory usage for the processes specified." 
  echo " " 
  echo "The 'B' option shows the sum of memory usage for all Oracle server" 
  echo "background processes, including shared memory like the SGA." 
  echo " " 
  echo "The 'S' option shows the sum of private memory usage by all" 
  echo "shadow processes.  It does not include any shared memory like the" 
  echo "SGA since these are part of the Oracle server background processes." 
  echo " " 
  echo "The 'P' option shows memory usage for a specified process, broken" 
  echo "into two categories, private and shared.  If the same executable" 
  echo "for this process was invoked again, only the private memory" 
  echo "would be allocated, the rest is shared with the currently running" 
  echo "process." 
  echo " " 
  usage;exit 1 
fi 
echo $Parm1|grep '[SBP]' > /dev/null 
ParmFound=$? 
if [ $ParmFound != "0" ];then 
  usage;exit 1 
fi 
echo $Parm1|grep P > /dev/null 
ParmFound=$? 
if [ $ParmFound = "0" ];then 
  if [ $Parm1 != "P" ];then 
    usage;exit 1 
  fi 
  if [ "X$2" = "X" ];then 
    usage;exit 1 
  fi 
  Parm2=$2 
  echo $Parm2|grep '[^0-9]' > /dev/null 
  ParmFound=$? 
  if [ $ParmFound = "0" ];then 
    usage;exit 1 
  fi 
  PidOwner=`ps -ef | grep -v grep | grep $Parm2 | grep -v $0 | awk '{print $1}'` 
  CurOwner=`/usr/xpg4/bin/id -un` 
  if [ "X$PidOwner" != "X$CurOwner" ];then 
    echo "Not owner of pid $Parm2, or pid $Parm2 does not exist" 
    echo " " 
    usage;exit 1 
  fi 
else 
  if [ "X${ORACLE_SID}" = "X" ];then 
    echo "You must set ORACLE_SID first" 
    usage;exit1 
  fi 
fi 


# initialize variables 

Pmap="/usr/proc/bin/pmap" 
SharUse="/tmp/omemuseS$$" 
PrivUse="/tmp/omemuseP$$" 
ShadUse="/tmp/omemuseD$$" 
PidPUse="/tmp/omemusePP$$" 
PidSUse="/tmp/omemusePS$$" 
TotalShad=0 
TotalShar=0 
TotalPriv=0 
PidPriv=0 
PidShar=0 


# shadow processes 

echo $Parm1|grep S > /dev/null 
ParmFound=$? 
if [ $ParmFound = "0" ];then 
  ShadPrc="`ps -ef|grep -v grep|grep oracle$ORACLE_SID|awk '{print $2}'`" 
  echo "" > $ShadUse 
  for i in $ShadPrc;do 
    $Pmap $i | grep "read/write" | grep -v shared | \ 
      awk '{print $2}' | awk -FK '{print $1}' >> $ShadUse 
  done 
  for i in `cat $ShadUse`;do 
    TotalShad=`expr $TotalShad + $i` 
  done 
  TotalShad=`expr $TotalShad "*" 1024` 
  echo "Total Shadow  (bytes) :        $TotalShad" 
  /bin/rm $ShadUse 
fi 


# non-shared portion of background processes 

echo $Parm1|grep B > /dev/null 
ParmFound=$? 
if [ $ParmFound = "0" ];then 
  OrclPrc="`ps -ef|grep -v grep|grep ora_|grep $ORACLE_SID|awk '{print $2}'`" 
  BkgdPrc="`echo $OrclPrc|awk '{print $1}'`" 
  echo "" > $PrivUse 
  for i in $OrclPrc;do 
    $Pmap $i | grep "read/write" | grep -v shared | \ 
      awk '{print $2}' | awk -FK '{print $1}' >> $PrivUse 
  done 
  for i in `cat $PrivUse`;do 
    TotalPriv=`expr $TotalPriv + $i` 
  done 
  TotalPriv=`expr $TotalPriv "*" 1024` 
  echo "Total Private (bytes) :        $TotalPriv" 


# shared portion of background processes 

  echo "" > $SharUse 
  $Pmap $BkgdPrc | grep "read/exec" | \ 
    awk '{print $2}' | awk -FK '{print $1}' >> $SharUse 
  $Pmap $BkgdPrc | grep "shared" | \ 
    awk '{print $2}' | awk -FK '{print $1}' >> $SharUse 
  for i in `cat $SharUse`;do 
    TotalShar=`expr $TotalShar + $i` 
  done 
  TotalShar=`expr $TotalShar "*" 1024` 
  echo "Total Shared  (bytes) :        $TotalShar" 
  /bin/rm $SharUse $PrivUse 
fi 


# non-shared portion of pid 

echo $Parm1|grep P > /dev/null 
ParmFound=$? 
if [ $ParmFound = "0" ];then 
  echo "" > $PidPUse 
  $Pmap $Parm2 | grep "read/write" | grep -v shared | \ 
    awk '{print $2}' | awk -FK '{print $1}' >> $PidPUse 
  for i in `cat $PidPUse`;do 
    PidPriv=`expr $PidPriv + $i` 
  done 
  PidPriv=`expr $PidPriv "*" 1024` 
  echo "Total Private (bytes) :        $PidPriv" 


# shared portion of pid 

  echo "" > $PidSUse 
  $Pmap $Parm2 | grep "read/exec" | awk '{print $2}' | \ 
    awk -FK '{print $1}' >> $PidSUse 
  $Pmap $Parm2 | grep "shared" | awk '{print $2}' | \ 
    awk -FK '{print $1}' >> $PidSUse 
  for i in `cat $PidSUse`;do 
    PidShar=`expr $PidShar + $i` 
  done 
  PidShar=`expr $PidShar "*" 1024` 
  echo "Total Shared  (bytes) :        $PidShar" 
  /bin/rm $PidPUse $PidSUse 
fi 


# Display grand total 

Gtotal="`expr $TotalShad + $TotalPriv + $TotalShar + $PidPriv + $PidShar`" 
echo "                        -----" 
echo "Grand Total  (bytes) :        $Gtotal" 
echo " " 




5.        다음은 위의 스크립트에 대한 결과 입니다. (omemuse.out) 

/* 
 ** ---------------------------------------- 
 ** Memory Usage by UNIX PID 
 ** ---------------------------------------- 
*/ 

% omemuse P 9053 

Total Private (bytes) : 1638400 
Total Shared  (bytes) : 770957312 
                        ----- 
Grand Total  (bytes) : 772595712 

/* 
 ** ---------------------------------------- 
 ** Memory Usage for all Backgroup Processes 
 ** (Including Shared Memory) 
 ** ---------------------------------------- 
*/ 

% omemuse B 

Total Private (bytes) : 12476416 
Total Shared  (bytes) : 770957312 
                        ----- 
Grand Total  (bytes) : 783433728 


/* 
 ** ---------------------------------------- 
 ** Memory Usage for all Shadow Processes 
 ** (Excluding Shared Memory) 
 ** ---------------------------------------- 
*/ 

% omemuse S 

Total Shadow  (bytes) : 233586688 
                        ----- 
Grand Total  (bytes) : 233586688 


/* 
 ** ---------------------------------------- 
 ** Memory Usage for all Oracle Processes 
 ** (Including Shared Memory) 
 ** ---------------------------------------- 
*/ 

% omemuse SB 

Total Shadow  (bytes) : 223354880 
Total Private (bytes) : 12476416 
Total Shared  (bytes) : 770957312 
                        ----- 
Grand Total  (bytes) : 1006788608 

오라클자바커뮤니티교육센터, 개발자전문교육, 개인80%환급 
www.oraclejavacommunity.com


평일주간(9:30~18:10) 개강
(6/30)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(6/30)[기업100%환급]안드로이드개발자과정
(6/30)[기업100%환급]SQL기초에서 Schema Object까지
(7/07)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍
(7/07)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(7/07)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 
(7/07)[채용예정교육]오라클자바개발잘하는신입뽑기프로젝트,교육전취업확정

평일야간(19:00~21:50) 개강
(6/26)SQL초보에서실전전문가까지
(7/01)안드로이드개발자과정
(7/01)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(7/02)Spring3.X, MyBatis, Hibernate실무과정
(7/02)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/02)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
(7/03)웹퍼블리싱 마스터
(7/15)MyBatis3.X, Hibernate4.X ORM실무과정
(7/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지

주말(10:00~17:50) 개강
(6/28)Spring3.X, MyBatis, Hibernate실무과정
(6/28)안드로이드개발자과정
(6/28)실무예제로 배워보는 jQuery(개발자/디자이너를위한)
(6/28)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(7/05)SQL초보에서 Schema Object까지
(7/12)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/12)MyBatis3.X, Hibernate4.X ORM실무과정
(7/12)개발자를위한PLSQL,SQL튜닝,힌트
(7/13)C#,ASP.NET마스터

주말저녁(18:30~22:20) 개강
(6/28)JAVA,Network&WEB&Framework
(6/28)SQL기초에서실무까지

댓글 없음:

댓글 쓰기