基于IO行为的page cache预取策略研究与设计文献综述
2020-04-26 11:51:23
目的及意义:
计算机系统中最严重的不平衡来自CPU与I/O之间持续扩大的性能差距。磁盘传输带宽的改善速度跟不上CPU计算能力的增长,数据访问延迟的改善更是严重地滞后。
在Linux中,文件Cache分为两层,一是Buffer Cache,另一个就是Page Cache。每一个Page Cache包含若干Buffer Cache。内存管理系统和VFS只与Page Cache交互,内存管理系统负责维护每项Page Cache的分配和回收,同时在使用memory map方式访问是负责建立映射;VFS负责Page Cache与用户空间的数据交换。而具体文件系统则一般只与BufferCache交互,它们负责在外围存储设备和BufferCache之间交换数据。读缓存以PageCache为单位,每次读取若干个PageCache,回写磁盘以BufferCache为单位,每次回写若干个BufferCache。
对于系统的所有文件I/O请求,操作系统都是通过Page Cache机制实现的,对于操作系统而言,磁盘文件都是由一系列的数据块顺序组成,数据块的大小随系统不同而不同,x86linux系统下是4KB(一个标准页面大小)。内核在处理文件I/O请求时,首先到Page Cache中查找(Page Cache中的每一个数据块都设置了文件以及偏移信息),如果未命中,则启动磁盘I/O,将磁盘文件中的数据块加载到Page Cache中的一个空闲块。之后再copy到用户缓冲区中。
因此,Cache不命中意味着需要执行磁盘访问,从而增加整个系统的I/O开销。在Android系统中,用户体验最重要的是前台正在显示应用的流畅性。如果有过多的I/O请求,导致了前台应用的I/O请求得不到及时执行。用户就会感到卡顿,体验变差,所以需要高效利用PageCache 空间,以优化I/O访问开销。
为了对PageCache进行I/O优化,可以对Page Cache采用预取策略,以提高Page Cache中I/O请求的命中率,减少I/Olatency。现在手机端的需求,需要感知pagecache优化前台进程I/O请求(以及所依赖的后台进程I/O),需要感知并决策痛点应用各场景下I/O数据的预取行为及是否需要cache,需要减少I/O数据量与内存消耗、需要提升page cache利用率,从而提高前台进程的处理速度,优化用户体验。
但是,现有方法无法获取前后台进程I/O的关联;不能够动态适应不同场景下I/O访问行为,从而造成不准确的预取行为,反而加重I/O访问量,降低系统性能。基于此,我们提出通过对典型应用的历史I/O行为进行分析,挖掘出数据访问的内在关联性,提高pagecache的预取准确率,从而提升移动设备整体的响应速度,达到良好的用户体验。
国内外研究现状:
Linux的预读架构研究现状:
Nbaloverme[16]中有提到现有的Linux预读架构:Linux内核的一大特色就是支持最多的文件系统,并拥有一个虚拟文件系统(VFS)层。早在2002年,也就是2.5内核的开发过程 中,AndrewMorton在VFS层引入了文件预读的基本框架,以统一支持各个文件系统。Linux内核会将它最近访问过的文件页面缓存在内存中一段时间, 这个文件缓存被称为page cache。如图1. 1所示。一般的read()操作发生在应用程序提供的缓冲区与page cache之间。而预读算法则负责填充 这个page cache。应用程序的读缓存一般都比较小,比如文件拷贝命令cp的读写粒度就是4KB;内核的预读算法则会以它认为更合适的大小进行预读I/O,比比如16-128KB。