LRU之预读失效和缓存污染

文章讲述了Linux和MySQL的Innodb存储引擎如何通过改进LRU算法来避免预读失效和缓存污染。Linux使用活跃和非活跃LRU链表,而Innodb则有young和old区域。当数据被访问,它们不是立即进入活跃列表,而是需要二次访问或满足时间间隔条件,以保护热点数据不被轻易替换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux虚拟内存管理和mysql缓存buffer pool 采用LRU算法进行页面置换,但是会造成预读师失效和缓存污染问题。

预读失效:因为计算机的局部性原理,每次从内存读入缓冲区都会多读一些,因为这些内存临近的内容很有可能被再次读到。

但是如果这些内容不被使用,预读的作用就消失了,而且会占用热点数据的位置。

传统LRU:

当访问的页在内存里,就直接把该页对应的 LRU 链表节点移动到链表的头部。
当访问的页不在内存里,除了要把该页放入到 LRU 链表的头部,还要淘汰 LRU 链表末尾的页。

预读失效:

要避免预读失效带来影响,最好就是让预读页停留在内存里的时间要尽可能的短,让真正被访问的页才移动到 LRU 链表的头部,从而保证真正被读取的热数据留在内存里的时间尽可能长。

Linux 操作系统和 MySQL Innodb 通过改进传统 LRU 链表来避免预读失效带来的影响,具体的改进分别如下:

Linux 操作系统实现两个了 LRU 链表:活跃 LRU 链表(active_list)和非活跃 LRU 链表(inactive_list);
MySQL 的 Innodb 存储引擎是在一个 LRU 链表上划分来 2 个区域:young 区域 和 old 区域。

Linux中预读的页被放入非活跃链表中,只有当预读的页真正被使用时,才加入活跃链表中

缓存污染:

什么是缓存污染?
虽然 Linux (实现两个 LRU 链表)和 MySQL (划分

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值