Linux、MySQL和Redis内存管理评估
2023-07-05 09:31:54 0 举报
AI智能生成
linux mysql redis内存管理横评(详解在注释里面,图片加载需要时间)
作者其他创作
大纲/内容
Linux
内存分配方式
分段
分段机制会把程序的虚拟地址分成 4 个段<br>
好处
能产生连续的内存空间
回收方式:内存交换
不足之处<br>
内存碎片<br>
内存交换的效率低<br>
分页
怎么解决分段的内存碎片、内存交换效率低的问题?<br>
如果内存空间不够:<b>LRU</b>
虚拟地址和物理地址是如何映射的?
举例<br>
多级页表<br>
二级页表空间分析
局部性原理<br>
不分级为何无法节省内存<br>
页表缓存TLB(Translation Lookaside Buffer)<br>
三种回收方式<br>
1、回收内核中的缓存<br>
2、swap 机制<br>
3、触发 OOM(Out Of Memory) 机制<br>
swap机制原理<br>
哪些进程的内存交换到硬盘中?<br>
<b><font color="#f44336">匿名内存页(数据段、堆段 和 栈段)</font></b>
LRU 内存淘汰算法<br>
主要构成
active_list<br>
inactive_list<br>
PG_referenced标志位<br>
流程<br>
申请一个匿名内存页<br>
匿名内存页被进程访问<br>
内存淘汰过程<br>
活跃链表 的内存页也有衰退的过程<br>
mysql
Buffer Pool的管理<br>
Buffer Pool的初始化<br>
申请空间<br>
划分空间<br>
3种页
1、free page<br>
2、clean page<br>
3、dirty page<br>
针对这3种页,InnoDB使用3种链表维护<br>
free list<br>
意义<br>
误区说明<br>
flush list<br>
lru list<br>
链表中的节点不是缓存页本身,而是页对应的控制块<br>
Buffer Pool缓存淘汰
使用LRU会遇到的问题<br>
预读<br>
大量数据涌入<br>
解决方法<br>
冷热分离LRU
优化点1:midpoint<br>
优化点2:old_blocks_time<br>
优化点3:减少热页在链表移动<br>
脏页刷盘<br>
1、从LRU 链表的冷数据区刷新部分页面到磁盘<br>
2、从 flush 链表中刷新一部分页面到磁盘<br>
3、主动刷盘内存池中被淘汰的脏页<br>
redis
内存模型<br>
内存统计
info memory
Redis内存划分<br>
对象内存<br>
进程本身运行内存<br>
缓冲内存<br>
内存回收<br>
<b><font color="#f44336">定期删除+惰性删除</font></b>
定时删除
惰性删除<br>
内存淘汰机制<br>
noeviction(默认)<br>
allkeys-random
allkeys-lru<br>
allkeys-lfu
volatile-random
volatile-lru<br>
volatile-lfu<br>
volatile-ttl<br>
lru - 最近最少使用<br>
传统lru
问题
维护前后指针及哈希表,空间消耗大
redis lur - 近似lru
增加<b>24bit</b>长度时间属性
随机取5个,淘汰最晚时间的那个<br>
lru存在问题<br>
lfu - 最近最不经常使用
目的:淘汰内存中<b><font color="#f44336">不经常使用</font></b>的数据
字段
time
counter<br>
增长<br>
衰减<br>
工作过程<br>
0 条评论
下一页