Redis内存指标疑问:为何used_memory_peak大于used_memory_rss?maxmemory是什么?
Redis内存核心指标疑问解答
为什么used_memory_peak会大于used_memory_rss?
要搞懂这个问题,得先明确两个指标的本质:
used_memory_rss:操作系统视角下Redis进程实际占用的物理内存(驻留集大小),包含Redis的逻辑内存、内存碎片、进程本身开销等。used_memory_peak:Redis自启动以来,内部统计的逻辑内存使用峰值——也就是它分配给键值对、内部数据结构的内存最大值。
出现used_memory_peak > used_memory_rss的常见场景:
- 内部内存碎片整理:Redis默认不会主动把空闲内存还给操作系统,但会在内部整理内存碎片(比如4.0版本后的主动碎片整理功能)。当碎片被压缩后,Redis的逻辑内存占用下降,操作系统的RSS会因为碎片减少、Redis复用内部空闲块而降低,但
used_memory_peak仍记录着之前的内存高点,就会出现峰值大于当前RSS的情况。 - 数据淘汰或过期:如果Redis曾存储大量数据,达到过
used_memory_peak,之后数据因过期自动删除、或触发内存淘汰策略(如LRU)被清理,Redis的逻辑内存占用下降。虽然Redis不会主动释放内存给OS,但如果操作系统在内存紧张时回收了部分闲置的内存页(比如Redis中未被使用的内存块对应的物理页),就会导致RSS降低,而峰值保持不变。 - 内存交换(Swap):当服务器物理内存不足时,操作系统会把Redis的部分内存页交换到磁盘。此时Redis的物理内存占用(RSS)会下降,但
used_memory_peak还是记录着之前的内存峰值,从而出现前者小于后者的情况。
maxmemory的具体含义
maxmemory是Redis配置中设定的逻辑内存使用上限,它针对的是Redis内部统计的used_memory(即存储键值对、内部数据结构的内存,不包含进程开销、内存碎片等)。
当Redis的逻辑内存占用达到maxmemory时,会触发提前配置的内存淘汰策略(由maxmemory-policy参数指定),Redis会按照策略自动删除部分键值对,将内存占用控制在阈值以内。如果未配置淘汰策略,Redis会拒绝所有新的写请求(读请求不受影响),直到内存占用降到maxmemory以下。
需要注意的是,maxmemory的设置不直接限制used_memory_rss的大小,因为RSS包含了内存碎片、操作系统页缓存等额外开销,所以即使逻辑内存低于maxmemory,RSS仍可能超过这个值。
内容的提问来源于stack exchange,提问作者Jin Lim
相关产品推荐
相关产品推荐

