分析Redis内存使用情况

时间:2011-04-03 21:36:04

标签: memory redis

有什么工具我可以用来了解Redis占用多少内存?

7 个答案:

答案 0 :(得分:36)

尝试查看INFO命令。我还建议您阅读有关Redis内存使用情况的this文章,其中您可以找到有关内存占用特定数据结构的更多信息。

答案 1 :(得分:29)

请参阅https://github.com/sripathikrishnan/redis-rdb-tools

Rdb Tools报告数据库中每个key = value对使用的内存。它解析redis转储文件,并构造一个csv文件。此csv文件中的每一行都是一个键,列包含该键占用的内存。

您可以在键或数据类型上过滤结果。由于该工具在转储文件上运行,因此不会影响redis服务器的性能。

要记住的一点 - 报告的内存使用量是近似值。根据我的实验,我发现实际内存使用率比该工具报告的高出约15%。

答案 2 :(得分:6)

如果loglevel设置为verbosedebug,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

您可以看到数据库中有2个密钥,1个连接的客户端。正在使用924416个字节。总内存使用量(由used_memory_rss命令返回的INFO字段显示)可能稍高(有关详细信息,请参阅INFO文档)。

存储在redis中的数据显然需要内存,但它不是内存使用的唯一可控原因。配置了更多数据库后,内存使用量会增加(在我的系统上每个数据库大约450个字节)。每个连接也使用内存(在我的系统上每个连接大约8千字节)。

答案 3 :(得分:4)

请注意从版本4开始的Redis got a integrated memory analyzer。用法:

"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"

答案 4 :(得分:1)

请参阅https://github.com/gamenet/redis-memory-analyzer

RMA是一种控制台工具,可以实时扫描Redis密钥空间,并按密钥模式聚合内存使用情况统计信息。您可以在生产服务器上使用此工具而无需维护。

您可以扫描所有或选定的Redis类型,例如“string”,“hash”,“list”,“set”,“zset”,并根据需要使用匹配模式。

此外,RMA尝试通过模式识别关键名称,例如,如果你有像'user:100'这样的键和'user:101'应用程序会在输出中选出常用模式'user:*',这样你就可以分析大多数内存您实例中的不良数据。

答案 5 :(得分:0)

如果您对如何在密钥中分配内存感兴趣,可以尝试https://github.com/alexdicianu/redis_toolkit。它只适用于你的密钥遵循这种模式A:B,A:B:C或A:B:*,等等。如果你使用Redis作为像Wordpress或Drupal这样的CMS的对象缓存引擎,那将非常有用。

这是一个样本。

$ ./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 |

答案 6 :(得分:-1)

您可以使用鲜为人知(并且可能是可更改的)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命令检查每个键。