内存分配

Redis进程的内存消耗主要包括:自身内存 + 对象内存 + 缓冲内存 + 内存碎片。
1 自身内存

Redis自身内存消耗非常少,通常used_memory在800KB左右,used_memory_rss在3M左右。Redis的内存消耗主要在于后面三个。(used_memory和used_memory_rss的概念在下面介绍)
2 对象内存

对象内存是Redis内存占用最大的一块,存储着用户的所有数据,还包括慢查询日志等Redis帮我们维护的一些内存数据。
3 缓冲内存

缓冲内存主要包括:客户端缓冲、复制积压缓冲、AOF重写缓冲。
3.1 客户端缓冲

客户端缓冲指的是所有连到Redis服务器的TCP连接的输入缓冲和输出缓冲。

Redis为每个客户端分配了输入缓冲区,用于临时保存客户端发过来的命令,同时Redis服务器会从输入缓冲区中拉取命令执行,输入缓冲区为客户端向服务端发送的命令提供了缓冲的功能。输入缓冲区大小无法控制,每个客户端的输入缓冲区最大空间为1G,如果超出将断开连接。

同样的Redis为每个客户端分配了输出缓冲区,用于临时保存服务端执行的命令结果,同时Redis服务器会从输出缓冲区中拉取结果返回到客户端,输出缓冲区为服务端向客户端返回结果提供了缓冲。

输出缓冲区根据客户端的类型又划分为三种:普通客户端、发布订阅客户端、从客户端(Redis复制的slave客户端)。每种客户端的输出规则也不一样,这里就不细说了。
3.2 复制积压缓冲

Redis在2.8版本之后提供了一个可重用的固定大小的缓冲区用于实现增量复制的功能,根据repl-backlog-size参数来控制,默认大小1MB。

对于复制积压缓冲区主节点只有一个,所有从节点共享一个,这个缓冲区可以有效地避免全量复制。
3.3 AOF重写缓冲区

AOF重写缓冲区用于在AOF重写期间保存写命令,所以AOF重写缓冲区的大小取决于AOF的时间以及AOF重写期间的写命令数量。

等到AOF重写完成之后,会将AOF重写缓冲区中的数据写到AOF文件,从而清空AOF重写缓冲区。
4 内存碎片

Redis默认内存分配器采用jemalloc,可选的分配器还有:glibe、tcmalloc。

内存分配器是为了更好的管理和重复利用内存,分配内存策略一般采用固定范围的内存块进行内存分配。

这里不去深究jemalloc的内存分配原理,简单地说jemalloc将内存空间划分为三个部分:Small class、Large class、Huge class,每个部分又划分为很多小的内存块单位:
- Small class: [8byte], [16byte, 32byte, … 128byte], [192byte, 256byte, … 512byte], [768byte, 1024byte, … 3840byte]
- Large class: [4kb, 8kb, 12kb, … 4072kb]
- Huge class: [4mb, 8mb, 12mb …]

简单来说就是采用不同大小的内存块来存储不同大小的内存对象,比如说一个5kb的对象就会存到8kb的内存块中,那么剩下的3kb内存就变成了内存碎片,不能再被分配给其他对象。

通常在对key做频繁更新操作和大量过期key被删除的时候会导致碎片率上升,可以考虑重启节点的方式重新整理碎片。
内存查看

使用 info 命令可以看到当前Redis内存使用情况:

192.168.1.4:0>info memory
"# Memory
used_memory:1938704
used_memory_human:1.85M
used_memory_rss:10444800
used_memory_rss_human:9.96M
used_memory_peak:2948848
used_memory_peak_human:2.81M
used_memory_peak_perc:65.74%
used_memory_overhead:1919050
used_memory_startup:786608
used_memory_dataset:19654
used_memory_dataset_perc:1.71%
total_system_memory:8083607552
total_system_memory_human:7.53G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:4294967296
maxmemory_human:4.00G
maxmemory_policy:noeviction
mem_fragmentation_ratio:5.39
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0
"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

其中:
属性名 属性说明
used_memory Redis内部存储的所有数据占用的内存
used_memory_human used_memory 以M为单位显示
used_memory_rss 操作系统为Redis进程分配的物理内存总量
used_memory_peak 内存使用过的最大值
maxmemory 给Redis分配的内存上限
total_system_memory 系统内存
used_memory_lua Lua脚本占用内存大小

需要注意的是其中 used_memory 表示Redis内部存储的所有数据占用的内存,也就是对象内存,而 used_memory_rss 表示操作系统为Redis进程分配的物理内存总量,也就是上面四种内存的总和。

当used_memory < used_memory_rss时,说明used_memory_rss中多余出来的内存没有被用来存储对象。如果两个值的差值很大,说明碎片率很高。

当used_memory > used_memory_rss时,说明操作系统采用了内存交换,把Redis内存交换(swap)到硬盘。内存交换(swap)对于Redis来说是致命的,Redis能保证高性能的一个重要前提就是读写都基于内存。如果操作系统把Redis使用的部分内存交换到硬盘,由于硬盘的读写效率比内存低上百倍,会导致Redis性能急剧下降,特别容易引起Redis阻塞。

今天这篇文章主要介绍了Redis的内存划分以及查看Redis的内存使用情况,后面将带来Redis的内存上限设置以及Redis的回收策略。
---------------------
作者:Lebron_Chen
来源:CSDN
原文:https://blog.csdn.net/Leon_cx/article/details/82597722

Redis的内存分配的更多相关文章

  1. Redis深入学习笔记(六)Redis内存分配

    Redis的高效可以说是轻量级的epoll模型和基于内存的读写共同组成的,关于epoll对于以前的select或者poll的性能优势这里不做介绍,本篇主要介绍领一个重点,Redis的内存分配原理. 获 ...

  2. CentOS的Redis内存分配策略配置

    安装了一主两从节点,启动之后发现有一个警告: 大概是说overcommit_memory设置成了0,在低内存环境下后台保存可能会失败,设置成1重启可解决. 然后,不太懂这个配置的含义,google一把 ...

  3. 8.Redis内存分配

    8.Redis内存分配8.1 内存消耗8.1.1 内存使用统计8.1.2 内存消耗划分8.1.3 子进程内存消耗8.2 内存管理8.2.1 设置内存上限8.2.2 动态调整内存上限8.2.3 内存回收 ...

  4. redis源码解读--内存分配zmalloc

    目录 主要函数 void *zmalloc(size_t size) void *zcalloc(size_t size) void zrealloc(void ptr, size_t size) v ...

  5. redis内存分配管理与集群环境下Session管理

    ##################内存管理############### 1.Redis的内存管理 .与memcache不同,没有实现自己的内存池 .在2..4以前,默认使用标准的内存分配函数(li ...

  6. Memcache 内存分配策略和性能(使用)状态检查

    前言: 一直在使用Memcache,但是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,现在整理出该篇文章,方便自己查阅.本文不涉及安装.操作. ...

  7. 线上redis服务内存异常分析。

    项目中,新增了一个统计功能,用来统计不同手机型号的每天访问pv,看了下redis2.6有个setbit的功能,于是打算尝尝鲜把 redis从2.4更新到了2.6 因为是租了vps.服务器的内存只有4g ...

  8. Redis学习-内存优化

    以下为个人学习Redis的备忘录--内存优化 1.随时查看info memory,了解内存使用状况:127.0.0.1:6379> info memory# Memoryused_memory: ...

  9. RAMCloud:内存云存储的内存分配机制

    现在全闪存阵列已经见怪不怪了,EMC的XtremIO,还有VNX-F(Rockies),IBM FlashSystem.全闪存真正为效率而生,重新定义存储速度.凭借极致性能,高可用性,为您极大提高企业 ...

随机推荐

  1. 【AGC009C】Division into Two

    [AGC009C]Division into Two 题面 洛谷 题解 首先有一个比较显然的\(n^2\)算法: 设\(f_{i,j}\)表示\(A\)序列当前在第\(i\)个,\(B\)序列当前在第 ...

  2. nodejs内存溢出 FATAL ERROR: CALL_AND_RETRY_0 Allocation failed – process out of memory

    spa项目整体迁移转为ssr后,改动之后部署一切还好,就是突然有一天访问人数太多,node进程很容易就挂了自动重启. 最后经过压力测试,考虑到是堆内存溢出的问题,就报错误:FATAL ERROR: C ...

  3. vue自学小demo----前端

    vue学习的小demo,实现简单的页面项目的增删 代码如下 <!DOCTYPE html> <html> <head> <meta charset=" ...

  4. 安装goimports

    当我们执行 go get golang.org/x/tools/cmd/goimports 会报错package golang.org/x/tools/cmd/goimports: unrecogni ...

  5. STL源码剖析 阅读笔记

    结构图:

  6. Xcode一个project多个target

    project添加target https://blog.csdn.net/vbirdbest/article/details/53466009 https://www.cnblogs.com/Bob ...

  7. 【IntelliJ IDEA学习之一】IntelliJ IDEA安装激活、VM参数

    版本:IntelliJIDEA2018.1.4 特点:比eclipse更耗内存 1.下载 官网下载专业版. 2.安装一直下一步即可. 3.配置文件修改 (1)VM参数 进入安装目录,进入bin目录下, ...

  8. PostgreSQL 缓存

    PostgreSQL physical storage和 inter db    值得阅读 数据在物理介质上存储是以page的形式,大小为8K,如下: a tuple或an item是行的同义词 a  ...

  9. SpringBoot 基础(二)

    目录 SpringBoot基础(二) 一.操作数据库 1. SpringBootJdbc 2. SpringBoot 整合 Mybatis 3. SpringBott 使用JPA 二.使用 Thyme ...

  10. 【转载】ZYNQ Cache问题的解决方法

    Zynq Cache问题的解决方法 - Kevin_HeYongyuan - 博客园https://www.cnblogs.com/kevin-heyongyuan/articles/7738552. ...