메뉴 건너뛰기

bysql.net

2._Memory_vs._Disk_IO

2012.05.23 05:18

정찬호 조회 수:4165

1. I/O 효율화 튜닝의 중요성


- 데이터 I/O속도 : 디스크 < 메모리(전기적 신호)

- DB 버퍼 캐시를 경유래 I/O를 수행한다는 것,

  읽고자 하는 블록을 먼저 버퍼 캐시에서 찾아보고, 찾지 못할때만 디스크에서 읽는다.

  이렇게 되면 디스크 상에서 데이터파일을 읽는 것보다 평균 10000배 이상 빠르다.

- 유한한 메모리 자원을 좀 더 효율적으로 사용해야 하므로 자주 엑세스하는 블록들이 캐시에 더 오래 남아 있도록

  LRU알고리즘을 사용한다. 결국 디스크 I/O를 최소화하고 대부분 처리를 메모리에서 할 수 있도록

  버퍼 캐시 효율성을 높이는 것이 중요하다.



2. 버퍼 캐시 히트율(Buffer Cache Hit Ration)


- 전체 읽은 블록 중에서 얼만큼을 메모리 버퍼 캐시에서 찾았는지를 나타내는 것


- BCHR = (캐시에서 곧바로 찾은 블록 수 / 총 읽은 블록 수 ) * 100

           = (논리적 블록 읽기 - 물리적 블록 읽기) / 논리적 블록읽기  *100

           = (1-물리적 블록 읽기) / 논리적 블록 읽기 *100

- 이는 곧 물리적인 디스크 읽기를 수반하지 않고 곧바로 메모리에서 블록을 찾은 비율을 의미


- Direct Path Read 방식으로 읽는 경우를 제외하면 모든 블록 읽기는 버퍼 캐시를 통해 이루어진다.(가장 먼저 버퍼 캐시를 읽는다.)

2012-05-22_200110.png 

  Disk : 물리적 블록 읽기

  Query+Current : 논리적 블록 읽기

  위 두 값을 더한 값이 총읽은 블록 수 (Direct Path Read가 없다면)

  그렇다면 위 정보를 통해서, 총 1351677개 블록을 읽었고 그중 601458개는 디스크에서 버퍼 캐시로 적재해서 읽었다.

  그래서 버퍼 캐시 히트율은 750219 / 1351677 *100 = 55.5%


* 논리적 블록읽기가 메모리에서 읽은 블록 개수라고 착각해선 안된다. 총 읽은 블록 수로 봐야 한다.


- 간단히 말하면 논리적으로 100개 블록을 읽기 요청했는데 55개는 메모리에서 찾고 나머지는 메모리에서 못찾아서

  디스크 I/O를 발생시켜 메모리에 적재했다는 의미다.


- 이러한 논리적인 블록 요청 횟수를 줄이고 물리적으로 디스크에서 읽어야 할 블록 수를 줄이는 것이

  I/O효율화 튜닝의 핵심 원리다.


- 하지만 같은 블록을 반복적으로 엑세스하는 형태의 어플리케이션이라면

 논리적인 I/O요청이 비효율적으로 많이 발생하는데도 BCHR은 높게 나타단다. (한계..)

 이는 자주 엑세스하였기 때문에 메모리에 적재된 것 뿐이지 블록을 찾은 과정에서 래치를 얻어야 하므로 큰 비용을 수반한다.

 ex) 대량의 데이터를 기준으로 NL조인 방식을 사용해 작은 테이블을 반복적으로 Lookup하는 경우




3. 네트워크, 파일시스템 캐시가 I/O효율에 미치는 영향


- ORACLE EXADATA의 SMART SCAN

2012-05-22_201531.png 



   기존 SCAN 방식

2012-05-22_201601.png 


  SMART SCAN 방식


2012-05-22_201611.png