redis-rdb-tools来解析分析reids dump文件及内存使用量
2019獨角獸企業重金招聘Python工程師標準>>>
?redis-rdb-tools來解析分析reids dump文件及內存使用量?
?
一.?前言
解析redis的dump.rdb文件,分析內存,以JSON格式導出數據。|
提供的功能有:
1. 生成內存報告
2. 轉儲文件到JSON
3. 使用標準的diff工具比較兩個dump文件
Rdbtools是以python語言開發的。
二.?安裝
2.1 前提條件
1. python2.4以上版本 和 pip
2. redis-py可選,只運行在測試用例下
2.2 從PyPI安裝(推薦)
| # /usr/local/python/bin/easy_install pip # /usr/local/python/bin/pip install rdbtools |
2.3 從源碼包安裝
?
| # wget?https://github.com/sripathikrishnan/redis-rdb-tools/archive/master.zip # unzip master # cd redis-rdb-tools-master/ # python setup.py install Downloading/unpacking rdbtools ??Downloading rdbtools-0.1.5.tar.gz ??Running setup.py egg_info for package rdbtools ? ????warning: no files found matching 'README.textile' Installing collected packages: rdbtools ??Running setup.py install for rdbtools ? ????warning: no files found matching 'README.textile' ????Installing redis-memory-for-key script to /usr/local/python/bin ????Installing redis-profiler script to /usr/local/python/bin ????Installing rdb script to /usr/local/python/bin Successfully installed rdbtools Cleaning up... |
三.?轉換dump文件到JSON
?
| # /usr/local/python/bin/rdb --help Usage: rdb [options] /path/to/dump.rdb Example : rdb --command json -k "user.*" /var/redis/6379/dump.rdb ? Options: ??-h, --help??????????? show this help message and exit ??-c FILE, --command=FILE ????????????????????????要執行的命令json?或?diff ??-f FILE, --file=FILE??輸出文件名 ??-n DBS, --db=DBS??????數據庫ID??梢蕴峁┒鄠€數據庫。如果沒有指定,包含所有數據庫。 ??-k KEYS, --key=KEYS???導出鍵??梢允钦齽t表達式。 ??-t TYPES, --type=TYPES ????????????????????????數據類型??赡艿闹涤?#xff1a;string, hash, set, sortedset, list。 可以提供多個類型。如果沒有指定,所有數據類型都返回。 |
3.1 解析dump文件并以JSON格式標準輸出
?
| # /usr/local/python/bin/rdb --command json /data/redis_data/6379/dump.rdb |
3.2 只解析符合正則的keys
?
| # /usr/local/python/bin/rdb --command json --key "sences_2.*" /data/redis_data/6379/dump.rdb |
3.3 只解析以“a”為開頭的hash且位于數據庫ID為2的
?
| # /usr/local/python/bin/rdb --command json --db 2 --type hash --key "a.*" /data/redis_data/6379/dump.rdb |
四.?生成內存報告
生成CSV格式的內存報告。包含的列有:數據庫ID,數據類型,key,內存使用量(byte),編碼。內存使用量包含key、value和其他值。
注意:內存使用量是近似的。在一般情況下,略低于實際值。
可以根據key或數據庫ID或數據類型對報告的內容進行過濾。
內存報告有助于檢測是否是應用程序邏輯導致的內存泄露,也有助于優化reids內存使用情況。
?
| # /usr/local/python/bin/rdb -c memory /data/redis_data/6379/dump.rdb > redis_memory_report.csv 內容如下所示: database,type,key,size_in_bytes,encoding,num_elements,len_largest_element 0,string,"ot_0_3b0703c01015ce05f76ef4b977dc020e820d0692",351,string,184,184 0,hash,"sences_98558",1703,hashtable,10,132 0,hash,"sences_170989",1698,hashtable,10,138 0,hash,"sences_34233",1673,hashtable,10,115 0,hash,"sence_messages2_favor_32783",358,ziplist,7,51 |
五.?單個key所使用的內存量
有時候,需要查詢某個key所使用的內存。如果全部導出來在查找將是很愚蠢且耗時的。對于這種情景,可以使用redis-memory-for-key命令。
如果出現下面信息,需要安裝redis模塊。redis-memory-for-key依賴redis-py包。
?
| Traceback (most recent call last): ?File "/usr/local/python/bin/redis-memory-for-key", line 8, in ?load_entry_point('rdbtools==0.1.5', 'console_scripts', 'redis-memory-for-key')() ?from redis import StrictRedis ImportError: No module named redis |
?
| # /usr/local/python/bin/pip install redis 或 # /usr/local/python/bin/easy_install redis |
?
| # /usr/local/python/bin/redis-memory-for-key --help Usage: redis-memory-for-key [options] redis-key Examples : redis-memory-for-key user:13423 redis-memory-for-key -h localhost -p 6379 user:13423 Options: ??-h, --help??????????? show this help message and exit ??-s HOST, --server=HOST ????????????????????????Redis Server hostname. Defaults to 127.0.0.1 ??-p PORT, --port=PORT? Redis Server port. Defaults to 6379 ??-a PASSWORD, --password=PASSWORD ????????????????????????Password to use when connecting to the server ??-d DB, --db=DB??????? Database number, defaults to 0 |
實例如下:
?
| # /usr/local/python/bin/redis-memory-for-key -s 10.1.242.124?? sence_167989 Key???????????????????????????? "sence_167989" Bytes?????????????????????????? 2712.0 Type??????????????????????????? hash Encoding??????????????????????? hashtable Number of Elements????????????? 15 Length of Largest Element?????? 222 |
六.?比較RDB文件
使用–command diff選項,并通過管道來進行排序。
?
| # /usr/local/python/bin/rdb --command diff /data/redis_data/6379/dump.rdb | sort > dump1.txt # /usr/local/python/bin/rdb --command diff /data/redis_data/6379/dump.rdb | sort > dump2.txt # diff dump1.txt dump2.txt |
使用kdiff3工具來進行比較,kdiff3是圖形化的工具,比較直觀。kdiff3工具比較兩個或三個輸入文件或目錄。
安裝kdiff3
?
| # rpm -ivh?http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm # yum install kdiff3 # kdiff3 dump1.txt dump2.txt |
七.?使用解析器
?
| import sys from rdbtools import RdbParser, RdbCallback ? class MyCallback(RdbCallback) : ????''' Simple example to show how callback works. ????????See RdbCallback for all available callback methods. ????????See JsonCallback for a concrete example ????''' ????def set(self, key, value, expiry): ????????print('%s = %s' % (str(key), str(value))) ? ????def hset(self, key, field, value): ????????print('%s.%s = %s' % (str(key), str(field), str(value))) ? ????def sadd(self, key, member): ????????print('%s has {%s}' % (str(key), str(member))) ? ????def rpush(self, key, value) : ????????print('%s has [%s]' % (str(key), str(value))) ? ????def zadd(self, key, score, member): ????????print('%s has {%s : %s}' % (str(key), str(member), str(score))) ? callback = MyCallback() parser = RdbParser(callback) parser.parse('/var/redis/6379/dump.rdb') |
八.?其他資源
1. FAQ:https://github.com/sripathikrishnan/redis-rdb-tools/wiki/FAQs
2. redis dump文件規范: https://github.com/sripathikrishnan/redis-rdb-tools/wiki/Redis-RDB-Dump-File-Format
3. redis RDB歷史版本: https://github.com/sripathikrishnan/redis-rdb-tools/blob/master/docs/RDB_Version_History.textile
4.?redis-rdb-tools:https://github.com/sripathikrishnan/redis-rdb-tools
九.?其他工具Redis-audit?
Redis-audit 是一個用ruby實現的腳本,通過它,我們可以知道每一類 key 對內存的使用量。它可以提供的數據有:某一類 key 值的訪問頻率如何,有多少值設置了過期時間,某一類 key 值使用內存的大小,這很方便讓我們能排查哪些 key 不常用或者壓根不用。
項目地址:https://github.com/snmaynard/redis-audit
如需轉載請注明出處:http://www.ttlsa.com/html/2653.html
2015年11月:
Redis Info 命令以一種易于理解和閱讀的格式,返回關于 Redis 服務器的各種信息和統計數值。
通過給定可選的參數 section ,可以讓命令只返回某一部分的信息
-
server : 一般 Redis 服務器信息,包含以下域:
- redis_version : Redis 服務器版本
- redis_git_sha1 : Git SHA1
- redis_git_dirty : Git dirty flag
- os : Redis 服務器的宿主操作系統
- arch_bits : 架構(32 或 64 位)
- multiplexing_api : Redis 所使用的事件處理機制
- gcc_version : 編譯 Redis 時所使用的 GCC 版本
- process_id : 服務器進程的 PID
- run_id : Redis 服務器的隨機標識符(用于 Sentinel 和集群)
- tcp_port : TCP/IP 監聽端口
- uptime_in_seconds : 自 Redis 服務器啟動以來,經過的秒數
- uptime_in_days : 自 Redis 服務器啟動以來,經過的天數
- lru_clock : 以分鐘為單位進行自增的時鐘,用于 LRU 管理
-
clients : 已連接客戶端信息,包含以下域:
- connected_clients : 已連接客戶端的數量(不包括通過從屬服務器連接的客戶端)
- client_longest_output_list : 當前連接的客戶端當中,最長的輸出列表
- client_longest_input_buf : 當前連接的客戶端當中,最大輸入緩存
- blocked_clients : 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客戶端的數量
-
memory : 內存信息,包含以下域:
- used_memory : 由 Redis 分配器分配的內存總量,以字節(byte)為單位
- used_memory_human : 以人類可讀的格式返回 Redis 分配的內存總量
- used_memory_rss : 從操作系統的角度,返回 Redis 已分配的內存總量(俗稱常駐集大小)。這個值和 top 、 ps 等命令的輸出一致。
- used_memory_peak : Redis 的內存消耗峰值(以字節為單位)
- used_memory_peak_human : 以人類可讀的格式返回 Redis 的內存消耗峰值
- used_memory_lua : Lua 引擎所使用的內存大小(以字節為單位)
- mem_fragmentation_ratio : used_memory_rss 和 used_memory 之間的比率
- mem_allocator : 在編譯時指定的, Redis 所使用的內存分配器??梢允?libc 、 jemalloc 或者 tcmalloc 。
轉載于:https://my.oschina.net/suventop/blog/1857496
總結
以上是生活随笔為你收集整理的redis-rdb-tools来解析分析reids dump文件及内存使用量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 之委托的多播
- 下一篇: 基于 Trae Claude-3.7 从