超过Redis maxmemory

时间:2015-12-17 23:43:57

标签: redis

我正在本地机器上试验redis 3.0驱逐策略 - 我想限制最大内存,因此redis不能超过20兆字节。

我的配置:

loglevel debug
maxmemory 20mb
maxmemory-policy noeviction

从这里开始,我使用我的配置运行redis-server,然后是

redis-benchmark -q -n 100000 -c 50 -P 12

将一堆密钥存储在内存中。这使我的mac上redis的内存使用量为21MB,超过指定限制的1兆字节。如果我再次运行它,就会消耗更多。

根据redis documentation,这应该由我的maxmemory指令和驱逐策略控制,其中在后续写入时抛出错误但我没有发现这种情况。

为什么redis-server消耗的内存比分配的内存多?

1 个答案:

答案 0 :(得分:2)

Redis maxmemory策略控制用户数据内存使用情况(评论中为Itamer Haber sas)。但是这里有一些更复杂的内存补偿情况:

  • 取决于操作系统。
  • 取决于CPU和使用的编译器(读作Redis x86 / x64使用)
  • 取决于使用的分配器(Redis中默认为jemalloc

在实际应用程序中(如Redis所示),您对内存管理的权限有限。因此,您的应用程序将为编译为x64或x86的相同应用程序编译不同的内存。在Redis的情况下,数据开销最接近2次的内存。

为什么这很重要

每次向Redis写入一些数据时,都会使用allocator分配或重新分配内存。最后一个( jemalloc )对此有复杂的策略。简而言之 - 分配内存大小,排列成最接近的2的幂(你需要17个字节 - 将分配32个)。许多Redis结构使用相同的策略。例如,HASH(以及引擎盖下使用的HASH的ZSET)使用这样的策略。字符串使用更粗暴的策略 - 在REDIS_ENCODING_EMBSTR_SIZE_LIMIT(1 mb)下加倍大小(重新分配)或者只需分配需要大小+ REDIS_ENCODING_EMBSTR_SIZE_LIMIT)。

那么,你是否限制了你的maxmemory - 操作系统中实际使用的内存可能会更多,Redis也无法做到这一点。

P.S。请不要拍广告。你的问题非常接近我。以下是series of articles关于Redis中的实际内存使用情况(他们都是俄语,对不起。我计划在新的一年周末用英语翻译它们。之后更新链接在这里。翻译的部分{{3} })。