Redis高内存使用率为almot没有键

时间:2017-02-14 18:44:20

标签: heroku redis

我有一个由heroku(https://elements.heroku.com/addons/heroku-redis)托管的redis实例并使用该计划" Premium 1"

此redis仅用于托管名为Bull(https://www.npmjs.com/package/bull

的小型队列系统

即使在redis中几乎没有存储任何作业,内存使用率现在几乎达到100%(允许100 Mo)。

我在这个实例上运行了INFO命令,这里是重要的部分(如果需要可以发布更多):

# Server
redis_version:3.2.4

# Memory
used_memory:98123632
used_memory_human:93.58M
used_memory_rss:470360064
used_memory_rss_human:448.57M
used_memory_peak:105616528
used_memory_peak_human:100.72M
total_system_memory:16040415232
total_system_memory_human:14.94G
used_memory_lua:280863744
used_memory_lua_human:267.85M
maxmemory:104857600
maxmemory_human:100.00M
maxmemory_policy:noeviction
mem_fragmentation_ratio:4.79
mem_allocator:jemalloc-4.0.3

# Keyspace
db0:keys=45,expires=0,avg_ttl=0  

# Replication
role:master
connected_slaves:1
master_repl_offset:25687582196
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:25686533621
repl_backlog_histlen:1048576

我很难弄清楚如何使用95 Mo,只存储50个对象。这些对象非常小,通常是一个包含2-3个字段的JSON,包含小字符串和ID

我试过https://github.com/gamenet/redis-memory-analyzer但是当我尝试运行它时它就崩溃了

我无法获得转储,因为Heroku不允许它。

我有点迷失在这里,可能会有一些明显的错过,但我已经达到了对Redis理解的极限。

提前感谢任何提示/指针。

修改

我们必须升级我们的Redis实例以保持一切正常运行,但似乎问题仍然存在。目前坐在34键/ 34 Mo

我已经尝试redis-cli --bigkeys

Sampled 34 keys in the keyspace!
Total key length in bytes is 743 (avg len 21.85)

9 strings with 43 bytes (26.47% of keys, avg size 4.78)
0 lists with 0 items (00.00% of keys, avg size 0.00)
0 sets with 0 members (00.00% of keys, avg size 0.00) 
24 hashs with 227 fields (70.59% of keys, avg size 9.46)
1 zsets with 23 members (02.94% of keys, avg size 23.00)

我很确定某处有一些建筑物,但我无法找到。

编辑2

我实际上是盲目的:我在首次创建此帖子时运行的INFO命令中used_memory_lua_human:267.85M,现在used_memory_lua_human:89.25M在新实例上

这似乎超级高,可能会解释内存使用情况

2 个答案:

答案 0 :(得分:1)

经过大量挖掘后,问题不是来自Redis或Heroku。

我们使用的队列系统有一个近期的错误,Redis最终缓存一个Lua脚本,随着时间的推移反复占用内存。

此处有更多信息:https://github.com/OptimalBits/bull/issues/426

感谢那些花时间回复的人。

答案 1 :(得分:0)

数据库中只有45个密钥,因此您可以做的是:

  1. 使用KEYS *命令列出所有密钥
  2. 为每个或多个键运行DEBUG OBJECT <key>命令,它将返回序列化长度,以便您更好地了解哪些键占用了大量空间。
  3. 备选方案是运行redis-cli --bigkeys,以便显示最大的密钥。您可以通过特定的数据类型命令查看密钥的内容 - 对于字符串它是GET命令,对于哈希它是HGETALL等等。