728x90

1. db2 접속

db2 list db directory

db2 connect to <DB 이름>


2. db2 연결 확인

db2 list applications

db2 get snapshot for application agentid <응용프로그램 핸들 번호>


또는


db2pd -applications -db <DB 이름>


또는


db2 get connection state


3. 접속 종료

db2 connect reset/db2 terminate



TIP 1.

db2 명령어를 실행하면 DB2 세션이 시작되어 db2bp 프로세스가 생성되고,

connect 명령을 실행하면 db2agent 프로세스가 생성된다.


TIP 2.

connect reset과 terminate 모두 db2 접속을 종료하지만

terminate 명령은 back-end process(db2bp) 를 종료시킨다.


728x90

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

db2 제거시 접속 세션이 남아있을 때  (0) 2011.03.14
db2 접속환경설정  (0) 2011.03.13
DB2 데이터 암호화 함수 사용법  (0) 2011.03.08
Monitoring Script  (0) 2010.07.27
DB2 9의 메모리 모니터링과 튜닝  (0) 2010.07.13
728x90

1.DB2 UDB V7.2에서 새로 추가된 기능 중 하나로써, 특정 칼럼의 Data를 Encrypt/Decrypt 할 수 있습니다..


2.함수 설명

1. SET ENCRYPTION password : 향후 나오는 encrypt/decrypt 명령에서 사용될 password를 지정하는 명령문

2. ENCRYPT : 데이터의 encryption

3. DECRYPT_CHAR : encryption된 data를 VARCHAR 타입으로 decryption

4. DECRYPT_BIN : encryption된 data를 VARCHAR FOR BIT DATA타입으로 decryption

5. GETHINT : encryption된 data의 password에 대한 hint를 리턴.


3.제한사항

    encryption 칼럼 : CHAR FOR BIT DATA / VARCHAR FOR BIT DATA

 컬럼 길이 산정은 힌트가 없는 경우에는 16byte를 추가하고 힌트가 있을 경우에는 48byte를 추가합니다..

예) 일반적으로 주민번호컬럼이 char(13)으로 잡히지만..

     힌트가 없는 암호화 컬럼이라면 char(29)로 13byte에 16byte를 추가하여 타입을 정합니다..


4.기능구현

① 테이블 생성

주민번호(jumin_no)를 암호화 컬럼으로 한다면..

create table emp (

empno char(6) not null,

empname char(10) not null with default,

jumin_no char(29) for bit data not null with default);

② 데이터 삽입

insert into emp values

('000001','Nicole',encrypt('1234561234567','xxxx'));

==>위 insert문에서 xxxx는 주민번호를 암호화 할 패스워드를 의미합니다..

③ 데이터 조회

DECRYPT함수 사용하지 않고 조회 할 경우 HEX코드로 표시됩니다..

select jumin_no from emp

JUMIN_NO

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

x'00F808FF03CAD5AD11C27469109702B3'

그러므로

조회시에는 DECRYPT()함수를 사용해야만 데이터를 확인하실수 있습니다..

select decrypt_char(JUMIN_NO,'xxxx') from emp

JUMIN_NO

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

1234561234567


암호의 유효한 길이는 6 - 127입니다. 힌트의 유효한 길이는 0 - 32입니다.


http://database.sarang.net/?inc=read&aid=699&criteria=db2&subcrit=&id=&limit=20&keyword=decrypt&page=1

728x90

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

db2 접속환경설정  (0) 2011.03.13
db2 접속 및 종료  (0) 2011.03.13
Monitoring Script  (0) 2010.07.27
DB2 9의 메모리 모니터링과 튜닝  (0) 2010.07.13
db2diag.log 분할하기  (0) 2010.01.21
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

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

db2diag.log는 db에 문제가 생겼을 때 참조할 수 있는
가장 확실하고 가장 먼저 살펴볼 제 1의 레퍼런스이다.

db2diag.log는
active log, archive log, loadcopy, dump, tablespaces 와 함께
용량관리를 해주어야 하는 대상이 되는데

db2diag 커맨드는 db2diag.log를 분석하는 포매팅 툴로서,
제공하는 기능들 중에서 -A 옵션으로, db2diag.log를 분할하여 archive 할 수 있다.

in root's crontab

59 23 * * * su - ${instance user} -c "db2diag -A ${diagpath}/db2diag.log" > /dev/null 2>&1

매일 오후 23시 59분에 db2diag.log를 db2diag.log_YYYY-MM-DD-HH.MM.SS 형태로
하루에 하나씩 db2diag.log를 새로 생성하도록 해두면
로그를 검색하기도 쉽고 오래된 로그를 백업해두거나 삭제하는 정책을 만들기도 좋다.

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
DB2 9의 메모리 모니터링과 튜닝  (0) 2010.07.13

+ Recent posts