728x90

  

    For IBM Informix Dynamic Server onCONFIG settings for J/Foundation,

    refer to onconfig.std" in $INFORMIXDIR/etc.


    Location of Shared Memory:

    -------------------------

    When using IBM Informix Dynamic Server with J/Foundation, the onCONFIG

    variable SHMBASE should be set to the following:


        SHMBASE 0x700000010000000


    On AIX, the Java heap allocated by the Java Virtual Machine is created

    in the lowest available segment. If SHMBASE is set to 0x700000000000000,

    the Java heap will be created at an address after the server shared 

    memory segments. This can cause the server to fail with an assertion

    error if additional shared memory segments are dynamically allocated

    later.


    When SHMBASE is set to 0x700000010000000 or above, the 700000000000000

    segment is available for the JVM's Java heap, and the server can

    dynamically add shared memory segments beyond 0x700000010000000.


    If you must use 0x700000000000000 as SHMBASE, allocate enough shared

    memory segments before starting the J/Foundation server. Refer to the 

    "J/Foundation Developer's Guide for information on how to preallocate 

    virtual shared memory segments.


728x90
728x90

 

이번에는  JEUS에서 DB와의 연결기능을 제공하는

DataSource와 DBConnectionPool에 대해 알아보도록 하겠습니다.

 

 

▣ 제목

 

DataSource와 DBConnectionPool이란 무엇인가?

 

 

▣ 내용

 

1. JDBC란?

Java DataBase Connectivity.

Java에서 DataBase와 연동하기 위한 표준 기술을 말한다.

DB의 종류와는 상관 없이 표준 API를 사용하여 DB와의 연동을 할 수 있다.(물론 SQL은 DB별로 달라질 수 있음)

 

 

일반적은 JDBC 코딩 절차

1. JDBC Driver를 로딩 or 등록

2. DB에 대한 Connection 생성

    (DB와 소켓 연결이 되고 DB에 session 하나가 생성됨)

3. 수행할 SQL에 대해 Statement를 생성하고 Statement의 SQL을 수행

    (DB에서 SQL이 수행되고 cursor가 생성됨)

4. 3의 결과로 ResultSet이 생성되고 이것으로 부터 SQL의 수행결과를 조회함.

5. 반드시 ResultSet, Statement를 close

6. 반드시 Connection을 close

    (DB와 소켓 연결이 해제되고 DB의 session도 소멸됨)

 

 

위의 경우 문제점

매번 DB와의 Connection을 얻어서 SQL을 수행하는 구조는

DB와의 socket을 connect/close 하는 오버헤드,

DB에서 session의 생성/소멸 하는 오버헤드

가 있으며 이 부분이 실제로 DB의 부하 뿐만 아니라

AP의 수행시간 중 상당시간이 소요하게 된다.

즉, 속도나 부하측면에서 바람직하지 않다.

 

 

 

개선 방법

매번 DB와의 Connection을 얻어서 SQL을 수행하는 구조대신에

한 번 얻어온 DB와의 Connection을 끊지 않고 재사용하는 구조.

 

 

1. 먼저 Connection Pool에서는 DB로 부터 Connection을 미리 일정갯수 만큼 얻어와서 가지고 있는다.

2. AP에서 DB Connection이 필요한 경우 직접 DB와 연결을 맺지 않고

Connection Pool에 요청하여 Connection Pool이 가지고 있는 Connection들 중 사용가능한 Connection의

reference를 얻는다.(DB와 Connection을 새로 생성하는 것이 아님)

3. AP에서 필요한 작업을 수행한 후 Connection Pool로 사용했던 Connection을 반납한다.

 

이 때 Connection의 생성과 관계되는 어떠한 작업도 하지 않으며

기존에 DB로 부터 얻어온 Connection을 계속 재사용하게 된다.

Pooling을 하는 것과 하지 않는 것의 수행시간 차이는 수십배에 달한다.

 

 

 

2.  WAS에서 DB Connection Pooling 기능을 제공하지 않았던 시절에는?

해당 프로젝트의 선임급 개발자가 직접 DB Connection Pooling 기능을 하는 모듈을 작성하거나,

이미 공개되어있는 Connection Pool 라이브러리를 가져다 사용하였다.

직접 작성한 것이나 공개된 모듈은 안정성이나 여러 장애 상황에 취약한 점이 있다.(상용 WAS에서 제공하는 것에 비해)

그리고 구현된 API가 각 라이브러리 마다 천차만별이어서 서로 호환성이 없고

Connection Pool에서 Connection을 get, put 하는 코드가 서로 달랐다.

 

 

 

3. JEUS 에서 제공하는 DataBase Connection Pooling 기능

 

* DBConnectionPool

2번 항목에서 설명한 것과 동일한 형태의 Connection Pool 모듈이다.

Web Container(Servlet Engine)에 설정(container.xml, WEBMain.xml)하며 2번 항목의 것과 마찬가지로

Connection을 얻는 코드가 표준적이지 않다.

 

* DataSource

J2EE 스펙에서 정의되어 있는 DB 연결방식이다.

Pooling 기능을 제공하며, XA(분산트랜잭션) 기능을 제공한다.

즉, DBConnectionPool 과 기능상 동일하며 XA 기능을 제공한다.

DataSource는 JNDI 에 등록되어 있고, 표준화된 API를 사용하여 얻어올 수 있다.

J2EE Application(Servlet, JSP, EJB, ...)을 호환성있게 작성하려면 DataSource를 사용하여야 한다.

JEUS 서버 환경(JeusMain.xml, JEUSMain.xml)에 설정한다.

 

 

* 두 모듈의 장단점

DataSource를 사용하기 위해서는 JNDI 기반의 API를 사용하여 lookup하는 과정이 필요하다.

이 때 InitialContext 생성 및 lookup 시간에 약간의 시간이 더 소요된다.

DBConnectionPool은 DriverManager나 Driver 기반의 API를 사용하므로

DataSource에 비해 속도가 (아주)약간 빠르다.

대신 DBConnectionPool은 J2EE 표준이 아니다.

만일 J2EE 스펙에 맞추어 개발해야 하거나, XA 기능을 사용하거나, EJB를 사용한다면

DataSource를 사용해야 한다.

두 모듈의 기능적인 차이는 없다. 요즘은 대부분 DataSource를 사용하는 추세이다.

 

 

 

DBConnectionPool

 

 

▣ 내용

 

DBConnectionPool은 JEUS의 Servlet Engine에서 제공해 주는 DB Connection Pool이다.

이전 TechLetter에서 설명한 바와 같이 DBConnectionPool은 J2EE 표준이 아니며,

특정한 코드를 사용하여 Connection을 Pool 로 부터 얻어올 수 있다.

DBConnectionPool은 Servlet Engine이 존재하는 JVM에서만 참조할 수 있다.

Servlet Engine1에서 설정한 DBConnectionPool을 Servlet Engine 2에서 얻어올 수 없다는 이야기다.

 

간단한 샘플(JEUS 4.x, Oracle)

WEBMain.xml

-----------------------------------------------------------

<web-container>
    ...
    <db-connection-pool>
        <pool-name>oraclePool</pool-name>
        <pool-type>shared</pool-type>
        <connection-url>jdbc:oracle:thin:@192.168.0.2:1521:ora9i</connection-url>
        <driver-class-name>oracle.jdbc.driver.OracleDriver</driver-class-name>
        <connection-argument>user=scott;password=tiger</connection-argument>
        <dynamic-increment>false</dynamic-increment>
        <close-long-active-connection>true</close-long-active-connection>
        <max-active-time>300000</max-active-time>
        <db-pool-control>
            <min>2</min>
            <max>10</max>
            <step>2</step>
            <max-idle-time>300000</max-idle-time>
        </db-pool-control>
    </db-connection-pool>
    ...
</web-container>
-----------------------------------------------------------

 

 

설정항목(반드시 메뉴얼 참조하여 설정값의 의미를 정확하게 알아둘 것)

* pool-name

    DBConnectionPool의 이름. AP에서 DBConnectionPool을 찾을 때 사용.

* pool-type

    DBConnectionPool내의 Connection을 worker thread들이 공유할지 여부.

    반드시 shared로 사용할 것.

* connection-url

    해당 DB에 접속하기 위한 JDBC connection URL. DB마다 다름

* driver-class-name

    JDBC driver의 class name. DB마다 다름.

* connection-argument

    DB에 connection을 맺을 때 넘겨줄 정보. ";"로 구분.

    기본적으로 user, password를 포함해야 하고 기타 다른 옵션을 포함할 수 있음.

* dynamic-increment

    DBConnectionPool의 connection 갯수가 max에 도달하였을 때

    AP로 부터 connection 요청이 있는 경우에 DB와 Connection을 임시적으로 증가시킬지 여부.

    true라면 connection을 DB로 부터 하나 더 맺어서 AP에 넘겨주고, AP에서 해당 connection을

    반납하면 해당 connection은 DBConnectionPool로 반납하는 것이 아니라 DB와의 연결을

    완전히 해제해 버린다.

    false이면 DBConnectionPool에 다른 AP가 connection을 반납할 때 까지 대기한다.

* close-long-active-connection

   Pool로 부터 AP가 얻어간 connection이 <max-active-time> 동안 반환되지 않고 있는 경우에

   timeout으로 간주하고 강제로 connection을 회수하여 Pool로 반납한다.

   단, DB connection pool monitoring interval을 주기로 하여 검사하기 때문에

   반드시 여기에 지정된 시간과 일치하지는 않는다.

* max-active-time

   Pool로 부터 얻어온 connection의 timeout을 판단하는 시간주기

* min

   Pool의 초기 갯수

* max

    Pool의 최대 갯수

* step

   min -> max로 증가할 때의 증가폭

* max-idle-time

   DBConnectionPool 내의 connection 갯수가 min과 max 사이인 경우

   DBConnectionPool은 자체적으로 max 에서 min으로 줄어들려는 시도를 한다.

   이 때 이값을 초과하는 connection이 있는 경우 DBConnectionPool에서 제거하는 기준이 된다.

                                      

 

 

DBConnectionPool로 부터 Connection을 얻는 코드

메뉴얼을 보면 3종류의 코드가 나와 있으나 JDBC driver의 동기화와 관련된 문제가 많이 발생하기 때문에

반드시 반드시(매우 중요) 아래의 코드를 사용하도록 한다.

 

Driver myDriver = (Driver)Class.forName("jeus.jdbc.pool.Driver").newInstance();
Connection conn = myDriver.connect("jdbc:jeus:pool:oraclePool", null);

빨간글씨는 pool-name에 지정한 문자열이다.

 

 

▣ 참고사항

 

위의 설정예에서 설명한 설정항목은 기본적인 항목을 설명한 것이며

이외의 다른 수많은 설정항목이 존재하므로 반드시 메뉴얼을 숙지하여

사이트 지원시 적절하게 구성하여야 한다.

장애나 속도 저하를 유발할 수 있으므로

의미를 알 수 없는 설정이 있는 경우에는 반드시 메뉴얼이나 선배사원에게 문의 후 사용할 것.

 

 

이하 설정예.(사이트 지원시 복사/수정해서 사용하도록 한다.)

 

 

JEUS 3.x

=========================================================

Oracle

-----------------------------

    <DBConnectionPool
        ConnectionPoolID="sharedOraclePool"
        ConnectionPoolType="shared"
        ConnectionURL="jdbc:oracle:thin:@harry.freens.org:1521:ORA9i"
        DriverClassName="oracle.jdbc.driver.OracleDriver"
        ConnectionArguments="user=system;password=manager"
        CloseLongActiveConnection="true"
        MaxActiveTimeSecs="60">
            <DBPoolControl
                InitCapacity="2"
                MaxCapacity="10"
                IncrementRate="2"
                MaxIdleTimeSecs="300"/>
    </DBConnectionPool>

MS-SQL

--------------------------------

<Container>
    ...
    </ContextGroup>
    ...
    <DBConnectionPool MaxUseCount="-1"
        ConnectionPoolType="shared"
        CloseDelayMillis="-1"
        MaxActiveTimeSecs="-1"
        ConnectionPoolID="mssql_pool"
        ConnectionArguments="user=sa;password=xxx"
        DriverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
        DynamicIncrement="true"
        ConnectionURL="jdbc:microsoft:sqlserver://165.141.142.136:1433"
        LoginDelayMillis="-1"
        CloseLongActiveConnection="false"
        ConnectionTimeOutSecs="10">
        <DBPoolControl
            MaxCapacity="10"
            InitCapacity="5"
            MaxIdleTimeSecs="300"
            IncrementRate="2" />
        </DBConnectionPool>
    ...
</Container>

 

 

Informix

----------------------------------

<DBConnectionPool
    ConnectionPoolID="infor"
    ConnectionPoolType="shared"
    ConnectionURL="jdbc:informix-sqli://tmaxs1:1526/kangto94:informixserver=ids921"
    DriverClassName="com.informix.jdbc.IfxDriver"
    ConnectionArguments="user=informix;password=hope123"
    CloseLongActiveConnection="false"
    MaxActiveTimeSecs="60"
    DynamicIncrement="false"
    ConnectionTimeOutSecs="10">
    <DBPoolControl
        InitCapacity="4"
        MaxCapacity="10"
        IncrementRate="2"
        MaxIdleTimeSecs="300"/>
</DBConnectionPool>

 

DB2

--------------------------------------

  <DBConnectionPool
                ConnectionPoolID="ibmPool"
                ConnectionPoolType="shared"
                ConnectionURL="jdbc:db2:KFBCIDB"
                DriverClassName="COM.ibm.db2.jdbc.app.DB2Driver"
                ConnectionArguments="user=db2cibt;password=kfbcibt01"
                CloseLongActiveConnection="false"
                MaxActiveTimeSecs="60"
                DynamicIncrement="false"
                ConnectionTimeOutSecs="10">
                <DBPoolControl InitCapacity="0"
                        MaxCapacity="25"
                        IncrementRate="5"
                        MaxAliveTimeSecsWhenRequest="300"
                        MaxIdleTimeSecs="300"/>
  </DBConnectionPool>

 

 

 

JEUS 4.x

=========================================================

Oracle

---------------------------------

<web-container>
    ...
    <db-connection-pool>
        <pool-name>oraclePool</pool-name>
        <pool-type>shared</pool-type>
        <connection-url>jdbc:oracle:thin:@192.168.0.2:1521:ora9i</connection-url>
        <driver-class-name>oracle.jdbc.driver.OracleDriver</driver-class-name>
        <connection-argument>user=scott;password=tiger</connection-argument>
        <dynamic-increment>true</dynamic-increment>
        <close-long-active-connection>true</close-long-active-connection>
        <max-active-time>300000</max-active-time>
        <db-pool-control>
            <min>2</min>
            <max>10</max>
            <step>2</step>
            <max-idle-time>300000</max-idle-time>
        </db-pool-control>
    </db-connection-pool>
    ...
</web-container>

 

Sybase

-------------------------------------

    <db-connection-pool>
        <pool-name>sybaseTest</pool-name>
        <pool-type>shared</pool-type>
        <pooling-rule>stack</pooling-rule>
        <!-- sybase script examples     ip   : listen port -->
        <connection-url>jdbc:sybase:Tds:166.104.172.31:4000</connection-url>        
        <driver-class-name>com.sybase.jdbc2.jdbc.SybDriver</driver-class-name>
        <connection-argument>user=aaa;password=bbbb</connection-argument>
        <db-pool-control>
            <min>3</min>
            <max>10</max>
        </db-pool-control>
    </db-connection-pool>

 

MS-SQL

------------------------------------------

<web-container>
    ...
    <db-connection-pool>
        <pool-name>mssql_pool</pool-name>
        <pool-type>shared</pool-type>
        <connection-url>jdbc:microsoft:sqlserver://165.141.142.136:1433</connection-url>
        <driver-class-name>com.microsoft.jdbc.sqlserver.SQLServerDrive</driver-class-name>
        <connection-argument>user=sa;password=</connection-argument>
        <dynamic-increment>true</dynamic-increment>
        <close-long-active-connection>true</close-long-active-connection>
        <max-active-time>300000</max-active-time>
        <db-pool-control>
            <min>2</min>
            <max>10</max>
            <step>2</step>
            <max-idle-time>300000</max-idle-time>
            <max-alive-time>600000</max-alive-time>
        </db-pool-control>
    </db-connection-pool>
    ...
</web-container>

 

 

MySQL

---------------------------------------------

<web-container>
    ...
    <db-connection-pool>
        <pool-name>mysqlPool</pool-name>
        <pool-type>shared</pool-type>
        <connection-url>jdbc:mysql://localhost:3306/test</connection-url>
        <driver-class-name>org.gjt.mm.mysql.Driver</driver-class-name>
        <connection-argument>user=root;password=passwd</connection-argument>
        <dynamic-increment>true</dynamic-increment>
        <close-long-active-connection>true</close-long-active-connection>
        <max-active-time>300000</max-active-time>
        <db-pool-control>
            <min>2</min>
            <max>10</max>
            <step>2</step>
            <max-idle-time>300000</max-idle-time>
            <max-alive-time>600000</max-alive-time>
        </db-pool-control>
    </db-connection-pool>
    ...
</web-container>


 

 

▣ 제목

 

DataSource

 

 

▣ 내용

 

J2EE 표준?

DataSource는 J2EE 스펙에 포함되어 있다.

이 말은 J2EE Application 작성에서 DB와의 연동은 DataSource를 사용하는 것이 바람직하고

Connection을 얻는 코드나 사용법, 동작 등이 표준화 되어 있다는 말이다.

즉, 타 WAS로의 소스 수정 없이 migration 가능하다.

그리고 connection Pooling 뿐만 아니라 DBConnectionPool에서는 제공하지 않는 분산 환경에서의 Transaction(XA)

기능을 제공한다.(EJB에서는 반드시 DataSource를 사용해야 한다.)

 

DataSource는 JNDI 기반의 코드로 얻어온다.

DataSource는 JNDI 서버에 등록되어 있다가 InitialContext의 lookup() 메소드로 얻어올 수 있다.

즉, 원격(다른 JVM)에서도 InitialContext를 생성하여 DataSource를 얻어서 사용할 수 있다.

 

DataSource의 장점

1. JDBC 코딩시 DB정보에 대한 하드코딩이 필요없다. 설정은 JEUSMain.xml에 들어간다.

2. Pooling이 지원된다.

3. XA(분산트랜젝션)이 지원된다.

4. J2EE 표준이다.(모든 WAS에서의 사용 코드 동일)

5. 다른 JVM에서도 호출하여 사용할 수 있다.

 

JEUS에서 DataSource의 설정과 생성

DataSource는 JeusMain.xml(or JEUSMain.xml)에 설정한다.

JEUS는 기동시 jeus manager가 DataSource 설정을 읽어들여 JNDI에 DataSource를 등록(BIND)한다.

하지만 이 과정에서 DB와의 Connection이 생성되지는 않는다.

DataSource를 lookup()하는 JVM에 Pool이 생성되고 DB와의 Connection을 맺어서 Pool에 집어넣게 된다.

물론 최초 lookup 시에 한번만 Pool 초기화/생성이 이루어지게 된다.

(lookup 이 호출되기 이전에는 Pool이 생성되지 않음에 주의)

요약하면, DataSource는 jeus manager가 JNDI에 bind 시키며 DataSource를 JNDI에서 최초로 lookup할 때

(lookup하는)해당 JVM에서는 Pool이 생성되고 DB와 connection을 생성한다.

 

 

샘플로 알아보자(환경 : JEUS 4.x, Oracle)

----------------------------------------------------------

<jeus-system>

    ...

    <resource>
        <data-source>
            <database>
                <vendor>oracle</vendor>
                <export-name>jdbc/mohwDS</export-name>
                <data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>
                <data-source-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-name>
                <data-source-type>ConnectionPoolDataSource</data-source-type>
                <database-name>dbs001</database-name>
                <user>gworks</user>
                <password>gworks</password>
                <server-name>152.99.129.41</server-name>
                <port-number>1521</port-number>
                <driver-type>thin</driver-type>
                <connection-pool>
                    <pooling>
                        <min>20</min>
                        <max>50</max>
                        <step>5</step>
                        <period>10</period>
                    </pooling>
                    <wait-free-connection>
                        <enable-wait>true</enable-wait>
                        <wait-time>15000</wait-time>
                    </wait-free-connection>
                    <operation-to>180000</operation-to>
                </connection-pool>
            </database>
        </data-source>
        ...
    </resource>
----------------------------------------------------------

 

설정항목

* database

   이 태그 하나가 DataSource 설정 1개를 나타낸다.

* vendor

   DB제공업체. oracle, db2, sybase, others 등의 값을 갖는다.

* export-name

   JNDI에 등록될 이름. JNDI에 등록될 이름은 중복되면 안된다.

* data-source-class-name

   DataSource에서 사용될 JDBC driver내의 class name.

   DB 마다 다르며 data-source-type에 따라서도 달라진다.

* data-source-name

   일반적으로 data-srouce-class-name을 따른다.

* data-source-type

   용도에 따라 DataSource, ConnectionPoolDataSource, LocalXADataSource, XADataSource 중 선택

* database-name

   Database의 이름. Oracle은 SID.

* user

   DB의 user. OS의 user와는 별개임.

* password

   DB user의 password

* server-name

   DB 의 IP or hostname. hostname을 사용할 경우 hosts 파일에 등록되어 있어야 함.

* port-number

   DB 의 listen port

* driver-type

   JDBC driver type. DB 마다 다름.

* min

  Pool의 최소값

* max

   Pool의 최대값

* step

   min에서 max로 증가시 증가폭

* period

   max에서 min으로 감소할 때 제거할 connection 판단 기준시간.(주의 : 분단위임.)

* wait-free-connection

   pool의 connection이 모두 사용중이어서 사용가능한 connection이 없을 때

   AP에서 getConnection()을 호출한 경우의 동작에 대한 설정부분.

   enable-wait이 true이면 wait-time에 지정된 시간만큼 기다리고

   false이면 대기하지 않고 (아마도)null을 리턴할 것이다.(or Exception 발생)

   만일 wait-time에 지정된 시간만큼 기다려도 connection을 얻지 못하는 경우는

   Exception이 던져진다.

* operation-to

   DB와의 연동 작업시 time out 시간.

 

이외에도 많은 설정항목이 있으므로 반드시 메뉴얼을 숙지하여

각 설정항목에 대해 명확히 이해하도록 한다.

 

 

DataSource의 4가지 type

* DataSource

   Connection만 반환한다. Pooling 기능 없음.

* ConnectionPoolDataSource

   Pooling 기능을 하며 connection을 반환한다.

* XADataSource

   Pooling 기능을 하며 XA(분산트랜젝션)을 지원하는 connection을 반환한다.

* LocalXADataSource

   Pooling 기능을 하며 connection을 반환한다.

   Local DB(단일 DB에 단일 user를 사용하는 경우)인 경우 XADataSource처럼 동작한다.(트랜젝션 지원)

 

일반적으로 트랜젝션 지원이 필요없는 작업에는 ConnectionPoolDataSource를 사용한다.

트랜젝션이 지원되는 DataSource인 경우에는 ConnectionPoolDataSource보다

시스템과 DB에 부하를 많이 주게 된다.

트랜젝션 지원이 필요한 작업(EJB, UserTransaction 등)에는 XADataSource나 LocalXADataSource를

사용한다. LocalXADataSource는 실제로는 ConnectionPoolDataSource이지만

단일DB(단일user)에 대해서는 XA처럼 동작하는 DataSource이다.

따라서 multi-DB가 아닌 경우에는 트랜젝션이 필요한 경우에 LocalXADataSource를 사용하는 것이

속도나 부하 측면에서 유리하다.

 

그리고 DataSource type에 따라서 <data-source-class-name>, <data-source-name> 의 설정값이

달라지므로 주의한다.

 

type별 class name

DataSource
  For Oracle : oracle.jdbc.pool.OracleDataSource
  For Sybase : com.sybase.jdbc2.jdbc.SybDataSource
  For db2: COM.ibm.db2.jdbc.DB2DataSource
ConnectionPoolDataSource and LocalXADataSource
  For Oracle : oracle.jdbc.pool.OracleConnectionPoolDataSource
  For Sybase: com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource
  For db2: COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource
XADataSource
  For Oracle : oracle.jdbc.xa.client.OracleXADataSource
  For Sysbae : com.sybase.jdbc2.jdbc.SybXADataSource
  For db2: COM.ibm.db2.jdbc.DB2XADataSource

 

 

▣ 참고사항

 

XADataSource는 트랜젝션을 container에서 관리하기 때문에

AP에서 명시적인 트랜젝션 관리(Connection.setAutocommit(xxx), commit(), rollback())는

Exception이 발생한다.

 

XADataSource를 사용하는 경우에 트랜젝션에 포함되지 않는 select 문장의 수행은

원칙적으로 ConnectionPoolDataSource를 사용해야하나

개발의 편의를 위해 select 문장의 수행도 XADataSource를 사용하는 경우에는

반드시 transaction delegation 기능을 사용하여야 한다.

 

EJB에서 트랜젝션을 사용할 경우나 UserTransaction을 사용할 경우

반드시 XADataSource나 LocalXADataSource를 사용하여야 한다.

 

DataSource는 JEUS 시스템 내(servlet engine, ejb engine, jms engine 등) 뿐만 아니라

단독 java application에서도 JNDI의 lookup 코드를 사용하여 DataSource기능을 사용할 수 있다.

단, DB의 Connection Pool은 JNDI 서버내에 생기는 것이 아니라 해당 JVM에 생기고

Pool은 해당 JVM의 종료시에 소멸된다.

 

 

 

JEUS 3.x 설정샘플

=================================================

Oracle

--------------------------

<JeusSystemConfig>
 <DataSource>
  <Database>
   <Vendor>oracle</Vendor>
   <ExportName>dbsource</ExportName>
   <DatabaseName>orcl</DatabaseName>
   <DataSourceClassName>oracle.jdbc.pool.OracleConnectionPoolDataSource</DataSourceClassName>
   <DataSourceName>oracle.jdbc.pool.OracleConnectionPoolDataSource</DataSourceName>
   <ServiceName/>
   <Description/>
   <NetworkProtocol/>
   <Password>tiger</Password>
   <PortNumber>1521</PortNumber>
   <ServerName>192.168.85.1</ServerName>
   <User>scott</User>
   <DriverType>thin</DriverType>
   <DataSourceType>ConnectionPoolDataSource</DataSourceType>
   <ConnectionPool>
    <MinPoolSize>2</MinPoolSize>
    <MaxPoolSize>6</MaxPoolSize>
    <IncreasingStep>1</IncreasingStep>
    <ResizingPeriod>10</ResizingPeriod>
    <OperationTimeout>30000</OperationTimeout>
    <WaitForFreeConnection>
     <WaitingTime>10000</WaitingTime>
    </WaitForFreeConnection>
   </ConnectionPool>
  </Database>
 </DataSource>

 

MS-SQL

----------------------------

        <Database> 
            <Vendor>unknown</Vendor> 
            <ExportName>sqlDS</ExportName> 
            <DataSourceClassName>jeus.jdbc.driver.blackbox.BlackboxConnectionPoolDataSource</DataSourceClassName> 
            <Property> 
                <Name>URL</Name> 
                <Type>java.lang.String</Type> 
                <Value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=testDB;SelectMethod=cursor</Value> 
            </Property> 
            <Property> 
                <Name>DriverClassName</Name> 
                <Type>java.lang.String</Type> 
                <Value>com.microsoft.jdbc.sqlserver.SQLServerDriver</Value> 
            </Property> 
            <Property> 
                <Name>Password</Name> 
                <Type>java.lang.String</Type> 
                <Value>iidol</Value> 
            </Property> 
            <Property> 
                <Name>User</Name> 
                <Type>java.lang.String</Type> 
                <Value>iidol</Value> 
            </Property>             
            <DataSourceType>ConnectionPoolDataSource</DataSourceType> 
            <ConnectionPool> 
                <MinPoolSize>1</MinPoolSize> 
                <MaxPoolSize>2</MaxPoolSize> 
                <IncreasingStep>1</IncreasingStep> 
                <ResizingPeriod>10</ResizingPeriod> 
                <OperationTimeout>30000</OperationTimeout> 
                <WaitForFreeConnection> 
                    <WaitingTime>10000</WaitingTime> 
                </WaitForFreeConnection> 
            </ConnectionPool> 
        </Database>

 

 

 

Sybase

---------------------------

<DataSource> 
    <Database>
        <Vendor>sybase</Vendor> 
        <ExportName>test_sy</ExportName> 
        <DatabaseName>master</DatabaseName> 
        <DataSourceName>com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource</DataSourceName> 
        <Description>test11</Description> 
        <NetworkProtocol /> 
        <Password>xlaortm</Password> 
        <PortNumber>4100</PortNumber> 
        <ServerName>pollux5</ServerName> 
        <User>sa</User> 
        <DriverType /> 
        <DataSourceType>ConnectionPoolDataSource</DataSourceType>
        <ConnectionPool> 
            <MinPoolSize>6</MinPoolSize> 
            <MaxPoolSize>10</MaxPoolSize> 
            <IncreasingStep>2</IncreasingStep> 
            <ResizingPeriod>3</ResizingPeriod> 
        </ConnectionPool> 
    </Database> 
</DataSource>

 

 

 

Informix

-----------------------------

    <DataSource>
        <Database>
            <Vendor>unknown</Vendor>
            <ExportName>datasource1</ExportName>
            <DataSourceClassName>jeus.jdbc.driver.blackbox.BlackboxConnectionPoolDataSource</DataSourceClassName>
            <Property>
                <Name>URL</Name>
                <Type>java.lang.String</Type>
                <Value>jdbc:informix-sqli://61.33.32.126:1526/bank959:informixserver=tmax5</Value>
            </Property>
            <Property>
                <Name>DriverClassName</Name>
                <Type>java.lang.String</Type>
                <Value>com.informix.jdbc.IfxDriver</Value>
            </Property>
            <Property>
                <Name>Password</Name>
                <Type>java.lang.String</Type>
                <Value>7skswkddl</Value>
            </Property>
            <Property>
                <Name>User</Name>
                <Type>java.lang.String</Type>
                <Value>root</Value>
            </Property>               
            <DataSourceType>ConnectionPoolDataSource</DataSourceType>
            <ConnectionPool>
                <MinPoolSize>4</MinPoolSize>
                <MaxPoolSize>4</MaxPoolSize>
                <IncreasingStep>1</IncreasingStep>
                <ResizingPeriod>10</ResizingPeriod>
                <OperationTimeout>30000</OperationTimeout>
                <WaitForFreeConnection>
                    <WaitingTime>10000</WaitingTime>
                </WaitForFreeConnection>
            </ConnectionPool>
        </Database>
     </DataSource>

 

 

JEUS 4.x

======================================================

 

DB2

--------------------------------

<jeus-system>
    . . .
    <resource>
        <data-source>
            <database>
                <vendor>db2</vendor>
                <export-name>db2local</export-name>
                <data-source-class-name>
                    COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource
                </data-source-class-name>
                <data-source-type>LocalXADataSource</data-source-type>
                <database-name>SAMPLE</database-name>
                <description>Customer DB</description>
                <password>jeus2013</password>
                <encryption>false</encryption>
                <port-number>0</port-number>
                <server-name/>
                <user>db2inst1</user>
                <connection-pool>
                    <pooling>
                        <min>2</min>
                        <max>4</max>
                        <step>1</step>
                        <period>10</period>
                    </pooling>
                    <wait-free-connection>
                        <enable-wait>true</enable-wait>
                        <wait-time>10000</wait-time>
                    </wait-free-connection>
                    <operation-to>30000</operation-to>
                </connection-pool>
            </database>
            . . ..
        </data-source>
        . . .
    </resource>
</jeus-system>

 

 

Oracle

----------------------------

<jeus-system>

 

    <resource>
        <data-source>
            <database>
                <vendor>oracle</vendor>
                <export-name>jdbc/mohwDS</export-name>
                <data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>
                <data-source-type>ConnectionPoolDataSource</data-source-type>
                <database-name>dbs001</database-name>
                <data-source-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-name>
                <user>gworks</user>
                <password>gworks</password>
                <port-number>1521</port-number>
                <server-name>152.99.129.41</server-name>
                <driver-type>thin</driver-type>
                <connection-pool>
                    <pooling>
                        <min>20</min>
                        <max>50</max>
                        <step>5</step>
                        <period>10</period>
                    </pooling>
                    <wait-free-connection>
                        <enable-wait>true</enable-wait>
                        <wait-time>15000</wait-time>
                    </wait-free-connection>
                    <operation-to>180000</operation-to>
                </connection-pool>
            </database>
        </data-source>
        ...
    </resource>

 

 

Sybase

-----------------------

<resource>
        <data-source>
                <database>
                        <vendor>sybase</vendor>
                        <export-name>pms</export-name>
                        <data-source-class-name>com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource</data-source-class-name>
                        <data-source-type>ConnectionPoolDataSource</data-source-type>
                        <database-name>smaf</database-name>
                        <data-source-name>com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource</data-source-name>
                        <description>pms DB</description>
                        <network-protocol>Tds</network-protocol>
                        <user>smaf</user>
                        <password>smaf2003</password>
                        <encryption>false</encryption>
                        <port-number>6100</port-number>
                        <server-name>210.103.193.3</server-name>
                        <connection-pool>
                                <pooling>
                                        <min>10</min>
                                        <max>100</max>
                                        <step>5</step>
                                        <period>10</period>
                                </pooling>
                                <wait-free-connection>
                                        <enable-wait>true</enable-wait>
                                        <wait-time>10000</wait-time>
                                </wait-free-connection>
                                <operation-to>30000</operation-to>
                        </connection-pool>
                </database>
        </data-source>
</resource>

 

 

Informix

--------------------------

<jeus-system>
    . . .
    <resource>
        <data-source>
            <database>
                <vendor>others</vendor>
                <export-name>informixdatasource</export-name>
                <data-source-class-name>
       jeus.jdbc.driver.blackbox.BlackboxConnectionPoolDataSource
                </data-source-class-name>
                <data-source-type>
                    ConnectionPoolDataSource
                </data-source-type>
                <connection-pool>
                    <pooling>
                        <min>4</min>
                        <max>8</max>
                        <step>1</step>
                        <period>600000</period>
                    </pooling>
                    <wait-free-connection>

728x90

'용어' 카테고리의 다른 글

기간계/계정계/정보계/대외계  (0) 2011.03.10
웹 서버와 WAS(Web Application Server)의 정의  (0) 2010.08.19
ISV (independent software vendor)  (0) 2010.06.03
2단계 커밋  (0) 2010.03.02
ERP (enterprise resource planning)  (0) 2010.01.21
728x90

svmon 명령은 메모리의 현재 상태에 관한 정보를 보여줍니다.

표시된 정보는 메모리의 실제 스냅샵을 구성하지 않는데,

그 이유는 svmon 명령이 인터럽트가 가능한 사용자 레벨에서 수행되기 때문입니다.

 

세그먼트는 페이지 세트로, 메모리 소비를 보고하기 위해 사용되는 기본 오브젝트입니다.

그러므로, svmon에 의해 보고되는 통계는 페이지 수 측면에서 표시됩니다.

 

1 페이지는 가상 메모리의 4K 블록이고, 1 프레임은 실제 메모리의 4K 블록입니다.

달리 명시하지 않으면, 모든 통계는 4096 바이트 메모리 페이지 단위입니다.

메모리 소비는 inuse, free, pin, virtual 및 paging space 계수기를 사용하여 보고됩니다.
 
 - inuse 계수기 : 사용된 프레임 수

 - free : 모든 메모리 풀에서 사용 가능한 프레임 수

 - pin : 고정된 프레임 수, 즉 스왑될 수 없는 프레임 수

 - virtual : 시스템 가상공간에 할당된 페이지 수

 - paging space : 페이징 공간에서 예약되거나 사용된 페이지 수

 

한 세그먼트를 여러 개의 프로세스에서 사용할 수 있습니다.

그러한 세그먼트에 속한 각 페이지는 해당 세그먼트를 사용하는 각 프로세스에 대해서

inuse, pin, virtual 또는 pgspace 필드에서 설명됩니다.

 

그러므로, 활성화된 모든 프로세스에 걸친 inuse, pin, virtual 및 pgspace 필드의 합계가

메모리나 페이징 공간의 총 페이지 수를 초과할 수도 있습니다.

 

VMM은 통계 목적으로만 virtual 페이지 계수기를 관리합니다.

즉, 항상 최신 데이터가 아니며 값도 해당되는 inuse 계수기보다 작을 수 있습니다.

 

세그먼트는 다음의 5가지 유형 중 하나에 속합니다.

 

persistent  - 파일 및 디렉토리 조작에 사용되는 세그먼트

working    - 프로세스 및 공유 메모리 세그먼트의 데이터 영역을 구현하기 위해 사용되는 세그먼트

client   - NFS와 CD-ROM 파일시스템과 같은 일부 가상 파일 시스템을 구현하기 위해 사용

mapping  - 메모리에서 파일 맵핑을 구현하기 위해 사용되는 세그먼트

real memory mapping  - 가상 주소 공간으로부터 10 공간에 액세스하기 위해 사용되는 세그먼트

 

----------------------------------

시스템 전체 메모리 사용량 통계 확인

----------------------------------

# svmon -G

                     size      inuse       free        pin    virtual
memory         32760      22182      10578       6035      25932
pg space       65536       8061

                 work       pers       clnt      lpage
pin             6035          0          0          0
in use        17057       5125        0          0

 

간단히 설명하면, 전체 메모리 사이즈는 32760*4096byte/1024/1024 = 127MB.

Free Memory는 10578*4096/1024/1024 = 41MB

 

4096byte를 곱한 이유는 svmon에서 나오는 결과는 전부 페이지단위(1page=4K)이므로....

 

(설명)

memory - 다음을 포함해 실제 메모리의 사용을 설명하는 통계를 지정.

 - size  실제 메모리 프레임의 수(실제 메모리 크기) 
 - inuse   페이지를 포함되는 프레임의 수
 - free  모든 메모리 풀 중 사용 가능 프레임의 수
 - pin  고정된 페이지를 포함하는 프레임의 수
 - virtual  시스템 가상 영역내에 할당된 페이지 수
 
in use - 다음을 포함해 사용중 인 실제 메모리의 서브세트에 대한 통계

 - work  작업 세그먼트 페이지를 포함하는 프레임 수
 - pers  영구 세그먼트 페이지를 포함하는 프레임 수
 - clnt   클라이언트 세그먼트 페이지를 포함하는 프레임 수

 

pin - 다음을 포함해 고정된 페이지가 있는 실제 메모리의 서브세트에 대한 통계 열거.

 - work  작업 세그먼트 페이지를 포함하는 프레임 수
 - pers   영구 세그먼트 페이지를 포함하는 프레임 수
 - clnt   클라이언트 세그먼트 페이지를 포함하는 프레임 수

 

pg space - 페이지공간의 사용을 설명하는 통계를 나타냅니다

 - size 페이징 공간의 크기
 - inuse 사용 중인 페이징 공간 페이지 수

 

-----------------------------
유저별 메모리 사용량 통계 확인
-----------------------------


 # svmon -U root -d   ; root 사용자가 사용하는 메모리 내역
===============================================================================
User                                 Inuse      Pin     Pgsp  Virtual  LPageCap
root                                  10556     2000     5555    16182         Y

-------------------------------------------------------------------------------
     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage
    3922 dtgreet              5045     1823     1705     7781      N     N     N
    7020 rpc.mountd        5032     1826     1595     7629      N     Y     N
    8514 hostmibd           5010     1823     1586     7281      N     N     N
    4518 X                      4981     1825     1938     7838      N     N     N
       1 init                     4979     1823     1579     7576      N     N     N
   13420 getty                4963     1823     1586     7245      N     N     N
    7482 portmap           4877     1823     1614     7513      N     N     N
   13158 getty               4858     1823     1674     7239      N     N     N
    2524 telnetd             4741     1823     1574     7292      N     N     N
    3600 telnetd             4741     1823     1574     7292      N     N     N
   15494 i4lmd              4729     1823     1586     7238      N     N     N
   15752 i4lmd              4722     1823     1586     7221      N     N     N
    7998 snmpd            4717     1823     1616     7339      N     N     N
   12412 i4lmd              4712     1823     1583     7213      N     N     N
   16512 i4lmd              4710     1823     1597     7234      N     N     N
   14972 i4llmd             4705     1823     1627     7217      N     N     N
   14466 i4llmd             4680     1826     1686     7284      N     Y     N
   17386 -ksh               4671     1823     1574     7214      N     N     N
   18012 -ksh               4670     1823     1574     7214      N     N     N
    8256 dpid2               4647     1823     1576     7254      N     N     N
    4756 svmon             4631     1823     1574     7211      N     N     N
    7740 inetd                4628     1823     1574     7225      N     N     N
    9834 cron                 4626     1823     1594     7227      N     N     N
    5166 errdemon          4624     1823     1661     7250      N     N     N
   16256 IBM.AuditRMd   4599     1830     2010     7675      N     Y     N
    5704 prngd               4598     1823     1574     7193      N     N     N
   15998 IBM.ERrmd      4592     1830     2114     7785      N     Y     N
   14212 rmcd               4586     1826     2112     7733      N     Y     N
    7226 syslogd           4573     1823     1608     7205      N     N     N
    5422 srcmstr            4572     1823     1656     7229      N     N     N
    2704 dtlogin <:0>      4567     1823     1602     7202      N     N     N
  15232 IBM.CSMAgentR 4563     1832     2125     7775      N     Y     N
   14712 ctcasd              4562     1830     1968     7566      N     Y     N
    9550 biod                  4555     1823     1574     7160      N     N     N
   13938 diagd                4546     1823     1627     7188      N     N     N
    6268 nfsd                  4542     1823     1597     7175      N     N     N
   11356 qdaemon          4537     1823     1608     7173      N     N     N
   10586 rpc.lockd          4527     1823     1635     7199      N     N     N
    3412 syncd               4525     1823     1603     7159      N     N     N
    4246 dtlogin              4520     1823     1601     7152      N     N     N
   10846 uprintfd            4517     1823     1580     7131      N     N     N
   11618 writesrv           4516     1823     1638     7191      N     N     N
   11094 rpc.lockd         2907     1832     1561     4326      N     Y     N
   10066 nfsd                2906     1832     1561     4326      N     Y     N
    1548 gil                   2898     1827     1563     4320      N     Y     N
    9030 kbiod               2888     1824     1559     4306      N     Y     N
    6726 j2pg                2887     1828     1572     4318      N     Y     N
    1032 xmgc              2884     1823     1559     4302      N     N     N
    1290 netm               2884     1823     1559     4302      N     N     N
    8774 rtcmd              2884     1823     1559     4302      N     N     N
     774 reaper             2884     1823     1561     4302      N     N     N
    3102 lvmbb              2882     1823     1561     4302      N     N     N
     516 wait                 2882     1823     1559     4300      N     N     N
    1806 wlmsched        2882     1823     1561     4302      N     N     N
       0 swapper             4           2         0         4         N     N     N

...............................................................................
SYSTEM segments         Inuse      Pin     Pgsp  Virtual
                                      3008     1888     1631     4487

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual
       0         0 work kernel seg                     -      2880   1821 1559  4298 
     8c5         - work                                    -     23     9     1     23 
    16aa         - work                                   -     22     9    1    23 
    2792         - work                                   -     11     9   18    29 
    1a0f         - work                                    -     11     7   12    23 
    2191         - work                                   -     11     7   12    23 
    3f3e         - work                                   -     11     7   15    22 
    1eae         - work                                  -     10     3    0    10 
    3619         - work                                   -      9     3    3    10 
    2752         - work                                   -      7     3    8    11 
     e26         - work                                   -      5     5    1     6 
    1a2d         - work                                   -      4     4    1     5 
    3c9f         - work                                    -      4     1    0     4

...............................................................................
EXCLUSIVE segments     Inuse      Pin     Pgsp  Virtual
                                      5915      112     3909     8875

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual
     aa4         2 work process private              -    396     2   15   410 
    182c         2 work process private              -    374     2    4   377 
    19cc         2 work process private              -    327     2  119   446 
    365b         - pers /dev/hd2:12338               -    312     0    -     - 
    3b9d         2 work process private              -    296     2  345   640 
    2473         2 work process private              -    275     2   38   313 
    ..........
    ..........(중략)

    3f9e         - pers /dev/hd9var:308              -      0     0    -     - 
    1e8e         1 pers code,/dev/hd2:10638          -      0     0    -     - 
     d67         - pers /dev/hd9var:2127             -      0     0    -     - 
    27b3         - work shmat/mmap                   -      0     0    2     2 
    2151         - pers /dev/hd9var:2115             -      0     0    -     - 
    2012         3 mmap mapped to sid 1408           -      0     0    -     - 
    1d4f         - pers /dev/hd9var:120              -      0     0    -     -

...............................................................................
SHARED segments          Inuse      Pin     Pgsp  Virtual
                                      1633        0       15     2820

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual
    2a15         d work shared library text          -   1633     0   15  2820

 

-----------------------------------
특정 명령어의 메모리 사용량 통계 확인
-----------------------------------

 # svmon -C inetd    ; inetd 데몬에 의해 사용되어지는 메모리 통계

===============================================================================
Command                         Inuse      Pin     Pgsp  Virtual
inetd                                  4628     1823     1574     7225

...............................................................................
SYSTEM segments           Inuse      Pin     Pgsp  Virtual
                                       2880     1821     1559     4298

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual
       0         0 work kernel seg                      -       2880   1821 1559   4298

...............................................................................
EXCLUSIVE segments                   Inuse      Pin     Pgsp  Virtual
                                                    115         2         0       107

    Vsid      Esid Type Description              LPage  Inuse  Pin Pgsp Virtual
    2a74         2 work process private              -      62       2      0      62 
    367a         f work shared library data          -      45       0      0      45 
    3a7c         1 pers code,/dev/hd2:10656       -       7       0      -       - 
    162e         - pers /dev/hd2:68574               -       1       0      -       -

...............................................................................
SHARED segments                      Inuse      Pin     Pgsp  Virtual
                                      1633        0       15     2820

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual
    2a15         d work shared library text          -      1633      0    15     2820


-------------------------------
프로세스 메모리 사용량 통계 확인
-------------------------------


svmon -P   ; 시스템 프로세스별 메모리 통계 확인

-------------------------------------------------------------------------------
     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage
    3922 dtgreet           5045     1823     1705     7781      N     N     N

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual
       0         0 work kernel seg                   -   2880  1821 1559  4298 
    2a15         d work shared library text          -   1633     0   15  2820 
    19cc         2 work process private              -    327     2  119   446 
    3e5d         f work shared library data          -    173     0   11   188 
    27d3         - work shmat/mmap                   -     29     0    1    29 
    2b14         1 pers code,/dev/hd2:116793         -      3     0    -     - 
    3198         - pers /dev/hd9var:2182             -      0     0    -     - 
    106a         - pers /dev/hd2:145819              -      0     0    -     - 
    186e         - pers /dev/hd2:68956               -      0     0    -     - 
    1f8f         - pers /dev/hd9var:2125             -      0     0    -     - 
......
......
......
-------------------------------------------------------------------------------
     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage
       0 swapper              4        2        0        4      N     N     N

    Vsid      Esid Type   Description              LPage  Inuse   Pin Pgsp Virtual
    2412         2   work   process private              -      4     2    0     4

 

프로세스 개별확인은 # svmon -P (pid)


---------------
세그먼트 테이블
---------------
세그먼트 유형    세그먼트 사용법                             설     명
----------------------------------------------------------------------------------------
persistent        로그파일                                        로그
persistent        파일 및 디렉토리                             장치 이름: i-노드 번호
persistent       대형 파일                                        대형 파일 장치 이름: i-노드 번호
mapping         파일 맵핑                                        sid 소스 sid에 맵핑됨
working         프로세스 및 공유 메모리 세그먼트의     VSID및 ESID를 기초로 세그먼트의
                    데이타영역                                       역할에 따라 다름
client             NFS 및 CD-ROM 파일                       상 동
rmapping        IO 영역 맵핑                                     상 동


http://blog.naver.com/win2107/100010783120

728x90
728x90

응용프로그램이 사용한 CPU 시간

 

select substr (appl_info.auth_id,1,8) as authid
        ,cast (appl.agent_id as integer) as agentid
        ,substr (appl_name,1,20) as appl_name
        
,cast (appl.agent_usr_cpu_time_s as integer) as user_cpu
        ,cast (appl.agent_sys_cpu_time_s as integer) as sys_cpu
        ,timestampdiff (2, char (current timestamp - appl.uow_start_time)) as elapsed_time
        ,cast (appl_idle_time as integer) idle_time
        ,appl.rows_read
        ,appl.rows_written
from    table (snapshot_appl ('DBNAME', -2)) as appl,
        table (snapshot_appl_info ('DBNAME', -2)) as appl_info
where appl.agent_id = appl_info.agent_id
and appl_info.appl_id <> '%MON_APPL_ID'
and uow_stop_time is NULL
order by 
user_cpu desc, agentid with ur;

 

응용프로그램 목록 확인

 

select substr(appl_info.auth_id,1,8) as authid
        ,cast (appl.agent_id as integer) as agentid
        ,substr (appl_name,1,20) as appl_name
        
,substr (appl_info.appl_id,1,30) applid
        ,case appl_info.appl_status
                when 2 then 'Connection Completed'
                when 4 then 'Executing'
                when 5 then 'UOW Wait'
                when 9 then 'Lock Wait'
                when 24 then 'Complie'
                when 26 then 'Pending remote request'
                else substr(char(appl_info.appl_status),1,10)
        end as status
        ,cast (appl.num_agents as integer) num_agents
        ,substr (appl_info.db_name,1,8) dbname
        ,cast (appl_info.client_pid as integer) client_pid
from    table(snapshot_appl ('DBNAME', -2)) as appl,
        table (snapshot_appl_info ('DBNAME', -2)) as appl_info 
where 
appl.agent_id = appl_info.agent_id
and appl_info.appl_id <> '%MON_APPL_ID'
order by appl.num_agents desc, appl_name, agentid;

 

 

**응용프로그램이 처리한 행의 수 à실행안됨

 

select substr(appl_info.auth_id,1,8) as authid
         ,cast (appl.agent_id as integer) as agentid 
         
,substr (appl_name,1,20) as appl_name
         
,timestampdiff (2, shar (current timestamp - uow_start_time))
         as elapsed_time
         ,cast (appl.rows_selected as integer) as rows_select
         ,cast (appl.rows_inserted as integer) as rows_insert
         ,cast (appl.rows_updated as integer) as rows_update
         ,cast (appl.rows_deleted as integer) as rows_delete
         ,cast (appl.rows_read as nteger) rows_read
         ,cast (appl.rows_written as nteger) rows_written
from table (snapshot_appl('DBNAME', -2)) as appl,
       table (snapshot_appl_info('DBNAME', -2)) as appl_info
where appl.agent_id = appl_info.agent_id
and appl_info.appl_id <> '%MON_APPL_ID'
and uow_stop_time is null
order by 
elapsed_time desc, agentid with ur;

 

 

응용 프로그램 별 잠금

 

select substr (appl_info.auth_id,1,8) as authid
         ,cast (appl.agent_id as integer) as agentid,
         substr (appl_info.appl_name,1,14) as appl_name,
          case appl_info.appl_status
                 when 2 then 'Connection Completed'
                 when 3 then 'Executing'
                 when 4 then 'UOW Wait'
                 when 5 then 'Lock Wait'
                 when 9 then 'Complie'
                 when 24 then 'Pending remote request'
                 when 26 then 'Decoupled'
                 else substr(char(appl_info.appl_status),1,10)
           end as status,
           cast (appl.lock_waits as integer) as lock_waits,
           cast (appl.locks_held as integer) as lock_held,
           cast (appl.lock_escals as integer ) as escals,
           cast (appl.x_lock_escals as integer ) as x_escals,
           cast (appl.deadlocks as integer ) as deadlock,
           cast (appl.locks_waiting as integer ) as locks_waiting
from table (snapshot_appl('DBNAME', -2)) as appl,
        table (snapshot_appl_info('DBNAME', -2)) as appl_info
where appl.agent_id = appl_info.agent_id
and appl_info.appl_id <> '$MON_APPL_ID'
order by agentid;

 

 

**파티션 별 잠금

 

select substr (appl_info.AUTH_ID,1,10) as auth_id,
         cast (lock.agent_id as integer) as agentid,
         substr (appl_info.appl_name,1,16) as appl_name,
         substr (lock.tablespace_name,1,15) as tbsname,
         substr (lock.table_name,1,18) as tabname,
         lock.lock_object_type
               when 1 then 'Table'
               when 2 then 'Row'
               else substr (char(lock.lock_object_type),1,4)
          end as type,
          cast ( lock.lock_object_name as integer ) as lockobjname,
          case cast (lock.lock_mode as smallint)            
                 when 
3 then 'S'
                 when 5 then 'X'
                 when 9 then 'NS'
                 else substr(char(lock.lock_mode),1,4)
          end as mode,
          case lock.lock_status
                 when 1 then 'G'
                 when 2 then 'C'
                 else cast(lock.lockstatus as char)
           end as status,
           cast (lock.lock_escalation as integer) as escal
from        table(snapshot_lock('DBNAME', -2)) as lock,
           table(snapshot_appl_info('DBNAME', -2)) as appl_info
where lock.agent_id = appl_info.agent_id
and appl_info.appl_id <> '$MON_APPL_ID'
order by agentid, tbsname, tabname;

 

 

테이블 별 잠금

 

select substr(appl_info.AUTH_ID,1,10) as auth_id,
         cast (lock.agent_id as integer) as agentid,
         substr(appl_info.appl_name,1,16) as appl_name,
         substr(lock.tablespace_name,1,15) as tbsname,
         sunstr(lock.table_name,1,18) as tabname,
         case lock.lock_object_type
               when 1 then 'Table'
               when 2 then 'Row' as type ,
         cast (lock.lock_object_name as integer) as lockobjname,
         case cast (lock.lock_mode as smallint)
                when 3 then 'S'
                when 5 then 'X'
                when 8 then 'U'
                when 9 then 'NS'
                else substr(char(lock.lock_mode)1,4)
          end as mode,
          case lock.lock_status
                 when 1 then 'G'
                 when 2 then 'C'
                 else cast (lock.lock_status as char)
          end as status,
          cast (lock.lock_escalation as integer) as escal
from   table (snapshot_lock('DBNAME', -2)) as lock,
          table (snapshot_appl_info('DBNAME', -2)) as appl_info
where lock.agent_id = appl_info.agent_id
          and lock.table_name = ucase('$TABNAME')
          and appl_info.appl_id <> '$MON_APPL_ID'
order by agentid, tbsname, tabname, type;

 

 

잠금 대기 에이전트

 

select 
       cast 
(lockwait.agent_id as integer) as wait_agent,
       substr (appl_info.appl_name,1,10) as wait_appl,
       substr (lockwait.table_schema,1,18) as tbschema,
       substr (lockwait.table_name,1,18) as tabname,
       case lockwait.lock_object_type
             when 1 then 'Table'
             when 2 then 'Row'
             else substr(char(lockwait.lock_object_type),1,4)
       end as lock_type
        , case cast (lockwait.lock_mode_requested as smallint)
             when 3 then 'S'
             when 5 then 'X'
             else substr(char(lockwait.LOCK_MODE_REQUESTED),1,4)
       end as lock_mode
        , cast (partition_number as smallint) partition
        
, cast (lockwait.agent_id_holding_lk as integer) as hold_agent
        , substr (appl_info2.appl_name,1,10) as hold_appl
        , timestampdiff (2, char (current timestamp - 
                  
lockwait.LOCK_WAIT_START_TIME)) as wait_time_s
from
         table (snapshot_lockwait('DBNAME', -2)) as lockwait,
         table (snapshot_appl_info('DBNAME', -2)) as appl_info1,
         table (snapshot_appl_info('DBNAME', -2)) as appl_info2,
where
         lockwait.agent_id = appl_info1.agent_id
         and lockwait.agent_id_holding_lk = appl_info2.agent_id
order by wait_agent, lock_type, hold_agent;

 

 

잠금 대기 정적 SQL

 

select
       cast 
(lockwait.agent_id as integer) wait_agent
       , substr (appl_info.appl_name,1,10) wait_appl
       , substr (statement.creator,1,8) pkg_schema
       , substr (statement.package_name,1,8) package
       
, cast ( statement.section_number as smallint ) section
       
, substr (cat_statement.text,1,63) SQL
       
, cast (lockwait.agent_id_holding_lk as integer) hold_agent
from   table (snapshot_lockwait('DBNAME', -2)) lockwait
          , table (snapshot_appl_info('DBNAME', -2)) appl_info
          , table (snapshot_statement('DBNAME', -2)) statement
          
, syscat.statement cat_statements
where
         lockwait.agent_id = appl_info.agent_id           and
         
lockwait.agent_id = statement.agent_id          and
         statement
.stmt_text is null                            and
         
cat_statements.pkgname = upper(statement.package_name)  and
         
cat_statements.sectno = statement.section_number;

 

 

잠금 대기 동적 SQL

 

select
       cast 
(lockwait.agent_id as integer) wait_agent
       , substr (appl_info.appl_name,1,10) wait_appl
       , cast (NULL as char(8)) pkg_schema
       , cast (NULL as char(8)) package
       
, cast (NULL as smallint) section
       
, substr (statement.stmt_text,1,63) SQL
       
, cast (lockwait.agent_id_holding_lk as integer) hold_agent
from    table (snapshot_lockwait ('DBNAME', -2)) lockwait
        , table (snapshot_appl_info ('DBNAME', -2)) appl_info
        , table (snapshot_statement ('DBNAME', -2)) statement
where
         
lockwait.agent_id = appl_info.agent_id                 and
         
lockwait.agent_id = statement.agent_id                and
         statement
.stmt_text is not null
order by 
wait_agent, hold_agent;

 

 

 

잠금 보유 에이전트의 정적SQL

 

select
      cast 
(lockwait.agent_id_holding_lk as integer) as hold_agent
      , substr (appl_info.appl_name,1,10) as hold_appl
      , substr (statement.creator,1,8) pkg_schema
      , substr (statement.package_name,1,8) package
      
, cast (statement.section_number as smallint) last_section
      , cast (cat_statement.secrion as smallint) section
      
, substr (cat_statements.text,1,61) last_SQL
from
       table (snapshot_lockwait ('DBNAME', -2)) as lockwait
      , table (snapshot_appl_info('DBNAME', -2)) as appl_info
      , table (snapshot_statement('DBNAME', -2)) as statement
      
, syscat.statement cat_statements
where
       lockwait.agent_id_holding_lk = appl_info.agent_id                   and
       
lockwait.agent_id_holding_lk = statement.agent_id                   and
       
cat_statement.pkgschema = upper(statement.creator)                  and
       
cat_statement.package = upper(statement.package_name)              and
       
cat_statement.section <= statement.section_number
order by hold_agent, section;

 

 

 

잠금 보유 에이전트의 동적SQL

 

select distinct
        cast 
(lockwait.agent_id_holding_lk as integer) as hold_agent
        , substr(appl_info.appl_name,1,10) as hold_appl
        , cast (NULL as char(8)) pkg_schema
        , cast (NULL as char(8)) package
        
, cast (NULL as smallint) last_section
        , cast (NULL as smallint) section
        
, cast (substr(statement.stmt_text,1,61) as char(61)) SQL
from
        table 
(snapshot_lockwait('DBNAME', -2)) as lockwait
        , table (snapshot_appl_info('DBNAME', -2)) as appl_info
        , table (snapshot_statement('DBNAME', -2)) as statement
where
         
lockwait.agent_id_holding_lk = appl_info.agent_id                and
         
lockwait.agent_id_holding_lk = statement.agent_id               and
         statement
.stmt_text is not null
order by 
hold_agent, last_section;

 

 

응용프로그램별 로그 사용량

 

select substr(appl_info.auth_id,1,8) as authid
        , cast (appl.agent_id as integer) as agent
        , substr (appl_info.appl_name,1,20) appl_name
        
, appl.uow_log_space_used
        , cast (appl.agent_usr_cpu_time_s as integer) user_cpu
        , timestampdiff (2, char( current timestamp - appl.uow_start_time))
                      as elapsed_time
        , appl.rows_read
        , appl.rows_written
from table (snapshot_appl('DBNAME', -2)) as appl,
        table (snapshot_appl_info('DBNAME', -2)) as appl_info
where appl.agent_id = appl_info.agent_id
and appl_info.appl_id <> '$MON_APPL_ID'
order by uow_log_space_used desc, rows_written desc, agentid;

 

 

데이터베이스별 로그 사용량

 

select 
        
total_log_used
        , total_log_available
        , tot_log_used_top
        , cast (sec_logs_allocated as integer) sec_logs_allocated
        , sec_log_used_top
        , cast (appl_id_oldest_xact as integer) oldest_tx_agent
        , substr (appl_info.appl_name,1,12) appl_name
from table 
(snapshot_database('DBNAME', -2)) as database,
        table (snapshot_appl_info('DBNAME', -2)) as appl_info
where database.appl_id_oldest_xact = appl_info.agent_id
and appl_info.appl_id <> '$MON_APPL_ID';

 

 

테이블 스페이스 사용량

 

select substr (tbs_cfg.tablespace_name,1,20) tablespace
         
, cast (tbs_cfg.tablespace_state as smallint) as state
         , case tbs_cfg.tablespace_type
                  when 1 then 'SMS'
                  else 'DMS'
             end type
          , cast (page_size as integer) page_size
          , (total_pages * page_size) / 1024 /1024 as total_size_mb
          , (used_pages * page_size) / 1024 /1024 as used_size_mb
          , (free_pages * page_size) / 1024 /1024 as free_size_mb
          , case tablespace_type
                   when 1 then 100
                   else dec ((tbs_cfg.used_pages * 100.00) / tbs_cfg.total_pages,5,2)
             end as ratio
from table (snapshot_tbs_cfg('DBNAME', -2)) as tbs_cfg
order by tablespace;

 

 

테이블 스페이스 적중률

 

select substr (tbs.tablespace_name,1,20) as tablespace
         
, cast (tbs.pool_data_l_reads as integer) pool_data_l_reads
         , cast (tbs.pool_data_p_reads as integer) pool_data_p_reads
         , case tbs.pool_data_l_reads
                when 0 then null
                else 
dec(((tbs.pool_data_l_reads - tbs.pool_data_p_reads)
                       * 100.00 / tbs.pool_data_l_reads) ,5,2)
           end data_hit_ratio
          , cast (tbs.pool_index_l_reads as integer) pool_index_l_reads
          , cast (tbs.pool_index_p_reads as integer) pool_index_p_reads
          , case tbs.pool_index_l_reads
                   when 0 then null
                   else  
dec(((tbs.pool_index_l_reads - tbs.pool_index_p_reads)
                         * 100.00 / tbs.pool_index_l_reads) ,5,2)
                   end index_hit_ratio
from table(snapshot_tbs('DBNAME', -2)) as tbs
order by tablespace;

728x90

'Db2 > Db2 reference' 카테고리의 다른 글

db2 접속환경설정  (0) 2011.03.13
db2 접속 및 종료  (0) 2011.03.13
DB2 데이터 암호화 함수 사용법  (0) 2011.03.08
DB2 9의 메모리 모니터링과 튜닝  (0) 2010.07.13
db2diag.log 분할하기  (0) 2010.01.21
728x90

Use the BUFFERPOOL configuration parameter to specify the default values for buffers and LRU queues in a buffer pool for both the default page size buffer pool and for any non-default pages size buffer pools.

Note: Information that was specified with the BUFFERS, LRUS, LRU_MAX_DIRTY, and LRU_MIN_DIRTY configuration parameters prior to Version 10.0 is now specified using the BUFFERPOOL configuration parameter.
onconfig.std values
Operating systems with 2K default page size:
BUFFERPOOL default,buffers=10000,lrus=8,lru_min_dirty=50.00,
lru_max_dirty=60.50
BUFFERPOOL size=2k,buffers=50000,lrus=8,lru_min_dirty=50,
lru_max_dirty=60
Operating systems with 4K default page size:
BUFFERPOOL default,buffers=10000,lrus=8,lru_min_dirty=50.00,
lru_max_dirty=60.50
BUFFERPOOL size=4k,buffers=10000,lrus=8,lru_min_dirty=50,
lru_max_dirty=60
syntax
BUFFERPOOL default,buffers=num_buffers,lrus=num_lrus, lru_min_dirty=percent_min,lru_max_dirty=percent_max_dirty
BUFFERPOOL size=sizek,buffers=num_buffers,lrus=num_lrus,lru_min_dirty=percent_min ,lru_max_dirty=percent_max_dirty
takes effect
When the database server is shut down and restarted
utilities
onparams -b (See onparams -b: Add a new buffer pool.) onspaces (See Specifying a Non-Default Page Size with the Same Size as the Buffer Pool. on-Monitor (See Figure 7.)
refer to
onspaces -c -d: Create a dbspace The IBM® Informix® Dynamic Server Administrator's Guide

The BUFFERPOOL configuration parameter consists of two lines in the onconfig.std file, as shown in this example for a platform with a default page size of 2K:

BUFFERPOOL default,buffers=10000,lrus=8,lru_min_dirty=50.00,lru_max_dirty=60.50
BUFFERPOOL size=2k,buffers=50000,lrus=8,lru_min_dirty=50,lru_max_dirty=60

The top line specifies the default values that are used if you create a dbspace with a page size which does not already have a corresponding buffer pool created at start up. The line below the default line specifies the database server's default values for a buffer pool, which are based on the database server's default page size. When you add a dbspace with a different page size with the onspaces utility or when you add a new buffer pool with the onparams utility, a new line is appended to the BUFFERPOOL configuration parameter in the onCONFIG file. The page size for each buffer pool must be a multiple of the system's default page size. Below is an example of the BUFFERPOOL lines where a third line has been appended:

BUFFERPOOL default,buffers=10000,lrus=8,lru_min_dirty=50.00,lru_max_dirty=60.50
BUFFERPOOL size=2k,buffers=50000,lrus=8,lru_min_dirty=50,lru_max_dirty=60
BUFFERPOOL size=6k,buffers=3000,lrus=8,lru_min_dirty=50,lru_max_dirty=60

The order of precedence for the BUFFERPOOL configuration parameter settings is:

  1. The BUFFERPOOL size line, for example:
    BUFFERPOOL size=2k,buffers=50000,lrus=8,lru_min_dirty=50,lru_max_dirty=60
  2. Any deprecated parameters in the onCONFIG file:
    • BUFFERS
    • LRUS
    • LRU_MAX_DIRTY
    • LRU_MIN_DIRTY

    For more information about deprecated configuration parameters, see Discontinued Configuration Parameters.

  3. The BUFFERPOOL default line, for example:
    BUFFERPOOL default,buffers=10000,lrus=8,lru_min_dirty=50.00,lru_max_dirty=60.50
  4. Database server defaults.

When you use onspaces to create a new dbspace with a new page size, the database server takes the values of bufferslruslru_min_dirty and lru_max_dirtyfrom BUFFERPOOL default line unless there already is a BUFFERPOOL entry for that page size.

You can use the onparams utility when the database server is in online, quiescent, or in administration mode to add a new buffer pool with a different page size. There must be one buffer pool for each page size used by the dbspaces and all dbspaces using that page size must use the single buffer pool with that page size. When you use the onparams utility to add a buffer pool or when you add a dbspace with a different page size with the onspaces utility, the information you specify is automatically appended to the onCONFIG file and new values are specified using the BUFFERPOOL keyword. You cannot change the values by editing theonconfig.std file. If you need to resize or delete an existing buffer pool, you must restart the database server and then run onparams again.

Buffer pools that are added while the database server is running go into virtual memory, not into resident memory. only those buffer pool entries that are specified in the onCONFIG file at startup go into resident memory, depending on the availability of the memory you are using.

The fields in the BUFFERPOOL lines are not case sensitive (so you can specify lrus or Lrus or LRUS) and the fields can appear in any order.

For more information on buffer pools, including information on resizing and deleting buffer pools, see IBM Informix Dynamic Server Administrator's Guide.

The lrus Field

onconfig.std value
lrus=8
syntax
lrus=num_lrus
units
Number of LRU queues
range of values
32-bit platforms: 1 through 128 64-bit platforms: 1 through 512

The lrus field specifies the number of LRU (least-recently-used) queues in the shared-memory buffer pool. You can tune the value of lrus, in combination with thelru_min_dirty and lru_max_dirty fields, to control how frequently the shared-memory buffers are flushed to disk.

Setting lrus too high might result in excessive page-cleaner activity.

The buffers Field

onconfig.std value
buffers=10000
syntax
buffers=num_buffers
units
Number of buffers. Each buffer is the size of the operating system page.
range of values
For 32-bit platform on UNIX®: with page size equal to 2048 bytes: 100 through 1,843,200 buffers (1843200 1800 * 1024)

with page size equal to 4096 bytes: 100 through 921,600 buffers (921,600 = ((1800 * 1024)/4096) * 2048 )

For 32-bit platform on Windows®: 100 through 524,288 buffers (524,288 = 512 * 1024)

For 64-bit platforms: 100 through 231-1 buffers (For the actual value for your 64-bit platform, see your machine notes. The maximum number of buffers on Solaris is 536,870,912.)

The buffers value specifies the maximum number of shared-memory buffers that the database server user threads have available for disk I/O on behalf of client applications. Therefore, the number of buffers that the database server requires depends on the applications. For example, if the database server accesses 15 percent of the application data 90 percent of the time, you need to allocate enough buffers to hold that 15 percent. Increasing the number of buffers can improve system performance.

Recommendation: Set the buffer space before you calculate other shared-memory parameters. on systems with a large amount of physical memory (4 GB or more), buffer space can be as much as 90 percent of physical memory.

If you also want to perform read-ahead, increase the value of buffers. After you have configured all other shared-memory parameters, if you find that you can afford to increase the size of shared memory, increase the value of buffers until buffer space reaches the recommended 25 percent maximum.

If your databases contain smart large objects, you need to consider them when you calculate the value for buffers, because smart large objects are stored in the default page size buffer pool. If your applications frequently access smart large objects that are 2 kilobytes or 4 kilobytes in size, use the buffer pool to keep them in memory longer.

Use the following formula to increase the value of buffers:
Additional_BUFFERS = numcur_open_lo *
                     (lo_userdata / pagesize)
numcur_open_lo
is the number of concurrently opened smart large objects that you can obtain from the onstat -g smb fdd option.
lo_userdata
is the number of bytes of smart-large-object data that you want to buffer.
pagesize
is the page size in bytes for the database server.

As a general rule, try to have enough buffers to hold two smart-large-object pages for each concurrently open smart large object. (The additional page is available for read-ahead purposes).

If the system uses lightweight I/O (as set by the access-mode constant LO_NOBUFFER), the system allocates the buffers from shared memory and does not store the smart large objects in the buffer pool. For information on access-mode flags and constants, see the chapter on “Working with Smart Large Objects of the Universal Data Option” in the IBM Informix ESQL/C Programmer's Manual.

The lru_min_dirty Field

onconfig.std value
lru_min_dirty=50.00
syntax
lru_min_dirty=percent_min
units
Percent
range of values
0 through 100 (fractional values are allowed)

The lru_min_dirty field specifies the percentage of modified pages in the LRU queues at which page cleaning is no longer mandatory. Page cleaners might continue cleaning beyond this point under some circumstances. If a field is specified out of the range of values, then the default of 80.00 percent is set.

The lru_max_dirty Field

onconfig.std value
lru_max_dirty=60.50
syntax
lru_max_dirty=percent_max
units
Percent
range of values
0 through 100 (fractional values are allowed)

The lru_max_dirty field specifies the percentage of modified pages in the LRU queues at which the queue is cleaned. If a field is specified out of the range of values, then the default of 60.00 percent is set.

The size Field

onconfig.std value
2K default page size: size=2k 4K default page size: size=4k
syntax
size=size
units
Kilobytes
range of values
2 through 16

The size field specifies the page size for the particular BUFFERPOOL line. The k is optional.

System Page Size

The system page size is the default page size and is platform-dependent on Dynamic Server.

You can use the following utilities to display the system page size.
Utility
Description
onstat -b
Displays the system page size, given as buffer size on the last line of the output
oncheck -pr
Checks the root-dbspace reserved pages and displays the system page size in the first section of its output
ON-Monitor(UNIX)
Displays the system page size under the Parameters > Initialize option. Displays system page size under the Parameters > Shared-Memory option, which does not require the database server to be running.

728x90

'Informix > informix reference' 카테고리의 다른 글

EILSEQ_COMPAT_MODE  (0) 2010.10.22
AIX 64bit 설치시 주의사항  (0) 2010.08.12
Set the SHMVIRTSIZE Configuration Parameter  (0) 2010.07.15
SHMVIRTSIZE  (0) 2010.07.15
Resident Portion size  (0) 2010.06.01
728x90

Set the Virtual Shared-Memory Segment Size with the SHMVIRTSIZE Configuration Parameter

The SHMVIRTSIZE configuration parameter specifies the initial size of a virtual shared-memory segment. A suggested initial value is:

32000 + expected number of users * 800  

The best practice is to allocate only memory that is necessary for your environment. Therefore, you need to find the point at which, during the peak resource usage, IDS will not add any segments, while if you reduce the size of SHMVIRTSIZE, IDS will add another segment. The following method is one approach to find the value of SHMVIRTSIZE:

  1. Set SHMVIRTSIZE to 50% of your memory.
  2. During the peak resource usage, check how many additional segments have been added. You can use the onstat -g seg command. If no additional segments were added, then reduce the SHMVIRTSIZE. When you notice additional segments, proceed to the next step.
  3. Use the following formula:
    new_SHMVIRTSIZE= old_SHMVIRTSIZE + (number_of_segments_added * SHMADD) 
  4. When you find the optimal SHMVIRTSIZE, reduce the size a little to see if an additional segment is created. This is a way to verify your calculations.

728x90

'Informix > informix reference' 카테고리의 다른 글

AIX 64bit 설치시 주의사항  (0) 2010.08.12
BUFFERPOOL Configuration Parameter  (0) 2010.07.15
SHMVIRTSIZE  (0) 2010.07.15
Resident Portion size  (0) 2010.06.01
informix version 확인  (0) 2010.06.01
728x90

SHMVIRTSIZE

onconfig.std value
8000 on UNIX and 8192 on Windows
if not present
If SHMADD is present: SHMADD If SHMADD is not present: 8
units
Kilobytes
range of values
32-bit platforms: 
Positive integer with a maximum value of 
2 gigabytes

64-bit platforms: 
Positive integer with a maximum value of 
4 terabytes

The maximum value might be less on some platforms due to operating-system limitations. For the actual maximum value for your UNIX platform, see the machine notes.

takes effect
When the database server is shut down and restarted
utilities
onstat -g seg (see page ***)
refer to
The following material:
  • Virtual portion of shared memory, in the shared-memory chapter of the IBM Informix Administrator's Guide
  • Chapter on configuration effects on memory utilization, in your IBM Informix Performance Guide

SHMVIRTSIZE specifies the initial size of a virtual shared-memory segment. Use the following algorithm to determine the size of the virtual portion of shared memory:

shmvirtsize = fixed overhead + shared structures +
             mncs * private structures) + other buffers

This algorithm includes the following values.

Value
Description
fixed_overhead
Global pool + thread pool after booting (partially dependent on the number of virtual processors)
shared_structures
AIO vectors + sort memory + dbspace backup buffers + dictionary size + size of stored-procedure cache + histogram pool + other pools (See the onstatdisplay.)
mncs
Maximum number of concurrent sessions
private_structures
Stack (generally 32 kilobytes but dependent on recursion in SPL routines and triggers) + heap (about 30 kilobytes) + session-control-block structures

If messages in the message file indicate that the database server is adding segments to the virtual portion of shared memory for you, add the amount that these messages indicate to the value of SHMVIRTSIZE. It is recommended that you initially create a virtual portion of shared memory of a size that is more than sufficient for your daily processing, if possible.

Use the onstat -g seg command to determine peak usage and lower the value of SHMVIRTSIZE accordingly.

728x90

'Informix > informix reference' 카테고리의 다른 글

BUFFERPOOL Configuration Parameter  (0) 2010.07.15
Set the SHMVIRTSIZE Configuration Parameter  (0) 2010.07.15
Resident Portion size  (0) 2010.06.01
informix version 확인  (0) 2010.06.01
ONBAR  (0) 2010.05.26
728x90

DB2 효율적인 메모리 사용을 위해 여러 단위를 가진 다양한 메모리 구성 매개 변수를 제공한다. DB2 9 메모리의 자세한 구성옵션으로 DBA들은 DB2 메모리의  구성요소에 대한 이해가 요구된다.

 

DB2 메모리 구성 튜닝에 따른 복잡성을 해결하기 위해 IBM DB2 9 자가 튜닝 메모리 매니저(STMM : Self Tuning Memory Manager) 도입했다 STMM이전에는 워크로드에 따른 튜닝은 불가능했다그러나 STMM도입으로 워크로드에 따라 DB2 메모리를다이내믹하게 튜닝함으로써 DBA 시간을 크게 줄여주고 있다.

 

프로세스가 4GB 가상 주소공간(VAS: virtual address space) 제한되기 때문에, 32비트 환경에서 DB2 메모리 사용에 대한 이해는 보다 중요하다. DB2 9 for Unix(AIX, SUNOS  HP-UX) 64비트에서만 지원된다 글에서는 STMM 작동법과 DB2 메모리 사용의 모니터링 방법에 대해 설명하도록 하겠다. DB2 메모리 사용의 모니터링에 대한 자세한 접근 방법은 메모리 관련 문제를 해결하는데 용이하다.

 

DB2 문제 진단 도구

DB2에는 메모리 사용 모니터링을 위한 여러 가지 방법이 있다개인적으로 DB2 문제 진단도구(db2pd) 사용을 선호한다모니터링과문제해결을 하는데 강력한 도구인 db2pd 이미 DB2 8.2에서 도입되었으며   지속적으로 제품이 출시되면서 기능이 향상되었다. db2pd DB2 엔진 외부에서 빠르게 실행된다이러한 유용성에도 불구하고 db2pd  동안 DBA들에게는 등한시 되어왔다.

 

db2pd에는 DB2 여러 측면에서 모니터링하고 문제를 해결   있는 다양한 옵션들이 포함되어 있지만 이번에는 메모리 사용 모니터링과 튜닝에서 사용할  있는 옵션에 관련된 내용만 다루도록 하겠다. db2pd 명령옵션은 리눅스유닉스윈도우 플랫폼이 유사하기 때문에 앞으로 사용할 예제들은 대부분 리눅스 기반의 DB2 9 활용한다.

 

DB2 메모리 모니터링을 본격적으로 다루기 전에 메모리 메모리 사용을 위한 중요 개념부터 살펴보면 다음과 같다

DB2 새로운 기능들

DB2 9에는 STMM 이외에도 메모리 관련하여 다음과 같은 향상된 기능들이 포함되어 있다

►64비트 AIX에서의 대형 페이지(16MB) 지원.  대형페이지 사용은 집중적으로 메모리 접근을 필요로 하며 다량의 가상 메모리를 사용하는 고성능 컴퓨팅 애플리케이션에 성능향상을 위해서 제공된다.

 

►database_memory 구성 매개 변수의 새로운 DB2 9에서 database_memory 구성 매개 변수의 COMPUTED 설정은 DB2 8 버전에서의 AUTOMATIC 설정과 같다. DB2 9에서 database_memory 매개 변수를 AUTOMATIC(AIX Window경우)으로 설정하면 데이터베이스 메모리 사용을 자동으로 튜닝하는 새로운 자가 튜닝 메모리 관리 기능을 이용할  있다.

 

 구성 매개 변수 db_mem_thresh. database_memory 매개 변수에서 사용되지 않은 부분이 물리적 RAM 양을 제어하도록 새로운 데이터베이스 구성 매개 변수인 db_mem_thresh 추가해 왔다.

 

►Sheapthres_shr 매개 변수 변경Sheapthres_shr 매개변수는 어떤  시점에서 정렬(sort) 메모리 소비가  데이터베이스 공유 메모리의 양을 제한하는 것을 의미한다. DB2 8 버전에서는 이것이 하드 제한(hard limit)이었다만약 정렬 메모리가 한계에 가까워지면 경고가 발생된다. DB2 9 Sheapthres_shr 매개 변수는 소프트 제한(soft limit)이다.정렬 메모리 (heap) 필요한 경우 추가적으로 제한 없이 데이터베이스 공유 메모리를 사용할  있다.

 

►AWE 지원이 사용되지 않음(Windows). 64비트 운영 체제 이전, DB2 초기버전에서는 가상 주소 공간을 초과하여 추가적인 물리적 메모리를 사용하기 위해서 32비트 DB2 서버를 사용할  있는 AWE 기능을 지원했다그러나 64비트 플랫폼 도입으로 AWE기능 사용의 요구가 줄어들게 되었다따라서 DB2 9에서는 DB2_AWE 레지스토리 변수와 함께AWE 기능에 대한 지원을 하지 않는다.

 

 

 

가상주소 공간

우리는 가상 메모리 관리를 알고 있지만대부분의 사람들이 메모리를 분석할  가상 메모리를 간과하고 있다컴퓨터 시스템의 메인 메모리는 연속적인 바이트 크기(byte-sized)  배열로 구성되어 있다각각의 바이트는 고유한 물리적 주소(PA) 가지고 있다.첫번째 바이트의 주소는 0이고  다음 바이트 주소는 1,  다음은 2 순서로 계속된다이런 단순한 구조라면 CPU 메모리에 접근하기 위한 가장 일반적인 방법은 물리적 주소를 사용한다그러나 물리적 주소 접근 방식에는  가지 제약이 있다.

 

물리적 어드레싱(addressing)매커니즘의 경우 프로그램은 메모리 구성이 다른 시스템에서 실행될 때마다 다른 주소가 사용되기 때문에 다르게 작동한다메모리 구성이 같은 시스템에서 실행되는 경우에도 매번 다른 위치로 로드될  있어서 항상 다르게 작동할 있다더욱이 물리적 어드레싱(addressing) 매커니즘은 유연하지 않다프로그램이 조각화되거나 부분적으로 로드될  없다메인메모리가 전체 프로그램 파일을 읽고 실행한다이러한 요구 사항으로  운영되고 있는 프로그램을 모두 유지하기에는 너무 적은 메모리를 가졌을 경우 시스템의 문제가 발생할  있다심지어 사용자 프로세스가 메모리 읽기 전용 부분(예를 들어 : 커널코드데이터구조다른 프로세스의 개인 메모리 )까지도 수정할  있다.

 

물리적 어드레싱(addressing) 문제를 해결하기 위해서는 물리적 메모리 관리의 책임이 개별 애플리케이션에서부터 운영체제 자체로 옮겨져야 한다개별 애플리케이션는 컴퓨터 시스템 메모리의 가상 뷰어가 있으며운영시스템은 가상 주소를 물리적 주소로 변환한다.

가상 어드레싱(addressing) 현재 필요하지 않는 프로그램이나 데이터가 디스크(스왑공간)으로 이동된  필요한 경우 다시 메모리로 가져올  있는 ‘스와핑(swapping)’개념을 도입했다. <그림 1> 가상 어드레싱 매커니즘을 간략한 형태로 나타내고 있다

<그림 1> 가상 주소 공간  페이지 테이블

 

가상 메모리가 있는 시스템의 모든 프로세스는 가상 주소공간이 있다. 32비트 시스템의 가상 주소 공간 크기는 232(4GB)이다. 64비트 시스템은 264바이트이다불과    전만 해도 32비트 환경에서 4GB 가상 주소 공간만으로도 충분했다그러나 점점더64비트 시스템이 사용됨에 따라 이제는  이상 상황이 이전과 같지 않게 됐다.

가상의 주소공간은 각각의 프로세스를 이용할  있으며 전체 물리적 메모리와는 관계가 없다는 점에 주목해야 한다프로세스는 주소 공간을 사용하여 물리적 메모리디스크의 스왑 공간, I/O 성능을 향상시키기 위해 메모리에 매핑된 파일을 참조할  있다데이터와 코드는 페이지라고 불리는 메모리 단위에서 물리적 메모리와 스왑 공간 사이를 이동한다페이지 사이즈는 보통 4KB이지만일부 시스템에서는 4KB 배수로 사용할  있다프로세스는 페이지 테이블을 통해 자신의 가상 주소 공간을 추적한다.

    

<그림 1> 예에서처럼 8개의 항목으로 페이지테이블을 구성하고 있지만실제로 페이지 크기가 4KB(2 12) 32비트 시스템에서는페이지 테이블 항목은 1024X1024(2 20)으로 구성되어 있다페이지 크기 4KB 가진 64비트 시스템의 경우 페이지 테이블 항목 개수는 2 52이다. 8개의 항목  PTE(Page Table Entry : 페이지 테이블 항목) 0 4 공백이다이는 프로세스가 해당 가상 주소 공간을 써버리는 일이 없으며 많은 가상 메모리의 주소를 지정할  있다는 것을 의미한다. 4개의 항목(PTE 1,2,5, 7) 물리적 메모리를 나타내고 있다이것은 4개의 페이지가 스왑인(swap-in)없이 프로세스에 접근할  있다는 것을 의미한다다른 두페이지(PTE 3, 6) 디스크에 스왑 아웃(swap out)된다만약 프로세스가  페이지가 필요하다면가상메모리 관리자는 페이지를 디스크에서 물리적 메모리로 교환한다. 페이지를 교환하기 전에 빈페이지를 만들거나 디스크에 다른 페이지를 교환 또는 겹쳐씀으로써 물리적 메모리에 새로운 페이지를 위한 공간을 남겨야 한다스왑인(swap-in) 스왑 아웃(swap-out) 프로세스는 프로세스에 사용된 메모리 단위가 페이지이기 때문에 페이지 (page- in) 페이지 아웃(page-out)으로 불린다.

 

스왑 아웃(swapped- out)’  페이지가 이동하는 위치는 사용되는 방법에 따라 다르다.

 

OS 메모리는 다음과 같은 메모리를 사용한다.

 커널 : 메인메모리(RAM) 있는 개별 메모리 공간으로 운영 시스템 자체

 캐시 : 파일 시스템 요소와 다른 I/O 운영을 유지하기 위한 메인메모리

 

프로세스 메모리는 다음과 같은 메모리를 사용한다.

 데이터 : 프로그램에 의해 할당되고 사용된 메모리

 스택 : OS에서 관리된 프로그램 실행 스택

 매핑됨(Mapped) : 프로세스 메모리 공간 내에 주소 지정 가능한 파일 내용

 

일반적으로 페이지는 다음과 같이 스왑 아웃 된다.

 커널 : 절대 스왑 아웃되지 않음

 캐시 : 페이지가 삭제됨

 데이터 : 스왑 공간으로 이동

 스택 : 스왑 공간으로 이동

 매핑됨(Mapped) : 변경되고 공유된 경우 원래 파일로 이동또는 변경되고 개인인 경우 스왑 공간으로 이동

 

하나 이상의 프로세스가 메모리를 공유하는 경우 공유된 메모리는  프로세스의 가상 주소 공간에서 다른 가상 주소를 가질 수도 있다. <그림 2>  이러한 현상을 나타낸다

<그림 2> 가장 주소 공간  공유 메모리

 

가상 주소 공간과 관련하여 다음과 같은 주요한 특징이 있다.

 

1.       64비트 시스템에서 프로세스는 16X 1024X1024TB 메모리의 주소를 지정할  있다 수가 매우 크지만 64비트 환경에서는 메모리 어드레싱(addressing) 전혀 문제가 되지 않는다.

2.       이미 언급한 바와 같이 모든 프로세스에서는 고유 가상 주소가 있다일반적으로 윈도우 OS VAS 영역을 할당하거나 공간확보를 위해 VirtualAlloc/VirtualFree API 제공한다. VirtualAlloc 사용한 모든 새로운 할당은 항상 64KB까지 반올림된다이는 VAS영역의 최소 크기가 64KB이고 Windows에서 VAS 영역은 항상 64KB 배수를 의미한다따라서 물리적 메모리에 연결된 새로운 VAS 영역을 할당하면 OS 페이지 크기까지 반올림한 물리적 메모리를 사용하고 64KB까지 반올림한프로세스의 VAS 사용한다예를 들어 COMMIT플래그와 함께 VirtualAlloc 1024 바이트 호출하면 OS 지정된 프로세스에 64KB VAS 영역을 할당하고 물리적 메모리의 페이지 (페이지 크기에 따라 4KB 또는 8KB) 할당한다이에 대한 자세한 내용은 http://blogs.msdn.com/slavao/archive/2005/01/27/361678.aspx 웹로그에서 참조하면 된다.

3.       유닉스기반 시스템에서 OS 사용 가능한 모든 RAM 디스크 캐싱에 사용한다캐시 메모리는 우선 순위가 낮고 언제든지 비워질  있기 때문에 프로세스의 성능을 방해하지 않지만 대개 ‘사용됨(used)’으로 간주된다따라서 이러한 시스템에서는 사용 가능한 메모리가 적거나 없다고 표시된다그러나  같은 표시가 시스템에 메모리가 부족함을 의미하지 않는다.메모리 문제를 가장  나타내는 것은 활발한 페이지 활동으로 스왑 공간에서 페이지를 스왑 스왑 아웃함으로써 적합한메인 메모리를 유지하지 못하는 것을 시스템이 보완하고 있으며시스템 성능이 저하되고 있음을 나타낸다.

앞에서 언급한 것과 같이 프로세스의 VAS 32비트 시스템에서 4GB 메모리까지 액세스할  있다하지만 프로세스는 이러한4GB 주소 공간을 커널 메모리공유 라이브러리를 위해 매핑된 파일스택 등에 액세스하는데도 사용되어야 한다따라서 32 비트 시스템의 프로세스의 경우 대개 데이터에 대해 4GB 이하의 주소 지정 가능한 메모리를 가진다개별 OS(AIX, SunOS, HP-UX, Linux  Windows) DB2 프로세스 가상 주소 공간에 대한 자세한 내용은 Sylvia Qi  Michael Dang “ The DB2 UDB Memory Model에서 참조하면 된다.

 

DB2 메모리 모델

다음은 간략한 DB2 메모리 모델이다.

DB2 메모리를 다음 4가지 형태의 메모리 세트로 나누어 관리한다.

  • 인스턴스 공유 메모리
  • 데이터베이스 공유 메모리
  • 애플리케이션 그룹 공유 메모리
  • 에이전트 개인 메모리

<그림 3> DB2 메모리 구조를 나타낸다다중 파티션 환경에서 다음의 메모리 구조는 인스턴스의  파티션에 적용된다.

<그림 3> DB2 메모리 구조

 

인스턴스 공유 메모리(Instance shared memory) 연결 요청 수락  데이터 베이스를 활성화시키기 위한 지원을 하며 같은 인스턴스 레벨 작업과 다중 파티션 환경인 경우 파티션  연계에 할당된다모든 데이터베이스와 인스턴스의 데이터베이스에 연결되어 있는 모든 애플리케이션은  메모리를 공유한다.

 

마찬가지로 DB2 인스턴스 내의  활성화된 데이터베이스에 메모리를 할당한다 메모리는 데이터베이스로의 모든 액세스동시성 제어로깅 등에 사용된다 메모리는 데이터베이스에 연결되어 있는 모든 애플리케이션에서 공유하기 때문에 데이터베이스공유 메모리(database shared memory)’라고 부른다.

 

데이터베이스로의  연결에서 애플리케이션의 요청 처리를 담당하는 에이전트도 메모리가 필요하다에이전트는 애플리케이션 제어  구조(application control heap structure) 위한 공유 메모리가 필요한데 이것을 애플리케이션 그룹 공유 메모리(application group shared memory)’라고 한다에이전트는 또한 정렬액세스 플랜 생성 등을 위해서도 개인 메모리가 필요한데 이것을 에이전트 개인 메모리(agent private memory)’라고 한다

DB2 9.5 새로운 기능

 

DB2 9.5 메모리와 관련하여 다음과 같은 주요기능들이 향상됐다.

 

단순화된 다중 스레드 아키텍처. DB2 9.5 모든 플랫폼에 다중 스레드 아키텍처가 있다. 9.5 이전버전에서 유닉스리눅스 기반 DB2  에이전트가 각각 고유 프로세스를 실행하는 프로세스 기반 모델을 사용했다다중 스레드 아키텍처는 DB2 메모리 footprint  줄인다instance_memory 라는 단일 매개 변수를 사용하여 데이터베이스 매니저가 개인  공유 메모리 힙에 할당할  있는 모든 메모리를 지정할  있다또한 appl_memory   새로운 구성 매개 변수를 사용하여 애플리케이션 요청을 처리하는  할당되는 최대 애플리케이션 메모리 양을 DB2 데이터베이스 에이전트가 제어할  있다.

 

모든 플랫폼에서 사용 가능한 STMM. DB2 9.1에서는 AIX  Windows에서만 전체 데이터베이스 메모리에 대해 database_memory 매개 변수를 AUTOMATIC으로 설정하여 STMM 사용할  있었다.그러나 DB2 9.5에서는 모든 플랫폼에서 사용이 가능하다.

 

보다 많은 구성 매개 변수를 자동으로 설정하여 동적으로 구성할  있다. 이러한 매개 변수에는applheapsz, database_memory, dbheap, instance_memory, mon_heap_sz, stat_heap_sz, stmtheap등이 있다 

NO FILE SYSTEM CACHING 기본이다. DB2 9.5에서 테이블스페이스 컨테이너를 만들면 기본적으로 데이터베이스 매니저가 가능한 경우마다 동시(concurrent)I/O(CIO) 사용하려고 시도한다. CIO지원되지 않는 시스템 구성의 경우 직접(direct) I/O(DIO) 또는 버퍼링된 (buffered) I/O 대신 사용된다. CIO DIO 설정하면 데이터베이스 매니저가 파일 시스템 레벨에서 캐싱을 사용하지 않기 때문에 메모리 성능이 향상된다. 
 메모리 세트는 다양한 메모리 (pool) 구성하고 있다. <그림 1> 에서는 메모리 풀의 이름이 나열되어 있다예를 들어 Locklist 데이터베이스 공유 메모리 세트에 속한 메모리 풀이다개별 정렬(private sort heap) 에이전트 개인 메모리 세트에 속한 메모리 풀이다.









db2pd 사용

이제 db2pd 사용하여 DB2 메모리 구조 탐색을 살펴보자. <목록 1> 에서는 db2pd  (db2pd-memset) 사용하여 인스턴스 공유메모리의 메모리 세트를   있다


<목록 1> 인스턴스 공유 메모리 세트 탐색

DB2 Information Center(버전 9)  열의 내용이 설명되어 있다. :

Name : 메모리 세트의 이름.

Address : 메모리 세트의 주소

Id : 메모리 세트의 ID.

Size(Kb) : 메모리 세트의 크기 (KB 단위)

Key : 메모리 세트 (유닉스 기반 시스템 전용)

DBP : 메모리 세트를 소유한 데이터베이스 파티션 서버

Type : 메모리 세트 유형

Unrsv(Kb) : 특정 풀에 예약되지 않은 메모리필요한 경우 세트의 모든 풀이  메모리를 사용할  있다.

Used(Kb) : 현재 메모리 풀에 할당된 메모리 표시.

Cmt(Kb) : DB2 데이터베이스에서 커밋한 메모리  물리적 RAM. 페이징 스페이스 또는  모두를 사용하는 모든 메모리 표시.

Uncmt(Kb) : 현재 사용 중이 아니며 DB2 데이터베이스가 커밋되지 않을 것으로 표시한 메모리운영 체제에 따라  메모리가 물리적 RAM, 페이징 스페이스 또는  모두를 사용할  있다.

<목록 1> memset 실행 결과는 DB2 인스턴스 레벨에서 3개의 메모리 세트(DBMS, FMP  Trace) 만들었음을 나타낸다. 3개의 메모리 세트는 유닉스 기반 시스템에서 ipcs 명령을 사용한 경우   있는 공유 메모리 세그먼츠와 같다<목록 2>.


<목록 2>  공유 메모리 세그먼트

ipcs 실행 결과 shmid 열에 있는 DB2 메모리 세트의 Id  값을 보자. 3메모리 세트 모두 <목록 2> 빨간색 글꼴로 표시된 것과 같이ipcs 결과에 대응하는 행이 있다메모리 세트의 크기는 KB에서 바이트로 단위 변환을 수행한 경우 ipcs 바이트 열과 일치한다하지만 ipcs DB2 해당 공유 메모리 세그먼트에서 수행하는 작업을 표시하지는 않는다공유 메모리 세그먼트에 대해  자세히 알아 보려면 db2pd 사용해야 한다. <목록 1> db2pd 실행 결과를 보면  메모리 세트에 대한 다음과 같은 질문에 답을   있다.

  • 메모리 풀에 현재 할당된 메모리의 양은?
  • 제한되지 않은 메모리의 양은?
  • 커밋된 메모리의 양은?
  • 커밋되지 않은 메모리의 양은?

<목록 1> 3개의 메모리 세트 중에서 DBMS 데이터베이스 매니저에 의해 사용된 메모 리를 처리하기 때문에 가장 중요하다. DBMS 구성 매개 변수인 INSTANCE_MEMORY DBMS 메모리 세트의 크기를 제어한다 매개 변수의 기본 값은 AUTOMATIC으로 DB2  DBMS 메모리 세트의 메모리  크기에 따라 값을 자동으로 결정된다는 것을 의미한다. INSTANCE_MEMORY 매개 변수의 현재 값은 <목록 3> show detail 옵션을 사용하며 나타낼  있다


<목록 3> INSTANCE_MEMORY 매개 변수의  찾기

DBMS 메모리 세트의 크기는 오버헤드를 수용하기 위한  KB 제외된 값이기 때문에 INSTANCE_MEMORY(6176x4KB) 값과 완전히똑같지 않다.

인스턴스 레벨 메모리 세트를 자세히 확인하여 개별 메모리 풀을 찾아보자. <목록 4> db2pd-mempools 명령의 결과를 나타낸다.메모리 세트 DBMS 아래 9개의 메모리 풀이 있고 메모리 세트 FMP 아래  개의 메모리 풀이 있다메모리 풀이 구성 매개 변수와관련되어 있는 경우 마지막 열인 CfgPam 아래서 찾을  있다논리적 크기(LogSz) 현재  메모리 요청의  합계이며 물리적 크기 (PhySz) 논리적 크기에 필요한 물리적 메모리이다.


<목록 4> db2pd- mempools 결과

물리적 크기를 RAM 내부에 할당된 메모리와 혼동하지 않아야 한다애플리케이션( 경우 DB2) 항상 가상 메모리를 사용한다따라서 물리적 아래 표시된 메모리는 RAM 있을 수도 있고 스왑 디스크에 있을 수도 있으며 가상 메모리 매니저에 의해 제어된다또한 논리적 크기는 DB2 다른 메모리 풀에 어떻게 메모리를 사용하는지를 나타내는 것으로 메모리 블록의 집합이다메모리 블록수는 BlkCnt  아래에 표시되어 있다.

db2pd memblocks옵션을 사용하여 메모리 풀에 대한 모든 메모리 블록  해당 메모리 블록을 만든 DB2 실행 파일 부분과 같은 자세한 내용을 찾을  있다. <목록 5>에서는  ID 11 메모리 블록(monh) 보여준다


<목록 5> pool 11 대한 DBMS 세트의 메모리 블록.

memblocks 실행 결과에는  가지 섹션이 있다 번째는 모든 메모리 블록을 개별적으로 나열한다. 6번째 열인I 할당 형식을 나타낸다 1 블록이 개별적으로 비워짐을 표시한다 0 풀과 함께 비워짐을 의미한다 번째 섹션은 메모리 블록을 File(블록이 할당된 위치로부터의 파일 이름 해시  LOC(메모리 블록에 할당된 코드 열로 그룹화한다모든 메모리 풀에 대해 명령이실행되면  번째 섹션이  메모리 풀에 대해 반복된다 번째 섹션에는 특정 File  LOC 속하는 메모리 블록의 %바이트  % Count 같은 요약 통계가 있다.

DB2 9 이전 버전에는 db2pd memblocks 대신 memb 옵션이 있었다그러나 memb data available 보려면 다음 명령을 사용하여 DB2MEMDBG 레지스트리를 FFDC 설정해야 한다. :

db2set DB2MEMDBG=FFDC

DB2 9 버전에서는 memblock 대한 데이터 옵션을 기본적으로 사용할  있다.

메모리 세트메모리   메모리 블록 간의 관계를 이해하려면 다음 사항에 유의해야 한다.

  • Size – Unrsv 메모리 세트는 메모리 세트가 소유한 모든 메모리 풀의 PhyUpBnd 합계와 거의 같다.
  • 메모리 풀의 물리적 크기는 논리적 크기보다 항상 크거나 같다.
  • DBMS 메모리 세트에서 메모리 풀의 물리적 크기 합계는 메모리 세트의 사용된 크기와 거의 같다.
  • 메모리 풀의 논리적 크기는 해당 메모리 풀에서 소유한 모든 메모리 블록 크기의 합계와 같다.

문제해결

db2pd 사용하면 DB2 파일에서 어떤 코드 줄이 특정 메모리 블록을 할당했는지 정확하게 추적할  있다. LOC 정보가 IBM DB2 기술 지원에서 보다 유용하다고 해도 메모리 세트 단계에서 메모리 사용을 이해하고 메모리 블록 단계까지 자세히 살펴본다면 여러 메모리 관련 문제를 해결할  있다.

예를 들어 <목록 6> 표시된 DB2 diag 로그의 메모리 할당 오류는 여러 가지 원인으로 인해 발생될  있다


<목록 6> 메모리 할당 오류

 

메모리가 조각화 되었거나 프로세스의 가상 주소 공간 부족메모리 누수 문제가 있는 경우 OS 레벨에서 사용 가능한 메모리가 있는지 확인해야 한다메모리가 DB2  의해 현재 어떻게 사용되고 있는지 이해하면 이러한 문제를 해결하는데 도움이 된다.

<목록 7>에서는 memset  mempools 실행 결과의 예를 나타낸다(DB2 V8.2 FP4 on Windows로부터의 예제).


<목록 7> memset  mempools 실행 결과.

DBMS 메모리 세트 아래 있는 모든 메모리 풀의 물리적 크기를 더하면 8208KB 된다하지만 DBMS 메모리 세트의 Used(Kb) 보면 101216이다. Commit(Kb) 더욱 커서 253648이다그렇지만 Size(Kb) 26192 밖에 되지 않는다이것은 DBMS 메모리 세트가원래 26192KB 추정되었음은 나타낸다 값은 DBMS 메모리 세트가 소유한 모든 메모리 풀의 PhyUpBnd 합계와 거의 같다. DBMS 메모리 세트 아래 있는 모든 메모리 풀이 사용하는 물리적 메모리는 8208Kb이다하지만 DBMS 메모리 세트에 할당된 메모리가  많이 있으며 이러함 메모리는 설명될  없거나 메모리 누수로 인한 경우가 대부분이다 필요하지 않거나 비워졌어야 하는 메모리가 실제로는 비워지지 않은 상태로 남아 있는 것이 . .

데이터베이스  애플리케이션 레벨 메모리 세트.

지금까지 인스턴스 레벨 메모리 세트메모리   메모리 블록에 대해 살펴보았다이제 데이터베이스  애플리케이션 레벨 메모리 세트에 대해 알아보자.


<목록 8> memset 실행 결과.

<목록 8> 결과에는 6개의 메모리 세트가 표시되어 있다 번째 세트(TEST) 데이터 베이스 TEST 대한 데이터베이스 레벨 공유 메모리 세트에 해당된다 번째 세트 (Seg0) 애플리케이션 그룹 레벨 공유 메모리 세트에 해당된다. Seg0 들여쓰기로 표시되어 있는데 TEST 메모리 세트 내부에서 Seg0 만들어진다나머지 4개의 세트는  애플리케이션   개씩이다이들 메모리 세트의 이름에는 애플리케이션 핸들이 접미 번호로 포함되어 있다 메모리 세트는 에이전트 개인 메모리가 아니다에이전트/애플리케이션 공유 메모리로 애플리케이션과 에이전트 프로세스  연계에 사용된다이것은 메모  세트의 5번째 유형으로 로컬 애플리케이션에만 존재한다 메모리 세트는 애플리케이  지원 레이어 (aslheapsz) 클라이언트 I/O 블록(rqrioblk) 영향을 받는다.

OS 레벨에서 ipcs 명령을 사용하여 공유 메모리 세그먼트를 살펴보자. <목록 8> 메모리 세트 결과에서 Id=0 항목이 <목록 9>ipcs 실행 결과에서 대응하는 항목이 없으며  기가 0임에 유의해야 한다왜냐하면 연결된 애플리케이션에 에이전트/애플리케이션공유 메모리가 없기 때문이다또한 TEST 메모리 세트의 크기는 TEST  Seg0 메모리 세트에 해당하는 메모리 세그먼트이 바이트합계와 같다. Seg0 메모리 세트가 TEST 메모리 세트 내부에 만들어졌기 때문이다.


<목록 9> 공유 메모리 세그먼트를 보여주는 ipcs 실행 결과

DATABASE_MEMORY DB 구성 매개 변수는 TEST 메모리 세트의 크기를 제어한다. DB2 9 버전에서  매개 변수의 기본 값은COMPUTED(AIX  Windows 제외). 상세표시 옵션을 사용하면  매개 변수의 현재 값을   있다<목록 10 참고>.


<목록 10> DATABASE_MEMORY DB 매개 변수의  확인.

메모리 세트 TEST(데이터베이스) 소유한 메모리 풀을 살펴보자.


<목록 11> TEST 소유한 메모리 

bph라는 메모리 풀은 버퍼 풀이다. <목록 11> bph라는 이름을 가진 메모리 풀을 5 표시하고 있지만 데이터베이스에는 버퍼 불이 개만 있다나머지 항목 4개는 페이지 크기가 4K, 8K, 16K  32K 4개의 작은 숨겨진 버퍼 풀에 해당된다CfgParm 열은 관련구성 매개 변수 이름이며BlkCnt열은 메모리 풀이 가지고 있는 블록  이다. memblocks 옵션을 사용하면 메모리 풀이 소유한 모든메모리 블록을   있다예를 들어 db2pd - memblocks 7 -db test id 7  메모리 (pckcacheh) 소유한 모든 메모리 블록이 표시된다출력 형식은 위에서 설명한 인스턴스 레벨 메모리 블록의 경우와 유사하다.

인스턴스 레벨 메모리 세트메모리   메모리 블록 간의 관계에 대해 이미 나열된 내용은 데이터베이스 레벨 메모리 세트메모리  메모리 블록에서도 유효하다.

지금까지 db2pd 사용하여 공유 메모리를 찾는 방법을 설명했다. db2pd 사용하면 에이전트 개인 메모리도 찾을  있다. Windows에서 db2pd – memblocks private 명령을 실행하면 모든 개인 메모리 블록이 표시된다. Linux  Unix에서 db2pd – memblocks pid=<AgentPid> 명령을 실행하면 에이전트 개인 메모리를 찾을  있다db2pd –agents app=<AppHandle> 명령을 실행하면 애플리케이션의 에이전트를 모두 찾을  있다.

자가 튜닝 메모리 매니저(STMM)

DB2 메모리 구성 매개 변수가 다양하기 때문에 다양한 매개 변수를 튜닝하는 작업은 상당히 복잡하고 높은 기술을 요구한다. DBA 튜닝 수행에 필요한 기술을 가지고 있어도  지속적인 모니터링모니터된 데이터의 분석분석을 기반으로  구성 매개 변수의 새로운  추정을 요구된다이러한 작업에는 많은 시간이 소요되며 워크로드가 계속 변하는 환경에서 최적의 구성을 위해 DBA메모리 매개 변수를 계속 튜닝 하는 것은 거의  가능하다.

DB2 메모리 구성 작업을 단순화하기 위해 IBM DB2 9 버전에서 자가 튜닝 메모리 매니 (STMM) 도입했다. STMM 여러 메모리 구성 매개 변수의 값을 자동으로 설정한다사용이 가능하도록 설정이 된다면메모리 튜너는 정렬패키지 캐시잠금 목록  버퍼풀  버퍼풀을 포함하여 여러 메모리 소비자 사이에 사용 가능한 메모리 리소스를 동적으로 배분 한다. STMM 지능형 제어(intelligent control) 피드백 매커니즘을 사용하여 워크로드 특성메모리 소비  데이터베이스의 다양한 공유 리소스 요구에 대한 변화를 계속 추척하고  요에 따라 메모리 사용을 동적으로 적용한다예를 들어 정렬 작업에  많은 메모리  필요하고 일부버퍼 풀에 메모리가 초과되는 경우 STMM 과도한 버퍼  메모리를 비워서 해당 메모리를 정렬 힙에 할당한다


<그림 4> 데이터베이스 메모리

<그림 4> 표시된 것처럼 다음 메모리 소비(또는 서브셋) STMM 사용한다.

  • 버퍼 (ALTER BUFFERPOOL  CREATE BUFFERPOOL으로 제어)
  • 패키지 캐시(pckcachesz 구성 매개 변수로 제어)
  • 잠금 메모리(locklist  maxlocks 구성 매개 변수로 제어)
  • 정렬 메모리(sheapthres_shr  sortheap 구성 매개 변수로 제어).

STMM database_memory 구성 매개 변수로 정의한 메모리 제한 내에서 작동된다그러  database_memory  자체는 AIX Windows에서 자동으로 튜닝될  있다. dabase_ Memory 자가 튜닝으로 설정하면(AUTOMATIC으로 설정)튜너가 데이터베이스에대한 전체 메모리 요구사항을 확인하고 현재 데이터베이스 요구 사항에 따라 데이터베이스 공유 메모리에 할당된 메모리 양을 늘리거나 줄인다.

파티션된 DB2 환경에서 모든 노드는  개의 메모리 튜너가 있기 때문에 STMM 모든 노드에서 일관된 구성을 유지하려고 노력한다그러나 워크로드가 가용한 리소스의 차이로 인해  노드에 다른 구성이 필요한 경우 STMM 사용해서는  된다.

메모리 마일스톤(Memory Milestones)

DB2 9 메모리 사용을 모니터링하기 위해 다양한 구성 매개 변수와 도구를 제공한다그러나 다른 도구로부터의 결과와 서로 연관되면 더욱 어려워짐에 따라 결과의 해석이 어려울  있다가상메모리와 DB2 메모리 아키텍처의 개념을 이해하지 않고 DB2 메모리사용을 이해하는 것은 쉽지 않다지금까지 가상메모리와 DB2 메모리 아키텍처의 개념을 설명했고, DB2 문제 진단 도구(db2pd)사용하여 DB2 메모리 사용을 탐색하기 위한 단계적 접근 방법을 제시했다이번 기술자료에서 설명한 모니터링 접근방식은 어떠한메모리 관련 문제를 해결하는데 도움이  것이다.

DB2 9 도입된 자가 튜닝 메모리 매니저(STMM) 메모리 관련 구성 매개 변수 튜닝 작업을 단순화 시킨다. DB2 9.5에서는STMM 기능이 더욱 향상되어 자가 튜닝을 위한 구성 매개 변수가 보다 많이 포함되어 있다.


http://www.dbmag.intelligententerprise.com/story/showArticle.jhtml?articleID=202805692

728x90

'Db2 > Db2 reference' 카테고리의 다른 글

db2 접속환경설정  (0) 2011.03.13
db2 접속 및 종료  (0) 2011.03.13
DB2 데이터 암호화 함수 사용법  (0) 2011.03.08
Monitoring Script  (0) 2010.07.27
db2diag.log 분할하기  (0) 2010.01.21
728x90

커널 파라미터 설정

각각의 OS별로 검사해야 할 커널 파라미터는 다르지만 대부분 (1) 프로세스별 메모리 할당 한계값(memory allocation limit) (2) 쓰레드 관련 파라미터 (3) 공유 메모리 세그먼트 최대 크기 (4) 세마포어 관련 파라미터들의 수정이 이루어져야 한다.

메모리 할당 한계값

각 프로세스가 할당(allocation)할 수 있는 메모리 공간에 관련된 파라미터(hp의 경우 maxdsiz_64bit, dec의 경우 per-proc-address-space)의 경우 알티베이스가 운용될 수 있는 충분한 공간이 제공되어야 한다. 그렇지 않을 경우 운용 중에 실제 물리적 메모리가 충분함에도 불구하고 insufficient memory error가 발생하게 된다.

공유 메모리 세그먼트 최대 크기

일반적으로 알티베이스는 메모리 상의 공유 메모리(shared memory)에 데이터베이스를 저장하기 때문에 공유 메모리 세그먼트(공유 메모리 세그먼트)와 관련된 커널 파라미터가 적절히 수정되어야 한다. 알티베이스가 사용하는 공유 메모리 세그먼트의 크기는 알티베이스 설정에 따라서 달라진다. 영향을 미치는 파라미터는 STARTUP_SHM_CHUNK_SIZE, PERS_PAGE_CHUNK_COUNT 이 두 가지인데 앞의 파라미터 STARTUP_SHM_CHUNK_SIZE는 알티베이스 구동시 공유 메모리 세그먼트의 크기를 결정하는 파라미터로서 만약 이 파라미터보다 데이터베이스의 크기가 클 경우에는 이 파라미터를 기준으로 해서 공유 메모리 세그먼트가 분할되어져서 만들어진다. 알티베이스 운용 중에 데이터 저장 공간이 부족하여 새롭게 메모리 할당이 생겨서 공유 메모리 세그먼트가 추가되어질 경우에는 PERS_PAGE_CHUNK_COUNT 파라미터의 크기 만큼씩 공유 메모리 세그먼트가 분할되어져서 만들어진다. 결국 알티베이스 운영 중에 아무런 문제가 발생하지 않으려면 시스템에서 제공하는 공유 메모리 세그먼트의 최대 크기를 위의 파라미터에 의해서 만들어지는 공유 메모리 세그먼트보다 크게 만들어야 알티베이스 구동 시나 새로운 공유 메모리 세그먼트 할당시 문제가 발생하지 않는다. 만약 커널 파라미터가 충분히 크지 않을 경우 알티베이스 구동 시나 운용 시 shmget() system call에서 에러가 발생하게 된다.

세마포어 파라미터

세마포어 파라미터의 경우에는 클라이언트 프로그램과 알티베이스가 IPC 통신을 하기 위해서 변경이 필요하며 그 값들은 동시에 IPC 연결을 하는 세션 수와 연관이 있다.

  • HP-UX(11.00, 11i )

    HP에서는 커널 파라미터 수정을 위해서 sam이라는 유틸리티가 존재한다. 아래의 방법으로 커널 파라미터를 수정하면 되는데 반드시 시스템을 리부팅하여야 하는 점을 명심해야 한다.

    루트 계정에서 sam을 수행한 후 kernel configuration => configurable 파라미터 화면에서 아래의 커널 파라미터를 수정한다. 그리고 나서 menu 화면의 action에서 process new kernel로 반드시 커널을 재구성(rebuild)한 후 시스템을 리부팅한다.

  • Sun Solaris

    Sun Solaris의 경우 커널 파라미터를 수정하려면 /etc/system 파일을 편집한 후 시스템을 리부팅하여야 한다. 아래 priority_paging은 Sun 시스템의 파일시스템 캐시(filesystem cache)에 관련된 파라미터로서 direct I/O를 사용하지 않고 파일시스템 캐시를 이용할 경우 메모리 사용량이 높게 나오는 문제 때문에 반드시 설정되어야 한다.

  • IBM AIX

    AIX의 경우에는 공유 메모리와 세마포어 관련해서 특별히 맞추어 줄 필요는 없고 단지 사용자별 한계값(User Resource Limit, ulimit 명령어로 확인)의 값들을 바꾸어 주어야 한다. 각 사용자별 한계값을 바꾸기 전에 시스템 한계값(system level resource limit)을 우선 바꾸어야 하는데 이것은 /etc/security/limits 의 편집만으로 가능하다. 이 화일에서 default:부분의 data, rss, dsize를 각각 -1 ( unlimited)로 맞추면 된다. 그렇게 한 후 아래의 작업을 하여서 알티베이스 사용자의 사용자별 한계값을 바꿀 수 있다.

  • Digital UNIX (OSF1) (V4.0)

    Dec OS의 경우 V4.0과 V5.1에서 사용되는 파라미터의 이름은 다르지만 비슷하기 때문에 유추해서 판단하면 된다. 그리고 hp와 마찬가지로 프로세스와 IPC에 관련된 많은 파라미터들이 수정되어야 한다. Dec 파라미터는 크게 세 부분, PROC(Process ) , IPC, VM(Virtual memory )으로 나누어져 있으며 아래의 명령어로 각각의 파트에 속한 파라미터 이름과 현재 설정된 값을 확인할 수 있다.

        /sbin/sysconfig -q proc : Process resource limitation의 값 
        /sbin/sysconfig -q IPC  : IPC 파라미터의 값 
        /sbin/sysconfig -q vm  : Virtual memory 파라미터값 
        uerf -r 300 |grep -i mem : 현재 시스템의 실제 메모리 크기
                  

    Proc subsystem 관련 파라미터들은 대개 프로세스의 memory address limit에 관련된 값이므로 알티베이스와 밀접한 관계가 있다. 즉 max-per-proc-data-size의 값 이상으로 프로세스 데이터(process data) 영역을 할당받을 수 없다. 그러므로 해당 값들은 되도록 크게 설정해야 문제가 없다. (per-proc-data-size, max-per-proc-data-size, max-per-proc-address-space, per-proc-address-space)

    IPC subsystem의 경우 당연히 shm-max(최대 공유 메모리 세그먼트의 크기)는 데이터베이스 크기 및 알티베이스 프로퍼티 값과 연관지어서 크게 설정해야 하고 세마포어와 관련된 파라미터 값들도 IPC 통신을 사용할 것이라면 크게 설정해야 한다.

    VM subsystem에서 주의할 파라미터는 vm-vpagemax (contiguous virtual memory address max) 값이다. 이 값이 작을 경우 데이터베이스 생성시 insufficient memory error가 발생할 수 있으니 유의하기 바란다. (OSF1 V5.1에서는 위의 파라미터가 없어진 것 같다. )

    /etc/sysconfigtab 파일에 아래의 내용이 포함되지 않았다면 아래의 내용을 파일에 추가한 후 시스템을 리부팅하여야 한다.

    * V5.0이상에서는 아래의 파라미터 이름이 조금씩 다르지만 해당 파라미터들의 값을 똑같이 설정하면 된다.

  • Linux (RedHat 계열)

    /etc/rc.d/rc.local의 마지막 부분을 아래와 같이 편집한 후 재부팅 하면 된다.

     
        echo 2147483648 > /proc/sys/kernel/shmmax
        echo 512 32000 512 512 > /proc/sys/kernel/sem
    	      

    또는

        위의 명령어를 재부팅할 때마다 쉘에서 수행하면 된다.
    	      

    * IPC 사용에 대한 주의사항

    Linux Kernel 2.5 이하 version에서는 thread program에서 SEM_UNDO를 사용하는 semaphore operation에 문제점이 보고되어 있다.

    이러한 문제점은 알티베이스에서 다음과 같은 현상으로 나타난다.

    Client의 빈번한 연결 및 해제가 다른 cilent의 동작에 영향을 미쳐 정상동작하는 client의 접속이 끊어지는 현상이 발생할 수 있다.

728x90
728x90

다음은 nmon 툴이 실행되는 플랫폼이다.

  • AIX® 4.1.5, 4.2.0 , 4.3.2, 4.3.3 (nmon Version 9a: 본 버전은 기능적으로 안정화 되었고, 추가 개발 계획은 없다.)
  • AIX 5.1, 5.2, 5.3 (nmon Version 10: 본 버전은 SMT와 공유 CPU 마이크로 파티션을 갖춘 AIX 5.3과 POWER5™ 프로세서 기반 머신을 지원한다.)
  • Linux® SUSE SLES 9, Red Hat EL 3 and 4, Debian on pSeries® p5, OpenPower™
  • Linux SUSE, Red Hat, x86 기반 최신 배포판들 (32-bit 모드의 Intel과 AMD)
  • zSeries® 또는 메인프레임 기반 Linux SUSE와 Red Hat

nmon 툴은 6 개월 마다 업데이트 되거나, 새로운 OS가 릴리스 될 때 업데이트 된다. 이메일 리스트에 등록하여 업데이트를 받아보려면 Nigel Griffiths에게 문의하라.

nmon 아웃풋 파일을 로딩하고 수 십 개의 그래프를 자동으로 생성하는 nmon 애널라이저와 함께 사용하라. (참고자료)

머리말

nmon 툴은 AIX와 리눅스 성능 전문가들이 다음과 같은 성능 데이터의 모니터링과 분석에 사용할 수 있도록 고안된 툴이다.

  • CPU 사용
  • 메모리 사용
  • 커널 통계와 실행 큐 정보
  • 디스크 I/O 비율, 트랜스퍼, 읽기/쓰기 비율
  • 파일 시스템의 여유 공간
  • 디스크 어댑터
  • 네트워크 I/O 비율, 트랜스퍼, 읽기/쓰기 비율
  • 페이징 공간과 페이징 비율
  • CPU와 AIX 스팩
  • 탑 프로세서
  • IBM HTTP 웹 캐시(cache)
  • 사용자 정의 디스크 그룹
  • 머신 상세와 리소스
  • 비동기식 I/O -- AIX 전용
  • 워크로드 매니저(WLM) -- AIX 전용
  • IBM TotalStorage® Enterprise Storage Server® (ESS) 디스크 -- AIX 전용
  • 네트워크 파일 시스템(NFS)
  • Dynamic LPAR (DLPAR) 변경 -- AIX 또는 리눅스용 pSeries p5와 OpenPower 전용

nmon 아웃풋에서 그래프를 만들어내고, 웹 사이트에 디스플레이 될 수 있는 .gif 파일을 생성하는 새로운 툴이 포함된다.

자세한 내용은 README 파일을 참조하라.

툴의 효용성

nmon 툴은 모든 중요한 성능 튜닝 정보를 하나의 스크린에 나타내고 이를 동적으로 업데이트 한다. 이 툴은 모든 Dumb Screen, 텔넷 세션, Dial-up Line에서 작동한다. 게다가, 많은 CPU 사이클을 소비하지 않으며, 일반적으로 2% 미만이다. 새로운 머신에서는 CPU 사용도는 1% 미만이다.

데이터가 스크린에 디스플레이 되고 2초 마다 한 번씩 업데이트 된다. 하지만, 이 시간 간격을 더 길거나 짧게 쉽게 변경할 수 있다. 창을 늘리고 X Windows, VNC, PuTTY 등에 데이터를 디스플레이 하면, nmon 툴은 많은 양의 정보를 한 공간에 출력할 수 있다.

nmon 툴은 향후 분석을 위해 같은 데이터를 텍스트 파일로 캡쳐하고 그래프로 만들 수 있다.

툴 설치하기

본 툴은 독립형 바이너리 파일로서(AIX나 리눅스 버전 마다 다른 파일임), 설치에 5초 정도 소요되며, 타이핑이 빠르다면 더욱 빠르게 할 수 있다. 설치는 간단하다.

  • nmonXXX.tar.Z 파일을 머신에 복사한다. FTP를 사용하고 있다면 바이너리 모드를 사용하라. 
    주: XXX는 버전을 나타낸다.
  • uncompress nmonXX.tar.Z를 실행하여 파일 압축을 푼다.
  • tar xvf nmonXX.tar를 실행하여 파일을 추출한다.
  • README 파일을 읽는다.
  • nmon 툴을 시작하려면 nmon을 타이핑 한다.
  • 루트(root) 사용자라면 ./nmon으로 타이핑 해야 한다.

AIX 4 전용 nmon 9 사용에 대한 추가 노트

  1. 여러분이 루트 사용자이거나, 또는 (루트로서) 다음 명령어를 타이핑 하여 일반 사용자가 /dev/kmem 파일을 읽을 수 있도록 해야 한다.
    chmod ugo+r /dev/kmem

  2. 디스크 통계가 필요하다면 (루트로서) 다음을 실행한다.
    chdev -l sys0 -a iostat=true 

툴을 대화식으로 실행하는 방법

툴을 대화식으로 실행하려면, 파일의 앞부분을 읽어보라. 그런 다음, 툴을 시작하고 one-key 명령어를 사용하여 원하는 데이터를 본다. 예를 들어, CPUMemoryDisk 통계를 보려면 nmon을 시작하고 다음을 타이핑 한다.

cmd

대화식으로 실행하면서 도움말 정보 얻는 방법

h 키를 누른다.

추가 도움말 정보

추가 도움말 정보가 필요하다면 다음과 같이 한다.

  • nmon -? 명령어는 간략한 상세를 보여준다.
  • nmon -h 명령어는 전체적인 상세 내용을 보여준다.
  • README 파일을 읽는다.

향후 분석과 그래프를 위해 데이터를 파일로 캡쳐하는 방법

-f 플래그와 함께 nmon을 실행한다. nmon -h를 사용하여 상세를 볼 수 있다. 예를 들어, 30초 마다 데이터 스냅샷을 찍으면서 한 시간 동안 nmon을 실행하려면,

nmon -f -s 30 -c 120
nmon -fT -s 30 -c 120

두 번째 행은 탑 프로세스들도 캡쳐한다. 이 두 가지 모두 다음과 같은 현재 디렉토리에 아웃풋 파일을 만든다.

<hostname>_date_time.nmon

이 파일은 comma-separated values (CVS) 포맷으로 되어있으며, 스프레드시트로 직접 반입될 수 있다. Lotus® 1-2-3를 사용하고 있다면, 이 파일은 정렬되어야 한다. (Excel 버전의 nmon 애널라이저의 경우는 이렇게 할 필요가 없다.) AIX에서는 다음과 같은 예를 따른다.

sort -A mymachine_311201_1030.nmon > xxx.csv

시간을 절약할 수 있는 방법:

  • nmon 데이터 캡쳐 파일을 스프레드시트로 로딩하려면, CVS 데이터 파일(.csv)용 스프레드시트 문서를 확인한다. 많은 스프레드시트는 이를 수행하는 반입 함수를 로딩 또는 제공하는 파일들 중 하나로서 이 데이터를 허용한다. 많은 스프레드시트들은 고정된 수의 칼럼과 행을 갖고 있다. 이러한 문제를 해결하려면 최대 300 스냅샷을 수집할 것을 권한다.
  • 데이터를 파일로 캡쳐할 때, nmon은 쉘에서 연결을 해제하여, 여러분이 로그아웃을 하더라도 계속 실행되는지를 확인한다. 다시 말해서, 백그라운드에서 여전히 실행되더라도 nmon이 충돌하는 것처럼 보일 수 있다는 의미이다. 프로세스가 여전히 실행되는지를 확인하려면, 다음을 타이핑 한다.
    ps ?ef | grep nmon

  • 특정 OS에서 어떤 버전의 nmon이 실행되는지를 알고 싶다면 README 파일을 읽어보라.
  • AIX 5용 nmon Version 10은 더 이상 /dev/kmem을 사용하지 않고, 오직 공용 API만 사용한다. 따라서, /dev/kmem에 대한 권한을 변경할 필요가 없고 32-비트와 64-비트 버전의 nmon을 가질 필요가 없다.
  • AIX 5.1, 5.2, 5.3의 경우, nmon 10을 사용하라.
  • AIX의 경우, ML03에 대해서 AIX 5.1에 lslpp -Lcq bos.?p 코어 덤프를 리포트 하지 말라. WLM 통계는 AIX 5.2 ML5로 업그레이드 된 후에 소실된다. AIX 버그이기 때문이다. 이러한 문제는 nmon Version 10을 사용하여 해결한다.
  • Microsoft® Windows® Telnet을 사용하지 말고 80 x 25 캐릭터 보다 큰 윈도우를 사용하라. 많은 개발자들은 VNC와 PuTTY를 사용하여 Windows 머신에서 nmon을 디스플레이 한다.

AIX Version 10의 새로운 nmon 기능들

새로운 기능설명
Starting up올바른 nmon 버전을 시작하는 "nmon"이라고 하는 작은 쉘 스크립트가 있다. 이 스크립트와 nmon 바이너리를 $PATH에 놓고 nmon을 타이핑 한다. 이 버전은 32-비트 모드에서만 컴파일 된다. 32-비트와 64-비트 하드웨어에서 실행된다. 설치와 실행이 더욱 쉬워졌다.
N = NFSNFS는 nmon 10의 새로운 기능이다.
p = Partitions공유 CPU 파티션 정보에 관한 것이다. p5/AIX5.3을 위한 기능이다.
C = CPU32-PLUS CPU에서 최대 128 logical CPU를 갖춘 머신용이다.
c = CPUPOWER5기반 AIX 5.3을 사용하고 있고 공유 CPU 환경일 경우, 물리적 CPU 사용량에 대한 상세를 보여준다.
S = SubclassWLM 하위 클래스에 대한 것이다.
a = Disk adapters디스크 어댑터에 대한 상세를 제공한다.
r = ResourcesCPU 속도를 MHz로 나타낸다.
k = Kernel새로운 필드를 제공한다.
L = Large pages큰 페이지 통계를 제공한다.
D = Disk디스크, 디스크 유형 크기, 여유 공간, 볼륨 그룹, 어댑터에 관한 정보를 제공한다.
n = Network네트워크 어댑터 상세, MTU, 에러에 대한 정보를 제공한다.
m = Memory메모리가 어디로 가는지, 시스템(커널)과 프로세스, 활성 가상 메모리에 대한 상세를 제공한다.
-B박스를 제거하는 시작 옵션이다.

AIX 5에 대한 nmon 10의 아웃풋 샘플

그림 1은 샘플 스크린 아웃풋이다. AIX 5에 대한 오프닝 스크린을 보여주고 있고, 유용한 정보들이 많이 들어있다.


그림 1. AIX 5에 대한 nmon 10의 샘플 아웃풋 

Screen shot of AIX 5 opening screen

그림 2는 CPU(SMT 가 실행되는 4 CPU POWER5 머신), 메모리 사용, 커널 통계, 디스크 통계에 대한 상세를 나타낸다. 주: 논리적 파티션(LPAR)은 할당량의 6배를 사용하고 있다.


그림 2. 상세 CPU

Screen shot of CPU details

그림 3은 네트워크, NFS 통계, 저널 파일시스템 사용에 대한 상세를 보여준다.


그림 3. 상세 네트워크

Screen shot of network details

POWER5 공유 프로세서 마이크로 파티션 통계에 대한 상세는 그림 4에 나타나있다.


그림 4. 상세 LPAR 

Screen shot LPAR details

그림 5는 리눅스 버전의 nmon 상세를 설명하고 있다. CPU (SMT 가 실행되는 2 CPU POWER5), LPAR 통계, 메모리 사용, 네트워크 통계, 파일 시스템 사용, 디스크 통계를 보여주고 있다. 주: LPAR의 물리적 CPU는 SUSE SLES9 Service Pack 1과 Red Hat EL 4 Update 1에서만 사용할 수 있다.


그림 5. 리눅스 버전의 nmon

Screen shot of Linux OS details of the machine

그림 6은 머신의 OS 상세, 디스크 통계(상세 모드), 탑 프로세스를 보여준다.


그림 6. 리눅스 버전의 nmon 

Screen shot of Linux OS details of the machine


툴 다운로드 방법

툴의 다운로드 옵션은 다음과 같다.



참조 사이트 : 
http://www.ibm.com/developerworks/aix/library/au-analyze_aix/

728x90

'*nix' 카테고리의 다른 글

[AIX] svmon 명령어를 이용한 메모리 사용량 점검  (0) 2010.07.27
*NIX 별 커널 파라미터 설정  (0) 2010.07.07
man에서 한글 깨짐  (0) 2010.06.14
Unix 프로세스 Job Control  (0) 2010.06.14
sed 사용법  (0) 2010.06.01

+ Recent posts