标签:重要 copy wap 服务器 启动 读取 缓冲区 问题 部分
*博客搬家:初版发布于 2017/08/12 18:32 原博客地址:https://my.oschina.net/sunqinwen/blog/1507171
注:本文默认读者已初步学会使用redis了。
首先我们通过info命令查看相关指标,其中几个memory的重要指标整理出来如下:
属性 | 解释 |
used_memory | redis内部存储的所有数据的内存总占用量(自身内存+对象内存+缓冲内存) |
used_memory_ress | redis进程占用的总物理内存 |
mem_fragmentation_ratio | used_memory_ress与used_memory的比值,即为内存碎片率 |
mem_allocator | 内存分配器,默认为jemalloc |
(1)碎片率的解释
① 当内存碎片率>1时,说明redis进程占用物理内存的总量大于Redis实际存储数据(表1-1第一行)的内存占用量,溢出来的部分内存被内存碎片消耗,如果溢出部分过大,则说明内存碎片率严重。
② 相反的,如果碎片率<1时,则说明Redis存储的数据总量已经超出了redis进程占用内存的总量,造成这种情况是因为操作系统把Redis内存交换至硬盘导致(swap),由于硬盘读取速度远远慢与内存,因此这种情况下redis性能极差,可能出现僵死。
(2)redis内存消耗的几个来源
① 自身内存:redis启动后自身运行所需内存;
② 对象内存:内存占用最大的一部分,这里面存储的就是用户自身的数据(业务数据),数据以key-value类型存储,内存消耗可表示为:key内存+value内存。
③ 缓冲内存:主要由客户端缓冲区+复制积压缓冲区+AOF缓冲区组成,具体解释如下:
④ 内存碎片:redis默认的内存分配器是jemalloc,可选的还有glibc和tcmalloc;内存分配器为了更好的管理以及重复利用内存,分配策略一般采用固定范围的内存块进行分配;因此,我们在存储一块5kb的内容时,内存分配器可能会为我们分配8kb的块存储,剩下的3kb不能再次分配给其他对象存储,因而沦为了内存碎片;jemalloc对碎片化问题做了优化,一般来讲碎片化率保持在1.03左右。
可能造成内存碎片率过高的场景:
解决办法:
⑤子进程内存消耗:子进程内存消耗指的是执行AOF/RDB重写时redis创建的子进程内存消耗;redis执行fork操作产生的子进程内存占用量对外表现为与父进程相同,理论上需要一倍的物理内存来完成重写的操作。但是linux具备写时复制技术(copy-on-write),父子进程会共享相同的物理内存页,当父进程处理写请求时会对需要修改的页复制出一份副本来完成写操作,而子进程依然读取fork时整个父进程的内存快照,总结:
标签:重要 copy wap 服务器 启动 读取 缓冲区 问题 部分
原文地址:https://www.cnblogs.com/hama1993/p/10331884.html