Last Updated on 10월 24, 2021 by Jade(정현호)
Contents
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내의 경로를 사용해야 하며 그렇지 않으면 일반 Disk 를 사용하기 때문에 성능 저하가 발생될 수 있습니다.
예:/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가 보유하지 못하여 성능에 대한 비교 테스트는 불가 하며 기능에 대한 설정 등의 내용에 대해서 기술되어 있습니다.
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 컬럼이 존재 합니다.
SQL> 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 에 남겨 두겠다는 것입니다.
11gR2 부터는 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.
NewFeature 가 그렇듯 좀더 정확히 알고 많은 테스트, 검증을 통하여 실제 업무에 적용 한다면 이 기능 또한 유용하게 사용 될 수 있을 거라고 생각 됩니다.
Reference
Reference Link
• technology.amis.nl
• www.ora600.be
• guyharrison.squarespace.com
• scidb.tistory.com
관련된 다른 글

Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io






