본문으로 바로가기

Ehcache를 사용할 경우 각 캐시 성향에 맞게 적절한 크기의 리소스를 할당해 줘야 합니다. 
캐시 데이터는 설정에 따라 힙메모리(Heap) / 오프힙메모리(Off-heap) / 로컬디스크(Disk)에 저장되는데 이것도 결국 리소스를 차지하기 떄문이죠. 

ehcache storage 
| Ehcache 크기 설정 옵션 

ehcache.xml 설정파일을 통해 CacheManager 전체 Pool의  크기를 제한할 수도 있고 CacheManager 하위에 있는 각 cache 별로 절대치, 상대치로 할당하여 분배 하는 것도 가능합니다. 제한하는 단위는 entity의 개수 기반(Count-based)으로 하거나 차지하는 크기(size-based)을 기반으로 설정이 가능합니다. 

참고로 캐시 메모리 크기별로 제어하는 ARC(Automatic Resource Control) 기능은 ehcache 2.5버전 이후부터 가능하니 사용하시는 버전을 확인해 주세요!


Standalone 환경의 Ehcache 사이즈 관련 설정 옵션입니다. 
( 아래 표에 기재 된 것처럼 클러스터환경(분산캐시)일 떄는 Disk기반 저장소는 사용 블가합니다.)
 
Heap
Off heap
Disk
개수 기반
(Count-based)
maxEntriesLocalHeap
maxMemoryOffHeap
maxEntriesLocalDisk
( Cluster 환경 사용불가 )
개수 기반 
Ehcache 2.5 이하
(Count-based)
maxElementsInMemory
maxMemoryOffHeap
maxElementsOnDisk
크기 기반
(Size-based - ARC )
maxBytesLocalHeap
maxBytesLocalOffHeap
maxBytesLocalDisk
( Cluster 환경 사용불가 )

그럼 케이스별로 캐시 사이즈 설정에 대한 예시들을 보겠습니다.


| 1. CacheManager Pool 전체 크기 제한
CacheManager Pool 전체에 대한 크기를 설정하는 예제입니다.
<ehcache xmlns="..."
    name="CacheManager1"
    maxBytesLocalHeap="200M"
    maxBytesLocalOffHeap="20G"
    maxBytesLocalDisk="100G">
  ...
  <cache name="Cache1" ...> </cache>
  <cache name="Cache2" ...> </cache>
  <cache name="Cache3" ...> </cache>
</ehcache>
CacheManager1 전체 Pool에 대하여 각각 maxBytesLocalHeapmaxBytesLocalOffHeapmaxBytesLocalDisk 옵션을 사용해 Pool 사이즈를 설정했습니다. 위의 예제에서는 Cache에 아무런 명시가 되어있지 않기 때문에 CacheManager1 하위에 있는 3개의 Cache(Cache1, Cache2, Cache3)는 Pool에 할당된 자원을 1/3씩 각각 나눠 갖게 됩니다.  

|  2. Cache 단위 명시적 크기 제한
Cache 단위별로 각각 명시적으로 리소스를 할당 하는 예제입니다.
<ehcache xmlns="..."
    name="CacheManager2"
    maxBytesLocalHeap="200M"
    maxBytesLocalOffHeap="20G"
    maxBytesLocalDisk="120G">
  ...
  <cache name="Cache1" ...
      maxBytesLocalHeap="100M">
  </cache>
  <cache name="Cache2" ...
      maxBytesLocalOffHeap="10G">
  </cache>
  <cache name="Cache3">... </cache>
</ehcache>
일단 CacheManager2 Pool 전체에 Heap 200M / OffHeap 20G / Disk 120G를 할당 된 상태입니다. 그리고  Cache1이 명시적으로 Heap 100M 를 점유하도록 설정했기 때문에 Cache2와 Cache3은 남은 Heap 영역 100M를 나눠 각각 50M씩 할당 받습니다.
OffHeap 영역은 Cache2가 절반인 10G를 할당 받았기 때문에 역시 Cache1 Cache2가 남은 10G의 절반인 5G씩 나눠가집니다. 마지막으로 Disk 영역은 명시적으로 할당해주지 않았기때문에 각각 1/3씩 나눠서 할당 받습니다.

주의할 점은 동일한 크기의 옵션(개수 or 크기)만 사용가능 한다는 점입니다. 예를 들어 위와 같이 크기 기반(size-based)의 설정으로 Pool을 제한했을 경우에는 개수 기반(count_based) 옵션인 maxEntriesLocalHeap를 Cache에 명시적으로 설정할 수 없습니다.

|  3. 혼합 리소스 구성
CacheManager가 특정 자원을 풀링하지 않을 때 각 캐시별로 특정 자원을 혼합하여 할당 할 수 있습니다.( localHeap + Disk 등 )
<ehcache xmlns="..."
    name="CacheManager3"
    maxBytesLocalHeap="200M">
  ...
  <cache name="Cache1" ...
      maxBytesLocalHeap="100M"
      maxEntriesLocalDisk="100000">...
  </cache>
  <cache name="Cache2" ...
      maxBytesLocalOffHeap="20G">...
  </cache>
  <cache name="Cache3"> ... </cache>
</ehcache>
위 예제에서는 일단 CacheManager3 전체 Pool에는 로컬힙(LocalHeap) 200M만 구성합니다. 하위에 있는 캐시들은 모두 로컬 힙을 사용하며 동일하게 Cache1이 명시된 100M 를 할당받고 나머지 Cache2,Cache3이 50M씩 예상대로 풀 설정에 의해 제한됩니다. 
그리고 추가적으로 세부 캐시 구성에서 원하는 다른 자원을 할당 할 수 있습니다. 위 예에서 Cache1는 50M의 로컬힙 영역 외에도 디스크 공간을 추가로 할당했고 Cache2에는 OffHeap 공간을 추가로 할당받았습니다. 아무것도 명시되지 않은 Cache3는 50M의 로컬힙만 할당됩니다.


|  4. 백분율 구성(%)
각 리소스 할당시 절대적인 수치가 아닌 백분율로 리소스 할당하는 예제 입니다.
<ehcache xmlns...
    name="CacheManager4"
    maxBytesLocalHeap="1G"
    maxBytesLocalOffHeap="10G"
    maxBytesLocalDisk="50G">
  ...

  <!-- Cache1 gets 400Mb of heap, 2.5Gb of off-heap, and 5Gb of disk. -->
  <cache name="Cache1" ...
      maxBytesLocalHeap="40%">
  </cache>

  <!-- Cache2 gets 300Mb of heap, 5Gb of off-heap, and 5Gb of disk. -->
  <cache name="Cache2" ...
      maxBytesLocalOffHeap="50%">
  </cache>

  <!-- Cache2 gets 300Mb of heap, 2.5Gb of off-heap, and 40Gb of disk. -->
  <cache name="Cache3" ...
      maxBytesLocalDisk="80%">
  </cache></ehcache>
추가적으로 CacheManager4 Pool 전체 maxBytesLocalHeap 이용하여 자원을 할당할때 백분율을 사용하면 총 JVM 힙 영역에 대한 백분율을 적용 할 수 있습니다.
예를 들어 JVM 힙메모리가 4G라고 가정했을때  Pool에  maxBytesLocalHeap="25%" 옵션을 주면 풀은 1G의 LocalHeap을 할당 받게 되고 각 캐시는 이 1G를 힙메로리를 명시된 자원만큼 나눠 갖습니다.

|  5. Pool 없이 Cache별 크기 조정
CacheManager 전체 Pool없이 Cache별로 필요한 자원을 명시적으로 할당하는 예제입니다.
<ehcache xmlns="..."
    name="CacheManager5"
    ... >
  ...
  <cache name="Cache1" ...
      maxBytesLocalHeap="50M"
      maxEntriesLocalDisk="100000">
    ...
  </cache>

  <cache name="Cache2" ...
      maxEntriesLocalHeap="1000"
      maxBytesLocalOffHeap="10G">
    ...
  </cache>
  <cache name="Cache3" ...
      maxBytesLocalHeap="50M">
    ...
  </cache>
</ehcache>
로컬 힙에 대한 풀이 없을 경우에는 모든 캐시에 로컬 힙에 대한 MAX값을 선언해서 제한을 둬야하는점을 꼭 기억해 주세요!

Reference

https://www.ehcache.org/documentation/2.8/configuration/cache-size.html