我正在本地机器上试验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消耗的内存比分配的内存多?
答案 0 :(得分:2)
Redis maxmemory
策略控制用户数据内存使用情况(评论中为Itamer Haber sas)。但是这里有一些更复杂的内存补偿情况:
在实际应用程序中(如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} })。