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