오라클(Oracle) Smart Flash Cache - 11gR2 NF(New Features)

Last Updated on 12월 2, 2020 by 태랑(정현호)

Oracle Smart Flash Cache


Oracle 11.2부터 Database Smart Flash Cache라는 것이 추가되었다. 이 개념은 buffer cache가 Aging Out되어
Disk로 내려가는 단점을 보완한 것이다.

즉 buffer cache에서 Aging Out 되더라도 성능이 우수한 
Flash Disk(SSD)로 내려가는 개념이다.


따라서 SSD로 Aging out된 블록을 다시 읽을 때 기존 Disk보다 빠른 성능을 낼 수 있다.

Database Smart Flash Cache 기능이 추가되어 메모리 구조도가 약간 변경되었다.


Database Administrator's Guide 11g Release 2

Flash Disk를 2차 cache로 사용하는 셈이다. 하지만 Flash Disk에서 조차 aging out될 때는 Disk로 내려가는 것은 막을 수 없다.




OS 제약사항


Solaris  나 오라클 엔터프라이즈 리눅스(OEL) 를 사용해야 한다.


사용 목적
아래 3가지 경우를 모두 만족하면 Smart Flash Cache 사용을 고려한다.

1. AWR이나 Statspack 에서 Buffer pool Advisory를 참조하여 buffer cache가 부족하다고 판단 될 경 우

2. db file sequential read 가 Top Wait Event 일 경우

3. CPU 리소스가 여유가 있을 때.


기존의 Disk에서 자체적인 약간의 Cache 기능이 있으므로, 위와 같이 buffer cache 가 부족하거나 aging out이 많이 발생 되는 경우만 성능 향상의 폭이 크기 때문이다.




고려 사항


Parameters

db_flash_cache_file
Flash Cache로 사용할 파일의 경로를 설정한다. 만약 파일이 없으면 오라클이 startup시에 생성한다.

반드시 SSD내의 경로를 사용해야 한다. 그렇지 않으면 성능이 떨어진다.
예:/dev/fioa1


db_flash_cache_size
Giga 단위로 기술해야 한다. 이 파라미터를 0으로 설정하면 Database Smart Flash Cache기능이 Disable된다.

이 파라미터는 scope = memory 옵션을 사용할 수 없다. 따라서 이 파라미터를 적용하려면 Shutdown과 Startup이 필요하다.

예: 16G




All or Nothing

RAC인 경우 하나의 SSD Disk를 다른 노드에 공유할 수 없다.

즉, 노드별로 Smart Flash Cache를 별도로 설정해야 한다. 또한 하나의 노드에 Database Smart Flash Cache를 설정하였으면 나머지 노드에도 모두 Smart Flash Cache를 설정해야 한다.




Database Smart Flash Cache의 Size 설정

Flash Cache는 buffer cache의 2배~10배 정도를 권고한다. Flash Cache의 Size가 buffer cache의 2배보다 작으면 효과를 볼 수 없다.

여건상 SSD가 보유하지 못하여 성능에 대한 비교 테스트는 불가 하다. 
그러므로 Database Smart Flash Cache 의 내용과 
설정방법만 기술이  되어있다.




Parameter Setting


파라미터는 2개를 설정 후 Instance를 재시작 하면 바로 해당 기능이 동작하게 된다.

db_flash_cache_file 과 db_flash_cache_size 이다.


먼저 db_flash_cache_size 를 잡기 buffer cache 의 사이즈를 확인


SQL> show sga
Total System Global Area 626327552 bytes
Fixed Size 2229080 bytes
Variable Size 587205800 bytes
Database Buffers 29360128 bytes
Redo Buffers 7532544 bytes



현재 28MB 이며, 성능을 위해 2배 이상 잡아야 함으로 1G를 설정하겠다.

SQL> alter system set db_flash_cache_size=1G scope=spfile;

SQL> alter system set db_flash_cache_file='/oracle/cache/flash_cache.dat' scope=spfile;
SSD 가 없는 관계로 일반 Disk 로 위치를 설정하였다.

flash_cache .dat 라는 파일을 Instance 시작 시 존재하지 않으면 Oracle 이 자동으로 생성한다.

위와 같이 설정 후 Instance를 재시작 한다.




설정 확인


dba_ , all_ , user_ tables 에 11gR2 부터 flash_cache 컬럼이 추가가 되어 해당 테이블의 flash cache 사용여부를 알아볼 수 있다.


10gR2 의 dba_tables 이다. flash_cache 컬럼이 존재 하지 않는다.






11gR2 의 dba_tables 에는 기존 버전과 달리 FLASH_CACHE 컬럼이 존재한다.






select table_name, flash_cache
from dba_tables where table_name='EMP';

로 조회 하면 아래와 같이 FLASH_CACHE 부분에 DEFAULT 로 되어있다.





storage_clause

STORAGE
({ INITIAL size_clause
| NEXT size_clause
| MINEXTENTS integer
| MAXEXTENTS { integer | UNLIMITED }
| maxsize_clause
| PCTINCREASE integer
| FREELISTS integer
| FREELIST GROUPS integer
| OPTIMAL [ size_clause | NULL ]
| BUFFER_POOL { KEEP | RECYCLE | DEFAULT }
| FLASH_CACHE { KEEP | NONE| DEFAULT }


11gR2 의 create table  절의 syntax 중 storage 옵션 중 FLASH_CACHE 절이 추가 되었고, 사용할 수 있는 옵션으로는 KEEP, NONE, DEFAULT 이다.

각각의 내용은 아래와 같은 내용으로 매뉴얼 상에 기록되어있다.



KEEP
Specify KEEP if you want buffers to be written to the flash cache when they are aged out of main memory, and remain in the flash cache as long as the flash cache size is large enough.


NONE
Specify NONE if you want buffers to be discarded and re-used when they are aged out of main memory. These buffers will not be put on the flash cache. This is the behavior if flash cache is not enabled on your system.


DEFAULT
Specify DEFAULT if you want buffers to be written to the flash cache when they are aged out of main memory, and then be aged out of the flash cache with the standard LRU algorithm. This is the default if flash cache is enabled and you do not specify KEEP or NONE.



위의 내용으로 알 수 있듯이 DEFAULT 로 지정하게 되면 메모리가 부족하여 age out 되었을 때 Flash Cache 를 사용할 수 있으며, flash cache 의 표준 LRU 알고리즘에  적용 받는다 라고 되어있다.

KEEP 과의 차이는 KEEP은 Flash Cache 공간이 여유가 있을 경우 오랫동안 테이블의 블록을 Flash Cache 에 남겨 두겠다는 것입니다.



1
1gR2 부터는 flash cache 기능의 활성화 여부와 상관없이 테이블 생성시 FLASH_CACHE 속성이 DEFAULT 로 생성 되며, Smart Flash Cache 를 활성화 되면, 기본적으로 모든 테이블은 FLASH_CACHE 기능에 적용 받는다는 의미이다.




Keep Table 생성


SQL> CREATE TABLE TB_TEST01
storage( flash_cache keep)
as
select * from dba_users;


위와 같이 storage(flash_cache keep) 절을 기술하여 테이블을 생성하고 다시
조회 하면 아래와 같이 flash_cache 에 KEEP 옵션으로 등록 된 걸 확인 할 수 있다.





Block 상태 확인


위에서 생성한 테이블의 블록이 현재 Cache 에 있는지 Flash Cache에 있는지
확인 해보자.

SQL> SELECT owner || '.' || object_name object,
SUM (CASE WHEN b.status LIKE 'flash%' THEN 1 END) flash_blocks,
SUM (CASE WHEN b.status LIKE 'flash%' THEN 0 else 1 END) cache_blocks,
count(*) total_blocks
FROM v$bh b
JOIN
dba_objects
ON (objd = object_id)
where owner='SYS' and object_name='TB_TEST01'
group by owner,object_name;



위에서 FLASH_BLOCKS 는 FLASH CACHE 영역이고CACHE 영역은 Buffer Cache 영역을 의미 한다.

TOTAL은 2개의 영역(CACHE 영역 모두) 을 합친 수치가 나타난다.



conclusion


모 외국 블로그에서는 아래와 같이 exadata 하드웨어 없이 Smart Flash Cache 기능 을 사용 할 수 있다는 것에 대해서 행복하다는 표현을 쓰기도 하였다.

“I was happy to get the flash cache working, even with this crappy hardware. I'm really happy that Oracle opened this up to non-exadata hardware.”

New Feature가 그렇듯 좀더 정확히 알고 많은 테스트, 검증을 통하여 실제 업무에 적용 한다면 이 기능 또한 유용하게 사용 될 수 있을 거라고 생각된다.


Ref Link
technology.amis.nl
www.ora600.be
guyharrison.squarespace.com
scidb.tistory.com


답글 남기기