# 플래시 캐시 관리

## 개요

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

플래시 디바이스는 빠른 I/O 성능과 비휘발성 저장 공간을 제공합니다. 캐시는 데이터를 쓰는 방법에 있어서 아래 그림과 같이 write-through 방식과 write- back 방식이 존재합니다.

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

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

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

### write-back 방식

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

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

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

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

데이터가 들어 있는 블록을 **dirty 블록**이라고 합니다. 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 체크포인트 관련된 로그를 수집하여 파라미터를 면밀히 설정할 필요가 있습니다.&#x20;

플래시 캐시 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초에 checkpoint를 수행할 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>
```
