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 参考资料

  • 相关阅读:
    HDU Railroad (记忆化)
    HDU 1227 Fast Food
    HDU 3008 Warcraft
    asp vbscript 检测客户端浏览器和操作系统(也可以易于升级到ASP.NET)
    Csharp 讀取大文本文件數據到DataTable中,大批量插入到數據庫中
    csharp 在万年历中计算显示农历日子出错
    csharp create ICS file extension
    CSS DIV Shadow
    DataTable search keyword
    User select fontface/color/size/backgroundColor设置 字体,颜色,大小,背景色兼容主流浏览器
  • 原文地址:https://www.cnblogs.com/syushin/p/15214711.html
Copyright © 2011-2022 走看看