Redis内存分析及实践

redis 容量评估:http://redis.cn/redis_memory/

 

 一、Redis内存信息

info 信息

# Memory
used_memory: 3071921424 字节 ≈ 3.05 G 由 Redis 分配器分配的内存总量,以字节(byte)为单位
used_memory_human: ≈ 2.86 G 以人类可读的格式返回 Redis 分配的内存总量
used_memory_rss: 4245606400 ≈  4.2 G Redis 已分配的内存总量,从操作系统的角度,返回 Redis 已分配的内存总量,(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。 
used_memory_peak: 3075931544  ≈ 3.08 G  Redis 的内存消耗峰值(以字节为单位)
used_memory_peak_human:   ≈ 2.86 G Redis 的内存消耗峰值,以人类可读的格式返回 Redis 的内存消耗峰值
used_memory_lua: 36864  ≈ 0.036 M Lua 引擎所使用的内存大小(以字节为单位)
mem_fragmentation_ratio: 1.38 used_memory_rss 和 used_memory 之间的比率,在理想情况下, used_memory_rss 的值应该只比 used_memory 稍微高一点儿
mem_allocator: jemalloc-3.6.0 在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 。

# Persistence
loading:0
rdb_changes_since_last_save:585863547
rdb_bgsave_in_progress:0
rdb_last_save_time:1548695136
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:15
rdb_current_bgsave_time_sec:-1
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:15
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_current_size:2580307157
aof_base_size:1734120324
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0

# Stats
total_connections_received:2416233
total_commands_processed:11931357345
instantaneous_ops_per_sec:448
total_net_input_bytes:829313954994
total_net_output_bytes:1264349966666
instantaneous_input_kbps:50.30
instantaneous_output_kbps:76.24
rejected_connections:0
sync_full:2
sync_partial_ok:0
sync_partial_err:1
expired_keys:4 4371 8929 为过期而被自动删除的数据库键数量
evicted_keys:5 5843 9239 为最大内存容量限制而被驱逐(evict)的键数量
keyspace_hits:4292711185
keyspace_misses:5843960219
pubsub_channels:1
pubsub_patterns:0
latest_fork_usec:89261
migrate_cached_sockets:0

# CPU
used_cpu_sys:225311.31
used_cpu_user:167240.81
used_cpu_sys_children:1656.22
used_cpu_user_children:2603.57

# Cluster
cluster_enabled:1

# Keyspace
db0:keys=8730191,expires=8730185,avg_ttl=47742434434

总结:

  1. 分析Redis的内存分配可用大小
  2. 分析实际内存占用大小,占用峰值大小
  3. 查看rdb和aof的配置以及刷新策略
  4. 查看Redis的内存使用上线大小和内存驱逐策略
  5. 查看Reids的CPU使用情况
  6. 查看Redis的集群架构

二、分析RDB文件

为了能够详细地了解到Redis服务中具体的key以及key所占用的空间大小、元素数量、底层编码等信息,我们需要使用第三方工具:redis-rdb-tools。该工具通过解析rdb文件,能够分析出实例内存的详细情况。
redis-rdb-tools是开源的工具:Github地址:https://github.com/sripathikrishnan/redis-rdb-tools
参考:https://www.cnblogs.com/zhoujinyi/p/13276697.html

database:数据库编号
type:数据类型
key:键
size_in_bytes:使用的内存:包括键,值和任何其他开销;注意:内存使用情况是近似的。 通常,实际使用的内存将略高于报告的内存
encoding:RDB编码类型
num_elements:key中的value的个数
len_largest_element:key中的value的长度
expiry:过期值

Redis内存分析及实践_第1张图片

 总结

  1. 分析业务上使用了哪些数据类型:String、List、Set等
  2. 分析每种数据类型的key的业务类型分布,比如上面的例子中,系统只使用了String类型,且每种key的业务类型有幂等、缓存、消息中心等
  3. 分析每种数据类型下,每种业务类型下的key的数量和占用空间大小,也就是关注RDB分析文件中size_in_bytes 字段大小
  4. 估算每一种key的数量
    1. 分析某个时刻的全量RDB文件,统计分析文件中的key数量,key大小,key分布;估算整个内存占用大小
    2. 第3步中分析得到每个业务类型的key所占空间大小,然后通过业务接口的请求量估算总的内存占用大小
    3. 其它抽样方式估算内存占用大小

其它形式的内存占用

用户在使用Redis的过程中,会觉得自己的线上实例内存占用比自己预想的要大。事实上,实例中的内存除了保存原始的键值对所需的开销外,还有一些运行时产生的额外内存,包括:

  1. 垃圾数据和过期Key所占空间
  2. 字典渐进式Rehash导致未及时删除的空间
  3. Redis管理数据,包括底层数据结构开销,客户端信息,读写缓冲区等
  4. 主从复制,bgsave时的额外开销

疑问 - 1:

  • 内存使用率占到多大比较合适?
  • 单节点内存占用多大比较合适?公司DBA限制不超过10G
  • 什么时候可以触发扩展节点内存大小?
  • 为什么建议只3主3从不扩展到5个主5从?
  • 怎么选择内存驱逐策略?
  • 当内存不够的时候是选择扩展节点内存还是拆分新的Redis集群?
  • Redis中内存数据:将和业务强相关的类型数据和缓存数据缓和在一套集群中合适吗?

你可能感兴趣的:(Redis)