> For the complete documentation index, see [llms.txt](https://docs.tibero.com/zetadata/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/zetadata/flash-cache-management.md).

# 플래시 캐시 관리

본 장에서는 Storage 노드의 플래시 디바이스를 이용하여 SSVR 인스턴스에 플래시 캐시를 설정하는 방법을 기술하고, 이를 효율적으로 사용하기 위한 설정들을 설명합니다.

## 개요

SSVR 인스턴스는 플래시 디바이스를 캐시로 지원합니다.

플래시 디바이스는 빠른 I/O 성능과 비휘발성 저장 공간을 제공합니다. 캐시는 데이터를 쓰는 방식에 따라 아래 그림과 같이 write-through 방식과 write-back 방식으로 나뉩니다.

<figure><img src="https://content.gitbook.com/content/C4CM2cGYECmozpu6EgSG/blobs/PZch43sbxQbzi0yX8E4w/3.png" alt=""><figcaption><p>그림 1. write-through와 write-back</p></figcaption></figure>

### **write-through** 방식

디스크와 캐시 양쪽에 데이터를 저장해야 쓰기 동작이 완료되는 방식입니다.

### write-back 방식

캐시에만 데이터를 저장하면 쓰기 동작이 완료되는 방식입니다.

write-back 방식은 디스크 쓰기를 하지 않기 때문에 I/O 속도가 빨라진다는 장점이 있습니다. 반면, 캐시 내용을 나중에 디스크에 복사(flush)해야 한다는 단점이 있습니다. 이를 체크포인트 과정이라고 합니다. ZetaData의 플래시 캐시는 쓰기 I/O 속도 향상을 위해 write-back 방식을 사용합니다.

## 플래시 캐시 체크포인트

write-back 캐싱 알고리즘을 사용하면 캐시의 내용과 디스크의 내용이 일치하지 않는 경우가 발생합니다.

데이터가 들어 있는 블록을 **dirty 블록**이라고 합니다. dirty 블록은 캐시 교체 알고리즘에 따라 캐시가 부족한 시점에 오래된 순으로 디스크와 동기화됩니다. 이때 dirty 블록을 디스크에 동기화하는 작업을 **체크포인트**라고 합니다. 동기화된 dirty 블록은 clean 블록이 됩니다.

free 블록의 비율이 부족한 경우, 오래된 clean 블록을 free 블록으로 만들어 새 I/O 요청을 캐싱할 수 있습니다. 평소에는 캐시 교체 정책에 따라 자동으로 체크포인트가 수행됩니다. 또한, 관리자는 체크포인트를 수동으로 지시할 수 있습니다.

아래는 수동으로 플래시 캐시를 체크포인트하는 DDL입니다.

```sql
$ tbsql sys/tibero

tbSQL 7

TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 

Connected to Tibero.

SQL> alter flashcache checkpoint;

altered.

SQL>
```

#### 플래시 캐시 IDLE 체크포인트

자동 또는 수동으로 체크포인트를 수행할 때, 플래시 캐시를 읽어 디스크에 쓰는 작업이 수행됩니다. 따라서 해당 기간 동안 성능 저하가 발생할 수 있습니다. 이를 방지하기 위해 SSVR 인스턴스의 IDLE 상태를 파악해 체크포인트를 수행하는 IDLE 체크포인트 기능을 사용할 수 있습니다.

IDLE 상태에서는 체크포인트를 천천히 수행합니다. 그러나 플래시 캐시 읽기와 디스크 쓰기가 수행됩니다. 상황에 따라 다른 작업이 지연될 수 있습니다. 따라서 보수적으로 설정해야 합니다. 성능에 영향이 없는지 주기적으로 확인하세요. IDLE 체크포인트 관련 로그를 수집해 파라미터를 면밀히 설정할 수도 있습니다.

플래시 캐시 IDLE 체크포인트 수행 방식은 파라미터 값을 설정하여 조절할 수 있습니다. 아래는 플래시 캐시 IDLE 체크포인트에 관련된 파라미터에 대한 설명입니다.

<table><thead><tr><th width="258">초기화 파라미터</th><th>설명</th></tr></thead><tbody><tr><td>SSVR_FC_CKPT_ON_IDLE</td><td>플래시 캐시의 IDLE 체크포인트 기능 활성화 여부를 나타내는 파라미터입니다. (기본값: N)</td></tr><tr><td>SSVR_FC_IDLE_CKPT_CNT</td><td>IDLE 상태인 경우, 1초 동안 체크포인트할 dirty 블록의 개수입니다. (기본값: 1)</td></tr><tr><td>SSVR_FC_IDLE_PW_RATIO</td><td>IDLE 상태로 판단하기 위한 SSVR worker thread 수 대비 job 비율입니다. 이 비율 이하의 job이 존재하면 IDLE 상태로 판단합니다. (기본값: 5)</td></tr><tr><td>SSVR_FC_IDLE_THRESHOLD</td><td>SSVR_FC_IDLE_PW_RATIO를 통해 IDLE 상태로 판단된 시간이 이 값만큼 지속되면 IDLE 체크포인트를 시작합니다. 이 값의 단위는 초 단위입니다. (기본값: 600)</td></tr></tbody></table>

## 플래시 캐시 제거 <a href="#bookmark98" id="bookmark98"></a>

플래시 캐시를 사용하고 싶지 않을 경우에는 플래시 캐시를 제거합니다.

플래시 캐시의 정합성을 유지하기 위해서는 dirty 블록이 없어야 합니다. 현재 플래시 캐시 제거를 명령하면 내부적으로 체크포인트를 수행합니다. 체크포인트 동작이 완료되면 플래시 캐시는 정상적으로 제거됩니다.

아래는 플래시 캐시를 제거하는 DDL입니다.

```sql
$ tbsql sys/tibero
tbSQL 7

TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 

Connected to Tibero.

SQL> drop flashcache flash0;

dropped.

SQL>
```

## 플래시 캐시 초기화 파라미터 <a href="#bookmark100" id="bookmark100"></a>

아래는 플래시 캐시 성능과 관련된 파라미터에 대한 설명입니다.

<table><thead><tr><th width="304">초기화 파라미터</th><th>설명</th></tr></thead><tbody><tr><td>SSVR_FC_WS_CNT</td><td>Working set의 개수를 정의합니다. 별도로 설정하지 않은 경우 CPU 개수와 동일하게 지정되므로 설정하지 않아도 됩니다. Working set의 개수는 CPU 개수와 동일하게 설정하는 것을 권장합니다.</td></tr><tr><td>SSVR_FC_FREE_BIN_RATIO</td><td><p>플래시 캐시는 오랫동안 접근되지 않은 캐시 블록을 free 블록으로 변경합니다.</p><p>이 파라미터는 확보해야 할 free 블록의 비율을 정의합니다. 이 값이 크면 free 블록을 미리 확보해 free 블록을 얻기 위한 대기 시간을 줄일 수 있습니다. 반면, 캐싱되는 블록 수가 줄어듭니다. (기본값: 10%)</p></td></tr><tr><td>SSVR_FC_DIRTY_BIN_RATIO_MAX</td><td><p>플래시 캐시에서 유지할 최대 dirty 블록 비율(%)을 정의합니다.</p><p>dirty 블록 비율이 이 값 이상이면 background thread가 체크포인트를 수행합니다. 이를 통해 설정한 최대 dirty 블록 비율을 유지합니다. (기본값: 80%)</p></td></tr></tbody></table>

## 플래시 캐시 생성 정보 확인 <a href="#bookmark105" id="bookmark105"></a>

아래는 플래시 캐시의 생성 정보를 확인하는 방법입니다.

```sql
$ tbsql sys/tibero

tbSQL 7

TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.

Connected to Tibero.

SQL> select * from V$SSVR_FLASHCACHE;
FLASHCACHE_NUMBER NAME                    PATH                         OS_BYTES
----------------- ----------------------- -------------------------- -----------
                0 FLASH1                  /dev/zeta-flash1            5.3687E+10
                1 FLASH2                  /dev/zeta-flash2            5.3687E+10
                2 FLASH3                  /dev/zeta-flash3            5.3687E+10
                
3 rows selected.

SQL>
```
