redis 内存分析
一、首先安装pip(最好yum安装,python安装的版本在安装rdbtools时报错)
yum install -y pip 或者编译安装
wget "https://pypi.python.org/packages/source/p/pip/pip1.5.4.tar.gz#md5=834b2904f92d46aaa333267fb1c922bb" --no-check-certificat
进入文件夹 python setup.py install
二、安装redis-rdb-tools
1.pypi安装
pip install rdbtools
2.编译安装
git clone https://github.com/sripathikrishnan/redis-rdb-tools cd redis-rdb-tools sudo python setup.py install
三、使用redis-rdb-tools
1.开启RDB持久化或者手动生成RDB文件
redis> BGSAVE
2.用rdb生成内存快照
rdb -c memory dump.rdb > memory.csv
生成 CSV 格式的内存报告。包含的列有:数据库 ID,数据类型,key,内存使用量(byte),编码。内存使用量包含 key、value 和其他值。
3.分析内存报告
由于分析报告时csv格式,所以可以有多种分析方式,推荐sqlite和Mysql
1.sqlite分析
sqlite是python的软件库,sqlite无需配置,也没有进程(线程),本身就是个文件,而且支持SQL语句
(1)导入分析报告
sqlite3 memory.db 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),expiry varchar(50)); sqlite>.mode csv #逗号分隔的值 sqlite>.import memory.csv memory
(2)查看分析报告
查询key个数 sqlite>select count(*) from memory;
查询总的内存占用 sqlite>select sum(size_in_bytes) from memory;
查询内存占用最高的10个 key sqlite>select * from memory order by size_in_bytes desc limit 10;
查询成员个数1000个以上的 list sqlite>select * from memory where type='list' and num_elements > 1000 ;
2.mysql分析
查看分析与sqlite并无差别,主要差别在于导入(mysql可以略错误,sqlite不能)
create table memory(db int,type varchar(128),keey varchar(128),size_in_bytes int,encoding varchar(128),num_elements int,len_largest_element varchar(128),expiry varchar(50)); LOAD DATA INFILE '/logs/mysql_load/memory.csv' INTO TABLE memory character set latin1 ignore 1 lines;
创建表的时候,由于database,key是敏感词,所以我把database,key这l两列改成了db,keey
我在load data时有字符集的报错,所以该改成了latin1,必要的时候,在没有影响到主要的size_in_bytes数据时,可以添加ignore跳过错误
LOAD DATA INFILE '/logs/mysql_load/memory.csv' ignore INTO TABLE memory ignore 1 lines;