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)
安装有两种方式:
- 使用 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
- 源码安装
$ 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 的情况。就这样吧......