메모리 문제
레디스 명령어 중 메모리 사용량을 확인 할수 있는 memory 명령어가 있다. 기존에도 info 명령어로 확인할수 있지만, memroy 명령어를 통해 더 자세히 확인 할수 있다.
https://redis.io/docs/latest/commands/memory-usage/
https://redis.io/docs/latest/commands/memory-stats/
127.0.0.1:6379> meory help
(error) ERR unknown command 'meory', with args beginning with: 'help'
127.0.0.1:6379> memory help
1) MEMORY <subcommand> [<arg> [value] [opt] ...]. Subcommands are:
2) DOCTOR
3) Return memory problems reports.
4) MALLOC-STATS
5) Return internal statistics report from the memory allocator.
6) PURGE
7) Attempt to purge dirty pages for reclamation by the allocator.
8) STATS
9) Return information about the memory usage of the server.
10) USAGE <key> [SAMPLES <count>]
11) Return memory in bytes used by <key> and its value. Nested values are
12) sampled up to <count> times (default: 5, 0 means sample all).
13) HELP
14) Print this help.
메모리 문제와 관련해서는 LATENCY DOCTOR 명령어로 진단이 가능합니다. memroy doctor 명령어는 다음과 같은 기준으로 판단이 이뤄집니다. (7.0.4 기준)
- 메모리 사용량이 5MB 이상인지
- 최대 시간 메모리 사용량이 현재 사용중인 메모리의 150% 이상인지
- RSS(Resident Set Size : 프로세스에 할당된 RAM 용량)가 크고 메모리 사용량이 10MB이상
- 외부 프래그먼테이션(메모리 파편화)이 1.1이상이며 메모리 사용량이 10MB이상
- 클라이언트 출력 버퍼에서 평균 200KB이상의 메모리를 사용하는지 (CLIENT-OUTPUT-BUFFER-LIMIT로 제한 필요)
- 이페머럴 스크립트(루아 스크립트)가 1000개 이상 캐시 되어 있는지
…..
만일 데이터가 충분치 않다면 다음과 같은 메시지가 나옵니다.
127.0.0.1:6379> memory doctor
Hi Sam, this instance is empty or is using very little memory, my issues detector can't be used in these conditions. Please, leave for your mission on Earth and fill it with some data. The new Sam and I will be back to our programming as soon as I finished rebooting.
redis 메모리
현재 셋팅된 메모리값은 다음의 명령어로 확인 할수 있습니다.
127.0.0.1:6379> info memory
# Memory
used_memory:1127328
used_memory_human:1.08M
used_memory_rss:9670656
used_memory_rss_human:9.22M
used_memory_peak:1247232
used_memory_peak_human:1.19M
used_memory_peak_perc:90.39%
used_memory_overhead:982232
used_memory_startup:979088
used_memory_dataset:145096
used_memory_dataset_perc:97.88%
allocator_allocated:5894176
allocator_active:14286848
allocator_resident:15925248
allocator_muzzy:0
total_system_memory:10434670592
total_system_memory_human:9.72G
used_memory_lua:31744
used_memory_vm_eval:31744
used_memory_lua_human:31.00K
used_memory_scripts_eval:0
number_of_cached_scripts:0
number_of_functions:0
number_of_libraries:0
used_memory_vm_functions:32768
used_memory_vm_total:64512
used_memory_vm_total_human:63.00K
used_memory_functions:192
used_memory_scripts:192
used_memory_scripts_human:192B
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:2.37
allocator_frag_bytes:5303008
allocator_rss_ratio:1.11
allocator_rss_bytes:1638400
rss_overhead_ratio:0.61
rss_overhead_bytes:-6254592
mem_fragmentation_ratio:8.74
mem_fragmentation_bytes:8564000
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_total_replication_buffers:0
mem_clients_slaves:0
mem_clients_normal:2952
mem_cluster_links:0
mem_aof_buffer:0
mem_allocator:jemalloc-5.3.0
mem_overhead_db_hashtable_rehashing:0
active_defrag_running:0
lazyfree_pending_objects:0
lazyfreed_objects:0
메모리 아키텍처
레디스는 malloc 함수로 메모리를 할당하기 때문에 운영체제의 메모리 페이지 할당 매핑을 제어 할수 없도록 구현되어 있다. 따라서 레디스에서 데이터 삭제 명렁어를 실행해도 확보된 메모리가 운영체제로 반화된다는 보장이 없으며 RSS도 변하지 않는다.
메모리 단편화율(mem_fragmentation_Ratio)은 메모리 단편화 비율을 나타내는 값으로 레디스가 현재 사용중인 것으로 인식하는 메모리 사용량을 RSS값으로 나눈 값이다.
mem_fragmentation_ratio = used_memory_rss / used_memroy
단편화율이 1.0이거나 약간 높으면 양호나 편이고, 1.5 이상이면 단편화가 심각하고 성능 문제가 발생할수 있다. (단 많은 양의 데이터 삭제시 아직 반영이 안되어 높게 나올수 있다)
단편화가 발생했을때 대처 방법
- 레디스 재시작 (RDB나 AOF 파일 불러오기로 데이터 복원)
- 동적 단편화
- 메모리 단편화가 심할 때 activedefarg (조각모음) 켜주면 효과가 정말 좋음 (하지만 완전한 해소는 아님) - 메모리 스왑 제한
- 메모리 할당자 변경 (기본 : jemalloc )
- memory purge 명령어 실행
'server > system design' 카테고리의 다른 글
redis pub/sub을 이용한 서버 아키텍처 구현 (0) | 2025.01.08 |
---|---|
[25 Computer Papers] 4. Cassandra - A Decentralized Structured Storage System (0) | 2024.09.21 |
[25 Computer Papers] 3. Bigtable: A Distributed Storage System for Structured Data (0) | 2024.09.11 |
[25 Computer Papers] 2. Dynamo: Amazon’s Highly Available key-value Store (1) | 2024.09.05 |
[25 Computer Papers] 1. The Google File System (1) | 2024.09.04 |