NotSQL의 Redis (4) (성능 관리의 메모리 최적화)


머리말

  • Redis는 메모리 기반 키-값 데이터베이스이며 메모리 크기가 제한됩니다.
  • 프로덕션 환경에서 가끔 Redis 서버 메모리가 부족한 상황이 발생하는 경우 Redis 메모리는이 상황에 대해 어떻게 회수합니까? 메모리가 가득 차면 Redis는 무엇을할까요?

1. Redis 메모리 사용량보기

#使用 192.168.126.15:6379 连接本机上的 Redis 数据库
[root@localhost ~]# redis-cli -h 192.168.126.15 -p 6379
192.168.126.15:6379> INFO memory    #查看内存使用情况
# Memory
used_memory:853728                  #由 Redis 分配器分配的内存总量,包含了 redis 进程内部的开销和数据占用的内存,以字节(byte)为单位
used_memory_human:833.72K           #已更直观的单位展示分配的内存总量
used_memory_rss:16302080            #向操作系统申请的内存大小,与 top  ps 等命令的输出一致
used_memory_rss_human:15.55M        #已更直观的单位展示向操作系统申请的内存大小
used_memory_peak:853728             #redis 的内存消耗峰值(以字节为单位)
used_memory_peak_human:833.72K      #以更直观的格式返回 redis 的内存消耗峰值
used_memory_peak_perc:100.00%       #使用内存达到峰值内存的百分比,即(used_memory / used_memory_peak) *100%
used_memory_overhead:841390         #Redis 为了维护数据集的内部机制所需的内存开销,包括所有客户端输出缓冲区、查询缓冲区、AOF 重写缓冲区和主从复制的 backlog
used_memory_startup:791416          #Redis 服务器启动时消耗的内存
used_memory_dataset:12338           #数据占用的内存大小,即 used_memory - sed_memory_overhead
used_memory_dataset_perc:19.80%     #数据占用的内存大小的百分比,100%*(used_memory_dataset/(used_memory - used_memory_startup))
allocator_allocated:1304352
allocator_active:1634304
allocator_resident:11395072
total_system_memory:3958075392      #整个系统内存
total_system_memory_human:3.69G     #以更直观的格式显示整个系统内存
used_memory_lua:37888               #Lua 脚本存储占用的内存
used_memory_lua_human:37.00K        #以更直观的格式显示 Lua 脚本存储占用的内存
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0                         #Redis 实例的最大内存配置
maxmemory_human:0B                  #以更直观的格式显示 Redis 实例的最大内存配置
maxmemory_policy:noeviction         #当达到 maxmemory 时的淘汰策略
allocator_frag_ratio:1.25
allocator_frag_bytes:329952
allocator_rss_ratio:6.97
allocator_rss_bytes:9760768
rss_overhead_ratio:1.43
rss_overhead_bytes:4907008
mem_fragmentation_ratio:20.06       #碎片率,used_memory_rss/ used_memory,>1表示有碎片,<1表示部分Redis的内存被系统交换到硬盘(此时Redis性能变差)
mem_fragmentation_bytes:15489376
mem_not_counted_for_evict:96
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49694
mem_aof_buffer:96
mem_allocator:jemalloc-5.1.0        #内存分配器
active_defrag_running:0             #表示没有活动的 defrag 任务正在运行,1 表示有活动的 defrag 任务正在运行(defrag:表示内存碎片整理)
lazyfree_pending_objects:0          #0表示不存在延迟释放的挂起对象

둘째, 메모리 조각화 속도 계산

  • 운영 체제에서 할당 한 메모리 값 used_memory_rss를 Redis에서 사용하는 메모리 값 used_memory로 나누어 계산합니다.
    표
used_memory_rss:是Redis向操作系统申请的内存
used_memory:是Redis中的数据占用的内存
mem_fragmentation_ratio:内存碎片率

mem_fragmentation_ratio = used_memory_rss / used_memory

세, 메모리 조각화의 생성

메모리 조각화는 운영 체제에 의한 물리적 메모리의 비효율적 인 할당 / 교정 (불연속적인 물리적 메모리 할당)으로 인해 발생합니다.

  • Redis에는 메모리 사용의 효율성을 높이고 애플리케이션 및 메모리 해제를 관리하기 위해 내부에 자체 메모리 관리자가 있습니다.
  • Redis의 값이 삭제되면 메모리가 직접 해제되지 않고 운영 체제로 반환되지만 Redis의 내부 메모리 관리자에게 넘겨집니다.
  • Redis에서 메모리를 신청할 때 먼저 메모리 관리자에 사용 가능한 메모리가 충분한 지 확인하십시오.
  • 이 Redis 메커니즘은 메모리 사용률을 향상 시키지만 사용되지는 않지만 해제되지 않은 Redis의 메모리 일부를 만들어 메모리 조각화가 발생합니다.

셋째, 메모리 조각화 속도의 의미

Redis 인스턴스의 리소스 성능을 이해하려면 메모리 조각화 속도를 추적하는 것이 매우 중요합니다.

  • 메모리 조각화 속도가 1보다 약간 큰 것이 합리적입니다.이 값은 메모리 조각화 속도가 상대적으로 낮음을 나타냅니다.
  • 메모리 조각 화율이 1.5를 초과하는 것은 Redis가 필요한 실제 물리적 메모리의 150 %를 사용하고 있음을 나타내며 그 중 50 %는 메모리 조각 화율입니다.주의해야 할 메모리 조각화를 정리할지 여부를 고려해야합니다.
  • 메모리 조각화 비율이 1보다 낮 으면 Redis 메모리 할당이 실제 메모리를 초과하고 운영 체제가 메모리를 스와핑하고 있음을 의미합니다. 즉, 하드 디스크가 사용 중이므로 사용 가능한 실제 메모리를 늘려야합니다 ( 확장 메모리) 또는 Redis의 메모리 공간을 줄입니다.

넷째, 과도한 메모리 조각화 현상을 해결하는 방법

1. 4.0 미만의 Redis 버전

shutdown save
#在redis-cli 工具上输入,随后重启 Redis 服务器
#Redis 服务器重启后,Redis 会将没用的内存归还给操作系统,碎片率会降下来

2. 4.0 이상의 Redis 버전

#Redis 4.0版本开始,可以在不重启的情况下,线上整理内存碎片

CONFIG SET activedefrag yes
#内存自动清理

memory purge
#手动直接清理
INFO memory
#再次查看

다섯, 메모리 사용량

  • Redis 인스턴스의 메모리 사용량이 사용 가능한 최대 메모리를 초과하고 운영 체제가 메모리 및 스왑 공간 스왑을 시작합니다.
  • 메모리 스왑을 방지하는 방법 :
    • 캐시 된 데이터의 크기에 맞게 Redis 인스턴스를 설치하도록 선택합니다 (각 키에 대해 더 적은 메모리가 사용됩니다. 즉, 포인터가 더 적은 바이트를 차지함).
    • 가능한 한 Hash 데이터 구조 저장소를 사용하십시오 (Redis는 필드가 100 개 미만인 Hash 구조를 저장할 때 매우 높은 저장 효율성을 가짐)
    • 키 만료 시간 설정 (키 수 줄이기)

여섯, 내부 복구 키 (메모리 제거 전략)

  • redis의 제한된 메모리 리소스를 합리적으로 할당합니다.
  • 구성 파일의 최대 메모리 제한에 도달하면 주요 재활용 전략을 선택해야합니다. 즉, Redis에는이 상황을 처리하기위한 여러 전략이 있습니다. 기본적으로 재활용 전략은 삭제를 금지하는 것입니다.
  • 구성 파일에서 maxmemory-policy 속성 값을 수정합니다 (해당 부분 만 직접 수정).
vim /etc/redis/6379.conf
#598
maxmemory-policy noeviction
#noenviction(默认策略):禁止淘汰数据,对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)
#volatile-lru:从设置了过期时间的 key 中使用 LRU 算法进行淘汰
#volatile-ttl:在设置了过期时间的 key中,根据 key 的过期时间进行淘汰,越早过期的越优先被淘汰
#volatile-random:从设置了过期时间的 key 中随机淘汰
#allkeys-lru:从所有 key 中使用 LRU 算法进行淘汰
#allkeys-random:从数据集合中任意选择数据淘汰
  • 퇴거 전략의 작동 방식 :
    • Redis가 데이터를 추가하는 명령을 받으면
    • Redis는 메모리 사용량이 최대 메모리 제한을 초과하는지 여부를 확인합니다.
    • 초과하면 메모리 제거 전략을 실행 한 다음 명령을 실행합니다.

팁 : 명령이 많은 메모리를 사용하는 경우 메모리 사용량이 최대 메모리 제한을 초과 할 수 있습니다.

추천

출처blog.csdn.net/weixin_51486343/article/details/114022048