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
#再次查看

5、メモリ使用量

  • Redisインスタンスのメモリ使用量が使用可能な最大メモリを超え、オペレーティングシステムがメモリとスワップスペースのスワップを開始します
  • メモリスワップを回避する方法:
    • キャッシュされたデータのサイズに合わせてRedisインスタンスをインストールすることを選択します(キーごとに、使用されるメモリが少なくなります。つまり、ポインタが占めるバイト数が少なくなります)
    • 可能な限りハッシュデータ構造ストレージを使用します(Redisは、100フィールド未満のハッシュ構造を格納する際に非常に高いストレージ効率を備えています)
    • キーの有効期限を設定します(キーの数を減らします)

6、内部回復キー(メモリ排除戦略)

  • 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