分析Redis内存使用情况
有什么工具可以用来找出Redis正在占用多less内存?
试着看看INFO命令。 我也推荐阅读这篇关于Redis内存使用情况的文章,您可以在这里find更多关于内存占用特定数据结构的信息。
请参阅https://github.com/sripathikrishnan/redis-rdb-tools
Rdb工具报告数据库中每个键=值对使用的内存。 它parsing一个redis转储文件,并构造一个csv文件。 此csv文件中的每一行都是一个键,列包含该键所占用的内存。
您可以在键或数据types上过滤结果。 由于该工具在转储文件上运行,因此不会影响您的redis服务器的性能。
需要记住的一点 – 所报告的内存使用情况是一个近似值。 根据我的实验,我发现实际的内存使用率比该工具报告的高出约15%。
如果loglevel
设置为verbose
或debug
则Redis将每5秒输出一次内存使用情况。
例如,这是我近乎空的数据库上的输出:
[49523] 07 Apr 00:38:58 - DB 0: 2 keys (0 volatile) in 4 slots HT. [49523] 07 Apr 00:38:58 - 1 clients connected (0 slaves), 924416 bytes in use
您可以看到数据库中有两个密钥,以及一个连接的客户端。 924416字节处于活动状态。 内存使用总量(如INFO
命令返回的used_memory_rss
字段所示)可能稍高一些(有关详细信息 ,请参阅INFO文档)。
存储在redis中的数据显然需要内存,但这不是内存使用的唯一可控原因。 随着更多的数据库configuration,内存使用增加(在我的系统上每个数据库大约450字节)。 每个连接也使用内存(在我的系统上每个连接大约8千字节)。
见https://github.com/gamenet/redis-memory-analyzer
RMA是一个控制台工具,可以实时扫描Redis密钥空间,并按关键模式聚合内存使用统计信息。 您可以在生产服务器上使用此工具而无需维护。
您可以扫描所有或选定的Redistypes,如“string”,“哈希”,“列表”,“设置”,“zset”,并使用匹配模式,只要你喜欢。
另外RMA尝试通过模式辨别键名,例如,如果您有像'user:100'这样的键和'user:101'应用程序将在输出中select常用模式'user:*',那么您可以分析大部分内存中的数据你的实例。
请注意,从版本4 开始 ,Redis 获得了集成的内存分析器 。用法:
"MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key" "MEMORY STATS - Show memory usage details" "MEMORY PURGE - Ask the allocator to release memory" "MEMORY MALLOC-STATS - Show allocator internal stats"
如果你也对这个内存如何分配你的密钥感兴趣,你可以试试https://github.com/alexdicianu/redis_toolkit 。 它只适用于你的密钥遵循这种模式A:B,A:B:C或A:B:*等。如果你使用Redis作为CMS的对象caching引擎,比如Wordpress或Drupal,
这是一个示例。
$ ./redis-toolkit report -type memory -name NAME +----------------------------------------+----------+-----------+----------+ | KEY | NR KEYS | SIZE (MB) | SIZE (%) | +----------------------------------------+----------+-----------+----------+ | posts:* | 500 | 0.56 | 2.79 | | post_meta:* | 440 | 18.48 | 92.78 | | terms:* | 192 | 0.12 | 0.63 | | options:* | 109 | 0.52 | 2.59 |
你可以通过DEBUG OBJECT命令来了解一组键所使用的内存。
在Ruby IRB中,你可以尝试这个(警告,将读取每个键,可能需要一些时间):
keys = $redis.keys;nil map = Hash.new(0) keys.each{|k| map[k.split(':').first] += $redis.debug("object", k).split[4].split(':')[1].to_i rescue 0};nil map.sort_by{|x|x[1]}
这将显示关键的前缀,并聚合每个前缀占用的字节。 Redis实际上比总和占用更多的内存,但这会给你一个相对的想法,让你看看哪个关键字前缀最大。
之后,您可以使用$ redis.keys(“prefix *”)获得前缀的所有密钥,并使用其他Redis命令来检查每个密钥。