• Redis内存分析方法


    一般会采用 bgsave 生成 dump.rdb 文件,再结合 redis-rdb-tools 和 sqlite 来进行静态分析。

    BGSAVE:在后台异步(Asynchronously)保存当前数据库的数据到磁盘。

    BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。

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

    redis-rdb-tools 安装:

    使用 PYPI 安装:

    pip install rdbtools

    使用 源码安装:

    git clone https://github.com/sripathikrishnan/redis-rdb-tools
    cd redis-rdb-tools
    sudo python setup.py install

    使用 redis-rdb-tools 生成内存快照:

    rdb -c memory dump.rdb > memory.csv

    生成 CSV 格式的内存报告。包含的列有:数据库 ID,数据类型,key,内存使用量(byte),编码。内存使用量包含 key、value 和其他值。

    内存使用量是理论上的近似值,在一般情况下,略低于实际值。

    [ares:~/Desktop$head memory.csv
    database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
    0,string,trade.coupon.id:653601465,112,string,8,8
    0,string,trade.coupon.id:631354838,112,string,8,8
    0,string,trade.coupon.id:632477800,112,string,8,8
    0,string,trade.coupon.id:620802294,112,string,8,8
    0,string,trade.coupon.id:631432959,112,string,8,8
    0,string,trade.coupon.id:632933399,112,string,8,8
    0,string,trade.coupon.id:632117725,112,string,8,8
    0,string,trade.coupon.id:634240609,112,string,8,8
    0,string,trade.coupon.id:646317603,112,string,8,8

    注:若csv文件不大,可直接用相关软件打开,以size_in_bytes列排序,可以看到大致内存使用。

    使用SQLite分析内存快照:

    SQLite版本必须是3.16.0以上。

    导入memory.csv数据库:

    $sqlite3 memory.db
    SQLite version 3.19.3 2017-06-27 16:48:08
    Enter ".help" for usage hints.
    sqlite> create table memory(database int,type varchar(128),key varchar(128),size_in_bytes int,encoding varchar(128),num_elements int,len_largest_element varchar(128));
    sqlite> .mode csv memory
    sqlite> .import memory.csv memory

    数据导入后,可以随处理:

    查询key总数:

    sqlite> select count(*) from memory;
    31143847

    查询key总占用内存:

    sqlite> select sum(size_in_bytes) from memory;
    17391950414.0

    查询内容占用最高的几个key:

    sqlite> select key,size_in_bytes from memory order by size_in_bytes desc limit 10;
    key,size_in_bytes
    public.xx.xx:xx,7860169636
    public.xx.xx:xx,3043206524
    public.xx.xx:xx,1866022916
    public.xx.xx:xx,420931316
    public.xx.xx:idxx171118172
    xx,162984940
    xx,133443892
    public.xx.xx:xx,80925132
    public.xx.xx:xx,28340356

    可以看到占用内存较高的key,做相应处理即可。

  • 相关阅读:
    使用牛顿迭代法和二分法求解一个数的平方根(python语言实现)
    厄拉多塞筛法和普通方法求素数表(python实现)
    使用辗转相除法求两个数的最大公因数(python实现)
    我在博客园第一篇博文
    Linux安装maven
    MyBatis基础入门
    Maven的使用入门
    nginx的简单使用和使用nginx在windows上搭建tomcat集群
    后端程序员如何玩转AJAX
    Servlet3.0文件上传
  • 原文地址:https://www.cnblogs.com/aresxin/p/9014617.html
Copyright © 2020-2023  润新知