소개

본 장에서는 TCache의 기본 구조와 환경설정을 하는 방법에 대해서 설명한다.

1. 개요

ProFrame에서 캐시 처리를 위하여 TCache를 제공한다. TCache는 ProFrame의 운영 중에 데이터베이스에서 Access하는 정보를 Shared Memory에 캐싱하여 ProFrame의 성능을 보장하도록 하는 유틸리티이다. TCache가 ProFrame의 성능을 보장할 수 있는 이유는 데이터베이스로의 데이터 요청이 발생할 때 매번 발생되는 DB 접속으로 인한 OverHead를 감소시킬 수 있기 때문이다.

TCache는 Shared Memory에 데이터가 존재하지 않는 경우에만 데이터베이스로부터 데이터를 쿼리해오며, 쿼리된 결과 데이터를 TCache에 적재하는 작업을 수행한다. 이후 변경되는 데이터에 대하여는 INVALIDATE 기능을 사용하여 DB와 동기화시킬 수 있다.

다음은 TCache의 기본 구조와 프로세스를 나타낸 그림이다.

figure1 1
TCache 구조
  • pfmtcacheadmin

    pfmTCacheadmin은 기본 동작을 제어하는 기능을 한다. TCache를 초기화하거나 삭제, 생성할 수 있고, 상태를 조회할 수 있으며, 초기화한 이후 현재까지 캐싱에 대한 리포트 결과를 확인할 수 있다.

  • pfmTCache.cfg

    환경설정 파일로 Shared Memory 주소, 권한, 캐싱을 할 이름과 메모리의 크기, hash 테이블의 크기, hash 키의 크기, 저장할 데이터의 크기를 지정한다.

  • libpfmTCache.so

    TCache 라이브러리는 실제로 호출할 함수가 컴파일되어 있다. TCache를 사용할 경우 사용자의 소스를 컴파일할 때 링크에 포함되어야 한다.

  • TPFMAGENT

    TCache가 여러 개의 Node에 설정되어 Sync를 맞춰야 할 때 Invalidate하기 위한 Tmax 서버이다.

TCache의 성능을 보장하기 위해서는 write가 자주 일어나지 않는 자료를 저장하는데 TCache를 사용해야 한다.

2. 환경설정

pfmtcache.cfg은 TCache의 환경설정 파일로 Shared Memory 구조를 만드는 정보로 구성된다.

환경 파일은 아래의 경로에 위치한다(환경 파일의 위치는 설치 디렉터리에 따라 변경될 수 있다).

$PRJROOT/package/proframe/pfm/cfg/pfmtcache.cfg

해당 파일에 Shared Memory 주소, 권한, 캐싱을 할 이름과 메모리의 크기, hash 테이블의 크기, hash 키의 크기, 저장할 데이터의 크기를 지정한다.

########################
# 공통 영역
########################
SHMKEY      = [shared-memory-key]
IPCPREM     = [shared-memory-permission]
SIZE_LOCAL  = [cache-size]
LIB_PTHREAD = [file-name]
INVALIDATE_TYPE = [invalidate-type]
AGENT_SVC = [agent_service] 

########################
# 개별 영역
########################
CACHE_NAME = [chache-name]
SIZE_MEM   = [chache-memory-size]
SIZE_HASH  = [hash-key-size]
SIZE_KEY   = [key-size]
SIZE_REC   = [record-size]
INV_TIMEOUT = [timout-sec]
CALLBACK_NAME = [callback-name]
항목 설명

SHMKEY

UNIX의 Shared Memory에 부여한 ID를 설정한다.

IPCPREM

Shared Memory에 대한 권한을 설정한다.

SIZE_LOCAL

서버 process 내부에 할당하여 데이터(레코드)를 기록하게 된다.

기록할 수 있는 최대 용량을 KB로 설정한다.

LIB_PTHREAD

미사용. (현재 Symbolic Link만 사용함)

INVALIDATE_TYPE

Invalidate 유형을 설정한다. (TCache 동기화 참조)

AGENT_SVC

Invalidate할 서버를 설정한다. (TCache 동기화 참조)

SHMKEY

UNIX의 Shared Memory에 부여한 ID를 설정한다.

SIZE_MEM

Cache name을 위해 할당되는 총 Shared Memory 크기를 설정한다.

초과하는 경우 least recently used 알고리즘 적용한다. (단위: KB)

SIZE_HASH

Hash Key의 범위를 설정한다.

SIZE_KEY

조회 key가 되는 값의 길이를 설정한다.

Key가 10Byte이고 데이터가 90Byte인 구조체(struct { char Key[10]; char Data[90]; })를 TCache에 등록하는 경우 'SIZE_KEY’를 10으로 설정한다.

예외적으로 여러 개의 멤버가 하나의 Key로 구성될 때는 Pading Bit의 영향으로 단순 합산의 길이와 다를 경우가 존재한다.

해당 Key 구조체를 sizeof한 값을 Key로 설정하면 정확한 Key를 설정을 할 수 있다.

SIZE_REC

메모리 할당의 최소 단위인 SLOT의 크기를 설정한다.

Key가 10Byte이고 데이터가 90Byte인 구조체(struct { char Key[10]; char Data[90]; })를 TCache에 등록하는 경우 'SIZE_REC’를 100으로 설정한다.

예외적으로 여러 개의 멤버가 하나의 레코드로 구성될 때는 Pading Bit의 영향으로 단순 합산의 길이와 다를 경우가 존재한다. 해당 Get할 구조체를 sizeof한 값을 SIZE_REC로 설정하면 하나의 Slot에 하나의 레코드를 설정할 수 있다. 참고로 SIZE_REC 가변길이 초과하는 Put된 레코드인 경우는 SIZE_REC 단위로 나눠져 Slot에 저장된다.

API에서 사용하는 데이터를 가져오는 임시 버퍼 사이즈를 설정한다.

INV_TIMEOUT

Invalidate 후 Put이 금지되는 시간을 설정한다.

CALLBACK_NAME

pfmTCacheItem에서 Get을 실패하는 경우 조회용 BM을 설정한다.

CALLBACK_NAME은 내부적인 처리 구조로 인해 ProFrame C의 BusinessModule로 제한한다. BM의 물리명이 GET_PFM_SVC로 했을 때 libGET_PFM_SVC.so로 라이브러리 파일이 생성된다. 이때 CALLBACK_NAME 설정은 BM의 물리명으로 설정한다.

CALLBACK_NAME=GET_PFM_SVC

다음은TCache 환경설정 파일의 예제이다.

# the configuration file of TCACHE
SHMKEY=0x70056             # the key of shared memory
IPCPERM=0777               # permission of the shared memory
SIZE_LOCAL=1024            # L1 cache size in kilo-bytes
LIB_PTHREAD=libpthread.so  # the pthread library file name
#INVALIDATE_TYPE=1         # Invalidate type 0:multi-node 1:multi-domain
#AGENT_SVC=SPFMAGENT|2     # multi-node sync. svc SPFMAGENT|2 = SPFMAGENT01, SPFMAGENT02

# cache for PFM_SVC
CACHE_NAME=PFM_SVC
SIZE_MEM=65536             # the total cache memory size in kilo-bytes
SIZE_HASH=1024             # the number of hash key (MAX=6553)
SIZE_KEY=30                # the number of digits of the index column
SIZE_REC=2048              # the size of a single record in bytes
INV_TIMEOUT=10             # invalidation timeout in sec
#CALLBACK_NAME=GET_PFM_SVC # Collback Func Nmae libGET_PFM_SVC.so