Redis 数据库的简单分析

今天看看服务器,redis因为内存占用过大,然后崩了,就学了学排查redis内存情况,记录一下

1 info memory 详解

redis-cli 命令行输入 info memory ,可以看到当前 redis 的内存情况,各项参数说明如下:

指标 说明
used_memory 由 Redis 分配器分配的内存总量,包含了redis进程内部的开销和数据占用的内存,以字节(byte)为单位,即当前redis使用内存大小。
used_memory_human 已更直观的单位展示分配的内存总量。
used_memory_rss 向操作系统申请的内存大小,与 top 、 ps等命令的输出一致,即redis使用的物理内存大小。
used_memory_rss_human 已更直观的单位展示向操作系统申请的内存大小。
used_memory_peak redis的内存消耗峰值(以字节为单位),即历史使用记录中redis使用内存峰值。
used_memory_peak_human 以更直观的格式返回redis的内存消耗峰值
used_memory_peak_perc 使用内存达到峰值内存的百分比,used_memory/ used_memory_peak) 100%,即当前redis使用内存/历史使用记录中redis使用内存峰值100%
used_memory_overhead Redis为了维护数据集的内部机制所需的内存开销,包括所有客户端输出缓冲区、查询缓冲区、AOF重写缓冲区和主从复制的backlog。
used_memory_startup Redis服务器启动时消耗的内存
used_memory_dataset 数据实际占用的内存大小,即used_memory-used_memory_overhead
used_memory_dataset_perc 数据占用的内存大小的百分比,100%*(used_memory_dataset/(used_memory-used_memory_startup))
total_system_memory 整个系统内存
total_system_memory_human 以更直观的格式显示整个系统内存
used_memory_lua Lua脚本存储占用的内存
used_memory_lua_human 以更直观的格式显示Lua脚本存储占用的内存
maxmemory Redis实例的最大内存配置
maxmemory_human 以更直观的格式显示Redis实例的最大内存配置
maxmemory_policy 当达到maxmemory时的淘汰策略
mem_fragmentation_ratio 碎片率,used_memory_rss/ used_memory。ratio指数>1表明有内存碎片,越大表明越多,<1表明正在使用虚拟内存,虚拟内存其实就是硬盘,性能比内存低得多,这是应该增强机器的内存以提高性能。一般来说,mem_fragmentation_ratio的数值在1 ~ 1.5之间是比较健康的。
mem_allocator 内存分配器
active_defrag_running 表示没有活动的defrag任务正在运行,1表示有活动的defrag任务正在运行(defrag:表示内存碎片整理)详解
lazyfree_pending_objects 0表示不存在延迟释放的挂起对象

2 使用 rdb-tools 分析redis

2.1 rdb-tools 介绍

redis-rdb-tools 是一个 python 的解析 rdb 文件的工具,在分析内存的时候,我们主要用它生成内存快照。

源码地址:https://github.com/sripathikrishnan/redis-rdb-tools/

主要有以下三个功能:

  • 生成内存快照
  • 转储成 json 格式
  • 使用标准的 diff 工具比较两个 dump 文件

2.2 rbd-tools 安装

本文安装环境:

$ python -V
Python 2.7.5
$ cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)

安装有两种方式:

  1. 使用 PYPI 进行安装:
$ pip install rdbtools

如果提示:pip: command not found,则需要进行安装 pip,安装完成后再安装 rdbtools。

$ yum install epel-release
$ yum install -y python-pip

安装完成后,使用 rdbtools 还需要另外一个包 python-lzf

# 先安装 python-devel
$  yum install python-devel
# 再安装 python-lzf
$ pip install python-lzf
  1. 源码安装
$ git clone https://github.com/sripathikrishnan/redis-rdb-tools.git
$ cd redis-rdb-tools
$  python setup.py install

2.3 rbd-tools 使用

rdb-tools 提供了命令 rdb,查看 rdb 命令的帮助文档:

[root@syushin ~]# rdb -h
usage: usage: rdb [options] /path/to/dump.rdb

# 示例:表示从dump.rdb文件中分析出所有以`user.`开头的key并输出为json格式,输出到屏幕上
Example : rdb --command json -k "user.*" /var/redis/6379/dump.rdb

positional arguments:
  dump_file             RDB Dump file to process

optional arguments:
  # 查看帮助文档
  -h, --help            show this help message and exit
  
  # 必选参数,-c json 表示存储成json格式,常用的是 -c memory 表示生成csv格式的内存快照,还有diff模式进行对比
  -c CMD, --command CMD
                        Command to execute. Valid commands are json, diff,
                        justkeys, justkeyvals, memory and protocol
  # -f 指定输出到文件                      
  -f FILE, --file FILE  Output file
  # 只分析指定的redis数据库,如 -n 0 表示只分析 db0 数据库,不指定默认包含所有
  -n DBS, --db DBS      Database Number. Multiple databases can be provided.
                        If not specified, all databases will be included.
  # 指定需要导出的KEY,可以使用正则表达式              
  -k KEYS, --key KEYS   Keys to export. This can be a regular expression
  # 指定不需要导出的KEY,可以使用正则表达式;
  -o NOT_KEYS, --not-key NOT_KEYS
                        Keys Not to export. This can be a regular expression
  # 指定解析的数据类型,可能的值有 string、hash、set、sortedset、list,可以提供多个类型,如果没有指定,所有数据类型都返回                     
  -t TYPES, --type TYPES
                        Data types to include. Possible values are string,
                        hash, set, sortedset, list. Multiple typees can be
                        provided. If not specified, all data types will be
                        returned
  # 限制输出KEY大大小      	              
  -b BYTES, --bytes BYTES
                        Limit memory output to keys greater to or equal to
                        this value (in bytes)
  # 根据大小限制的 top key,如 -l 100 表示当前redis中前 100 的大key                      
  -l LARGEST, --largest LARGEST
                        Limit memory output to only the top N keys (by size)
  # 指定输出编码,默认RAW;                   
  -e {raw,print,utf8,base64}, --escape {raw,print,utf8,base64}
                        Escape strings to encoding: raw (default), print,
                        utf8, or base64.
  # 只有command为protocol模式才有效,表示不输出所有的可过期的key,只输出哪些永不过期的key                      
  -x, --no-expire       With protocol command, remove expiry from all keys
  # 只有command为protocol模式才有效,表示给设置过期时间的key增加N秒的过期时间
  -a N, --amend-expire N
                        With protocol command, add N seconds to key expiry
                        time

示例如下:

# 分析当前目录下的 dump.rdb 文件,分析前10个大key,将其存入 dump.csv 文件中
[root@syushin ~]# rdb -c memory dump.rdb -l 10 -f dump.csv

分析完成后会生成 dump.csv 文件,将其在 Excel 中打开:

输出字段说明:

  • database :key在redis的db
  • type :key类型
  • key :key值
  • size_in_bytes :key的内存大小(byte)
  • encoding :value的存储编码形式
  • num_elements :key中的value的个数
  • len_largest_element :key中的value的长度
  • expiry :key过期时间

这样就可以比较直观地查看 Redis 中 key 的情况。就这样吧......

3 参考资料

原文地址:https://www.cnblogs.com/syushin/p/15214711.html