【问题标题】:Redis high memory usage for almot no keys几乎没有键的 Redis 高内存使用率
【发布时间】:2017-07-03 04:47:52
【问题描述】:

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

这个 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

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

我尝试过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

我实际上是盲人:used_memory_lua_human:267.85M 在我第一次创建这篇文章时运行的 INFO 命令中,现在used_memory_lua_human:89.25M 在新实例上

这似乎超高,并且可能解释了内存使用情况

【问题讨论】:

  • 我会联系他们的支持 - 毕竟你要付钱给他们

标签: heroku redis


【解决方案1】:

您在数据库中只有 45 个键,所以您可以做的是:

  1. 使用KEYS * 命令列出所有键
  2. 为每个或多个键运行DEBUG OBJECT <key> 命令,它将返回序列化长度,以便您更好地了解哪些键占用了大量空间。

另一种选择是运行redis-cli --bigkeys,这样它将显示最大的键。您可以通过特定的数据类型命令查看键的内容 - 对于字符串,它是 GET 命令,对于哈希,它是 HGETALL 等等。

【讨论】:

  • 不幸的是,您不能在 heroku 的 redis 上使用 DEBUG 命令。但我会看看--bigkeys
【解决方案2】:

经过大量挖掘,问题无论如何都不是来自 Redis 或 Heroku。

我们使用的队列系统最近出现了一个错误,即 Redis 最终会缓存 Lua 脚本,随着时间的推移反复消耗内存。

更多信息在这里:https://github.com/OptimalBits/bull/issues/426

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

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2014-02-18
    • 2011-09-19
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多