DB 디스크 I/O 모니터링

Tibero 데이터베이스 디스크 I/O 모니터링에 대해 설명합니다.

데이터 파일 I/O

데이터 파일의 I/O 정도와 시간을 확인합니다.

Single DB

다음은 Single DB 쿼리 작성 예입니다.

SELECT  fl.tablespace_name, 
        df.name,
        fs.phyrds, 
        fs.phywrts,
        round((PHYRDS / (SELECT sum(phyrds)
                FROM v$filestat)) *100, 1) "P_READ(%)", 
        round((PHYWRTS / DECODE((SELECT sum(phywrts)
                FROM v$filestat), 0, 1, (SELECT sum(phywrts) 
                FROM v$filestat)))*100, 1) "P_WRITE(%)",
        round((phyrds + phywrts) / (SELECT sum(phyrds) + sum(phywrts) 
                FROM v$filestat) * 100, 1) "TOTAL IO (%)" ,
        round(fs.AVGIOTIM/1000, 3) "AVG_TIME(msec)" 
FROM    V$DATAFILE df,
        V$FILESTAT fs,
        dba_data_files fl 
WHERE df.file# = fs.file#
        AND df.file# = fl.file_id 
ORDER BY phyrds+phywrts DESC;

결과는 아래와 같습니다.

TABLESPACE_NAME   NAME                                              PHYRDS     PHYWRTS     P_READ(%) P_WRITE(%)  TOTAL IO (%) AVG_TIME(msec)
---------------   ---------------------------------------------     ---------- ----------  ---------- ---------- ------------ --------------
UNDO              /home/t7/tibero7/database/t7/undo001.dtf              41      19044           1.9       53.2         50.3           .001
SYSTEM            /home/t7/tibero7/database/t7/system001.dtf          1589      10879          74.1       30.4         32.9           .002
SYSSUB            /home/t7/tibero7/database/t7/syssub001.dtf           512       5858          23.9       16.4         16.8           .001
USR               /home/t7/tibero7/database/t7/usr001.dtf                2         17            .1          0           .1           .001
TIBERO7           /home/t7/tibero7/database/t7/tibero7.dtf               1          0             0          0            0              0

각 항목에 대한 설명은 아래의 "TAC DB" 내용을 참고합니다.

TAC DB

다음은 TAC DB 쿼리 작성 예입니다.

SELECT rownum num, inst_id
       ,fl.tablespace_name
       ,df.name
       ,fs.phyrds
       ,fs.phywrts
       ,round((PHYRDS / (SELECT sum(phyrds) 
              FROM GV$FILESTAT fs
              WHERE inst_id = fs.inst_id)) *100, 1) "P_READ(%)"
       ,round((PHYWRTS / DECODE((SELECT sum(phywrts) 
              FROM GV$FILESTAT fs
              WHERE inst_id = fs.inst_id), 0, 1,(SELECT sum(phywrts) 
                     FROM GV$FILESTAT fs
                     WHERE inst_id = fs.inst_id)))*100, 1) "P_WRITE(%)"
       ,round((phyrds + phywrts) / (SELECT sum(phyrds) + sum(phywrts) 
              FROM GV$FILESTAT fs
              WHERE inst_id = fs.inst_id)*100, 1) "TOTAL IO (%)"
       ,round(fs.AVGIOTIM/1000,3) "AVG_TIME(msec)" 
FROM   V$DATAFILE df,
       GV$FILESTAT fs,
       dba_data_files fl 
WHERE df.file# = fs.file#
       AND df.file# = fl.file_id 
ORDER BY 1, phyrds+phywrts DESC;

결과는 아래와 같습니다.

 NUM    INST_ID    TABLESPACE_NAME      NAME                                    PHYRDS  PHYWRTS  P_READ(%) P_WRITE(%)  TOTAL IO (%)   AVG_TIME(msec)
------ ----------  -------------------- ----------------------------------- ----------  ------- ---------  ---------   ----------   --------------
    1           1        SYSTEM          +DS0/tac/datafile/system001.dtf          465     11         47.3       8.9            43             .012
    2           2        SYSTEM          +DS0/tac/datafile/system001.dtf          273      5         27.7         4          25.1             .012
    3           1        UNDO0           +DS0/tac/datafile/undo001.dtf             24     49          2.4      39.5           6.6             .059            
    4           2        UNDO0           +DS0/tac/datafile/undo001.dtf              0      4            0       3.2            .4             .024
    5           1        USR             +DS0/tac/datafile/usr001.dtf               1      0           .1         0            .1             .001
    6           2        USR             +DS0/tac/datafile/usr001.dtf               0      0            0         0             0                0     
    7           1        UNDO1           +DS0/tac/datafile/undo101.dtf             12      1          1.2        .8           1.2             .031
    8           2        UNDO1           +DS0/tac/datafile/undo101.dtf             11     27          1.1      21.8           3.4             .088
    9           1        SYSSUB          +DS0/tac/datafile/syssub001.dtf           74     11          7.5       8.9           7.7             .018
   10           2        SYSSUB          +DS0/tac/datafile/syssub001.dtf          123     16         12.5      12.9          12.5             .018
   11           1        TIBERO7         +DS0/tac/datafile/tibero7.dtf              1      0           .1         0            .1             .001
   12           2        TIBERO7         +DS0/tac/datafile/tibero7.dtf              0      0            0         0             0                0 

12 rows selected.

각 항목에 대한 설명은 다음과 같습니다.

항목

설명

INST_ID

Tibero 인스턴스 정보 (TAC DB 질의 쿼리)

TABLESPACE_NAME

Tablespace의 이름

NAME

생성된 데이터 파일 이름

PHYRDS

디스크에서 Block을 읽은 횟수

PHYWRTS

디스크에 Block을 쓴 횟수

P_READ(%)

해당 데이터 파일의 Read 빈도 (전체 Block Read 중에 해당 데이터파일의 비중)

P_WRITE(%)

해당 데이터 파일의 Write 빈도 (전체 Block Write중에 해당 데이터 파일의 비 중)

TOTAL IO(%)

해당 데이터 파일의 Read와 Write 빈도 (전체 Block Read와 Write중에 해당 데 이터 파일의 비중)

AVG_TIME

평균 I/O 시간 (기본값의 단위가 usec 이므로 적절히 변환하여 사용, 위의 예에서는 msec으로 표기)

데이터 파일의 I/O 정도와 시간을 확인한다. Read(%), Write(%), Total IO(%)는 데이터베이스내의 모든 파일에 대한 Read, Write, Read+Write 가운데 해당 파일이 차지하는 비율을 의미합니다.

평균 I/O 시간이 긴 데이터 파일에 대해서는 해당 데이터 파일이 위치한 디스크의 성능을 고려해야 하며 많은 데이 터 파일이 같은 위치에 있어 발생하는 I/O 병목현상의 가능성도 확인해야 합니다. 또한 I/O가 많이 발생하는 데이터 파 일은 하나의 Device에 몰리지 않도록 분산합니다.


Online Redo Log Switch 횟수

시간별로 Online Redo Log Switch의 횟수를 확인합니다.

Single DB

다음은 Single DB 쿼리 작성 예입니다.

SELECT     TO_CHAR(first_time,'MM/DD') ||' :'|| 
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'00',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'01',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'02',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'03',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'04',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'05',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'06',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'07',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'08',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'09',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'10',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'11',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'12',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'13',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'14',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'15',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'16',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'17',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'18',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'19',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'20',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'21',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'22',1,0)),'99') ||'|'||
           TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'23',1,0)),'99') ||'|'
as "Online Log_history : 00(h)~" 
FROM v$log
GROUP BY TO_CHAR(first_time,'MM/DD');

결과는 아래와 같습니다.

Online Log_history : 00(h)~
---------------------------------------------------------------------------------
06/28 : 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 2| 0| 0| 0| 0| 0| 0| 0| 0|

1 row selected.

각 항목에 대한 설명은 아래의 "TAC DB" 내용을 참고합니다.

TAC DB

다음은 TAC DB 쿼리 작성 예입니다.

SELECT 'Instance : '|| THREAD# as Inst_id, 
        TO_CHAR(first_time,'MM/DD') ||' :'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'00',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'01',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'02',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'03',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'04',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'05',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'06',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'07',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'08',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'09',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'10',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'11',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'12',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'13',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'14',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'15',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'16',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'17',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'18',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'19',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'20',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'21',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'22',1,0)),'99') ||'|'||
        TO_CHAR(sum(DECODE(TO_CHAR(first_time,'hh24'),'23',1,0)),'99') ||'|'
as "Online Log_history : 00(h)~" 
FROM v$log
GROUP BY THREAD#, TO_CHAR(first_time,'MM/DD') 
ORDER BY 1;

결과는 아래와 같습니다.

INST_ID                         Online Log_history : 00(h)~                                                                 
---------------                 ------------------------------------------------------------------------- ---------------------------------------
Instance : 0    06/28              :  0|  0|  0|  0|  0|  0|  0|  0|  0|  0|  0|  0|  0|  0|  0|  3|  0|  0|  0|  0|  0|  0|  0|  0|
Instance : 1    06/28              :  0|  0|  0|  0|  0|  0|  0|  0|  0|  0|  0|  0|  0|  0|  0|  3|  0|  0|  0|  0|  0|  0|  0|  0|

2 rows selected.

각 항목에 대한 설명은 다음과 같습니다.

항목

설명

INST_ID

Tibero 인스턴스 정보 (TAC DB 질의 쿼리)

Online Log_history

시간별 Log Switch 발생 횟수

Online Log에 대하여 매 시간별 발생한 Log Switch의 발생 횟수를 보여줍니다.

Online Redo Log의 시간별 Switch 횟수로 데이터베이스의 트랜잭션 양을 예측할 수 있고 현 시점에서 가장 트랜잭션이 많은 시간을 파악할 수 있습니다. 많은 트랜잭션이 발생하는 시간에는 대량의 Batch Job을 다른 시간에 수행하도록 하는것이 바람직합니다.

Last updated