zoukankan      html  css  js  c++  java
  • 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 参考资料

  • 相关阅读:
    关于js判断鼠标移入元素的方向--解释
    angularJs的学习笔记(一):angularJs的filter是根据value属性值来过滤的
    虚拟机设置网络连接
    [转载]23个经典JDK设计模式
    Ubuntu 17.04 开启 TCP BBR 拥塞控制算法
    解决DIGITALOCEAN后台被墙的两个方法
    远程访问服务器上的MySQL数据库,发现root远程连接不上
    jsp获取properties配置文件中的属性值
    去除底部“自豪地采用 WordPress”版权信息----最后附最新版的删除方法!!
    改91云linux服务器一键测试脚本(去除上传测试文件代码)
  • 原文地址:https://www.cnblogs.com/syushin/p/15214711.html
Copyright © 2011-2022 走看看