Chinaunix首页 | 论坛 | 博客
  • 博客访问: 304747
  • 博文数量: 33
  • 博客积分: 586
  • 博客等级: 中士
  • 技术积分: 494
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-27 14:05
个人简介

衡铁刚 1)2011-2013:Alibaba MySQL DBA 2)2014-至今: Alibaba 数据库PD

文章分类

全部博文(33)

文章存档

2016年(1)

2015年(10)

2013年(5)

2012年(17)

我的朋友

分类: LINUX

2012-10-07 10:59:54

cache把磁盘中的数据缓存到物理内存中,把磁盘的访问变为物理内存访问,被缓存的存储设备为后备设备,cache缓存内存页面(来自于正规文件、块设备文件、内存映射文件的读写),即缓存任何基于页的对象
  • 临时局部原理:如果在第一次访问数据时缓存它,那就极可能在短期内再次被cache命中
写缓存策略
  • nowrite:写到磁盘,同时缓存数据失效,后续读再重新从磁盘读取数据
  • write-through:更新内存缓存,同时更新磁盘文件
  • write-back:写缓存,在缓存中标记成脏,加入脏页链表,然后由回写进程周期性写回磁盘
linux 缓存回收:选择不脏页进行简单替换,如果缓存中没有足够的干净页,将强制进行回写操作
页回收策略
  • LRU:跟踪每个页的访问踪迹,不过不适于许多文件被访问一次就再不被访问的场景
  • LRU/n(2):维护两个链表(活跃链表和非活跃链表),在活跃链表中的页必须在其访问时就处在非活跃链表中,两个链表由伪LRU规则维护(页从尾部加入,从头部移除),两个链表需要维持平衡,互相交换页
cache可以使用扩展inode结构体来支持页IO(局限于文件),使用address_space结构体来管理缓存项和页IO,文件可以有多个虚拟地址(vm_area_struct,可以调用mmap()映射),只能有一份物理内存(address_space,页高速缓存实例),物理内存与虚拟地址之间的映射是由i_mmap字段(优先搜索树,将堆和radix树结合的快速检索树)表示的

检查页是否在cache是通过page_tree字段(radix tree基树,一个二叉树,只要指定文件偏移量,就可以在基树上迅速检索到希望的页)完成的

缓冲区高速缓存在2.4之前与页高速缓存同时存在后统一,目前作为页高速缓存的一部分,缓存磁盘块减少块IO

脏页回写3种情况:
  • 当空闲内存低于一个特定阈值
  • 当脏页在内存中驻留时间超过一个特定的阈值
  • 用户进程调用sync()和fsync()
回写参数可以在/proc/sys/vm中设置或通过sysctl

刷脏线程
  • ?-2.6:bdflush(1个)和kupdates
  • 2.6-2.6.32:pdflush(2-8个),具体数量取决于系统IO负载,与任何任务无关,是面向系统所有磁盘的全局任务,但容易被拥塞的磁盘绊住,采用拥塞回避策略(主动尝试从那些没有拥塞的队列回写),但拥塞现象时常发生
  • 2.6.32-?:flusher每个磁盘一个,磁盘利用更饱和



















阅读(1522) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~