새소식

Redis

Redis - Maxmemory

  • -
반응형

Redis를 이용해서 Tomcat의 Session Clustering을 구성한 고객에서 문제가 발생하였다. 한달에 한번씩 OOM Killer에 인해 Redis가 죽는일이 발생하였다.

해당 원인을 분석하기위해서 Redis의 memory관련 config를 공부하게 되었고 해당 문제를 해결할 수 있었다.

원인으로 판단 되었던 것은 maxmemory가 0 (default)으로 되어있어 memory가 조절되지 않았고 session 값들이 삭제되지 않고 남아 memory를 잡아 먹었던 것이 문제였다.

 

■ Redis 메모리 운영

- In-memory 데이터 저장 관리 

- maxmemory 값을 이용하여 Redis가 사용할수있는 Memory 조정 가능

- 사용자의 모든 데이터를 메모리에 저장해서 관리할수 없다.
- 이러한 문제 개선을 위해 LRU / LFU 알고르즘을 제공한다.  ( maxmemory-policy 로 설정 가능 ) 
( LRU: 가장 오랫동안 사용되지 않은 페이지 교체 / LFU : 참조된 횟수가 가장 적은 페이지 )

 

■ Maxmemory-policy

* noeviction :  캐시를 지우지 않는 정책이다. 메모리가 MAXMEMORY 이상을 사용하게 되면, 에러를 내뱉는다. 

* allkeys-lru : LRU 알고리즘을 기반으로 키를 삭제한다. 
* allkey-random : 랜덤하게 키를 삭제한다.
* allkeys-lfu :  REDIS 4.0에서 추가된 정책이다. 가장 적게 사용된 키가 삭제된다

* volatile-lru :  EXPIRE SET 안에 있는 키를 LRU 알고리즘을 기반으로 키를 삭제한다.
* volatile-random :  EXPIRE SET 안에 있는 키들을 랜덤하게 삭제한다.
* volatile-lfu :  REDIS 4.0에서 추가된 정책이다. EXPIRE SET 안에 있는 키 중 가장 적게 사용된 키가 삭제된다.
* volatile-ttl :  EXPIRE SET 안에 있는 키들을 TTL이 짧은 순으로 삭제한다. 

 

■ Redis Maxmemory 100mb  / maxmemory-policy  volatile-lru TEST

0) 사전 환경

- Tomcat 8.5

- Redis 3.2.8

- Session clustering 설정

https://github.com/ran-jit/tomcat-cluster-redis-session-manager 

 

GitHub - ran-jit/tomcat-cluster-redis-session-manager: Tomcat clustering redis session manager java client.

Tomcat clustering redis session manager java client. - GitHub - ran-jit/tomcat-cluster-redis-session-manager: Tomcat clustering redis session manager java client.

github.com

 

1) Config 변경

## CONFIG 변경
127.0.0.1:6379> CONFIG SET maxmemory 100mb
127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-lru

## CONFIG 확인
127.0.0.1:6379> CONFIG GET maxmemory*
1) "maxmemory"
2) "1048576000"
3) "maxmemory-samples"
4) "5"
5) "maxmemory-policy"
6) "volatile-lru"

2) Ngrinder를 이용하여 Session 값 SET

- 1분동안 Session 값을 redis에 넣음

 

3) Redis 모니터링

- WHILE 로 Key랑 memory를 봤을때 used_memory_human이 100MB에서 올라가지않고 Expire Key가 삭제되며 새로운 값들이 들어오는 것을 볼수 있었다.

[root@redis ~]# while true; do redis-cli -a root -c info keyspace; redis-cli -a root -c info memory; sleep 1; clear; done

# Keyspace
db0:keys=179714,expires=179669,avg_ttl=1663928
# Memory
used_memory:104857320
used_memory_human:100.00M
used_memory_rss:110002176
used_memory_rss_human:104.91M
used_memory_peak:104858664
used_memory_peak_human:100.00M
total_system_memory:3690090496
total_system_memory_human:3.44G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:104857600
maxmemory_human:100.00M
maxmemory_policy:volatile-lru
mem_fragmentation_ratio:1.05
mem_allocator:jemalloc-4.0.3
반응형

'Redis' 카테고리의 다른 글

Redis 6 Download & Install  (1) 2023.12.20
Redis Migration  (1) 2023.12.08
[Redis] Redis Cache Server 만들기!  (0) 2021.10.05
[Redis] Redis 설치  (1) 2021.09.30
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.