Linux内核的文件预读详细解析
Linux文件预读算法磁盘I/O性能的发展远远滞后于CPU和内存,因而成为现代计算机系统的一个主要瓶颈.预读可以有效的减少磁盘的寻道次数和应用程序的I/O等待时间,是改进磁盘读I/O性能的重要优化手段之一.本文作者是中国科学技术大学自动化系的博士生,他在1998年开始学习Linux,为了优化服务器的性能,他开始尝试改进Linux kernel,并最终重写了内核的文件预读部分,这些改进被收录到Linux Kernel 2.6.23及其后续版本中. 从寄存器、L1/L2高速缓存、内存、闪存,到磁盘/光盘/磁带/存储网络,计算机的各级存储器硬件组成了一个金字塔结构.越是底层存储容量越大.然而访问速度也越慢,具体表现为更小的带宽和更大的延迟.因而这很自然的便成为一个金字塔形的逐层缓存结构.由此产生了三类基本的缓存管理和优化问题: ◆预取(prefetching)算法,从慢速存储中加载数据到缓存; ◆替换(replacement)算法,从缓存中丢弃无用数据; ◆写回(writeback)算法,把脏数据从缓存中保存到慢速存储. 其中的预取算法,在磁盘这一层次尤为重要.磁盘的机械臂 旋转盘片的数据定位与读取方式,决定了它最突出的性能特点:擅长顺序读写,不善于随机I/O,I/O延迟非常大.由此而产生了两个方面的预读需求. 来自磁盘的需求 简单的说,磁盘的一个典型I/O操作由两个阶段组成: 1.数据定位 平均定位时间主要由两部分组成:平均寻道时间和平均转动延迟.寻道时间的典型值是4.6ms.转动延迟则取决于磁盘的转速:普通7200RPM桌面硬盘的转动延迟是4.2ms,而高端10000RPM的是3ms.这些数字多年来一直徘徊不前,大概今后也无法有大的改善了.在下文中,我们不妨使用 8ms作为典型定位时间. 2.数据传输 持续传输率主要取决于盘片的转速(线速度)和存储密度,最新的典型值为80MB/s.虽然磁盘转速难以提高,但是存储密度却在逐年改善.巨磁阻、垂直磁记录等一系列新技术的采用,不但大大提高了磁盘容量,也同时带来了更高的持续传输率. 显然,I/O的粒度越大,传输时间在总时间中的比重就会越大,因而磁盘利用率和吞吐量就会越大.简单的估算结果如表1所示.如果进行大量4KB的随机I/O,那么磁盘在99%以上的时间内都在忙着定位,单个磁盘的吞吐量不到500KB/s.但是当I/O大小达到1MB的时候,吞吐量可接近50MB /s.由此可见,采用更大的I/O粒度,可以把磁盘的利用效率和吞吐量提高整整100倍.因而尽一切可能避免小尺寸I/O,这正是预读算法所要做的. 拥有帝国一切,皆有可能。欢迎访问phome.net
来自程序的需求 应用程序处理数据的一个典型流程是这样的:while(!done) { read(); compute(); }.假设这个循环要重复5次,总共处理5批数据,则程序运行的时序图可能如图1所示.
不难看出,磁盘和CPU是在交替忙碌:当进行磁盘I/O的时候,CPU在等待;当CPU在计算和处理数据时,磁盘是空闲的.那么是不是可以让两者流水线作业,以便加快程序的执行速度?预读可以帮助达成这一目标.基本的方法是,当CPU开始处理第1批数据的时候,由内核的预读机制预加载下一批数据.这时候的预读是在后台异步进行的,如图2所示.
注意,在这里我们并没有改变应用程序的行为:程序的下一个读请求仍然是在处理完当前的数据之后才发出的.只是这时候的被请求的数据可能已经在内核缓存中了,无须等待,直接就能复制过来用.在这里,异步预读的功能是对上层应用程序“隐藏”磁盘I/O的大延迟.虽然延迟事实上仍然存在,但是应用程序看不到了,因而运行的更流畅. 预读的概念 预取算法的涵义和应用非 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |