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 (划分