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