Redis 資料庫的簡單分析
阿新 • • 發佈:2021-09-01
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)
安裝有兩種方式:
- 使用 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
- 原始碼安裝
$ 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過期時間
這樣就可以檢視哪些 key 是比較大的。