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 쿼리 작성 예입니다.
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 쿼리 작성 예입니다.
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