这篇文章主要讲的是磁盘的I/O调度算法,在系统虚拟化之后,面临的挑战。
那么,据我发现,关于虚拟机两层磁盘I/O调度的文章,目前我发现了2篇,但是都局限在一些好会的Workshop上,一个是本文要介绍的,发表在ASPLOS 2010的WIOV 2010上的,另外一篇是SOSP 2009的HotStroage 2009 上的Does Virtualization Make Disk Scheduling Passé? (这篇文章好像还获得了这个workshop上的best paper)。
下面,我解释一下它的idea:
传统的磁盘I/O调度算法,主要是根据底层的磁盘自身的延迟特征,而量身定做的。例如:对于旋转磁盘,磁盘I/O调度算法主要是为了优化磁头的旋转距离,方向而对一些读写请求进行合并操作;而对于闪盘(flash disk)而言,磁盘I/O调度算法主要作用就是优化开销非常大的随机写的I/O请求。
在虚拟化系统当中,会存在两层磁盘I/O调度,一层在GuestOS里,也就是虚拟块设备之上,会经历一层(VM-Level)。第二层,在VMM,也就是真实的物理磁盘之上,还会经历一层I/O调度算法(VMM-Level)。
那么,在虚拟化环境下,在VM里面运行的用户进程,除了可以感觉的到底层的物理磁盘的延迟特征外,还会感觉到因为引入虚拟化而带来的额外的排队和处理等相关的延迟(在VMM这一层,因为可能存在同时有个多个VM进行相关的disk I/O 操作,而出现一些具体VM与VM之间谁被调度的问题,这个和CPU调度有关)。
因此,由于虚拟化延迟的出现(该特征呈随机性),对传统的磁盘I/O调度算法就带了挑战。
本文,作者尝试回答一个问题,“虚拟化环境下,我们应该在最接近进程的地方,去对来自于这些进程的读写请求,进行磁盘I/O调度吗?”(VM-level)
作者首先做了个实验,来论证,这个虚拟化的延迟确实是存在的,并且有随机特征,这里额外的延迟很大一部分,是由其他虚拟机内部的workload来决定的(见下图,该图反映的是某个样本虚拟机内部的读写请求的服务延迟,波动的非常厉害)
然后呢,作者为了让传统的I/O调度算法能够适用于这种随机的环境,对CFQ和AS进行了一个试探性的修改。修改的核心就是让CFQ和AS能够自适应这种随机性的延迟变化,并且呢,尝试了在VM-Level和VMM-LEVEL不同的I/O调度算法的组合。
初步的结论,就是:自适应的AS可以带来性能上和隔离性的提高,但是自适应的CFQ则没有在VM之间的公平性上表现的非常好。
最后,文章的作者也号召大家义无反顾并且轰轰烈烈的投身到设计虚拟化磁盘I/O调度算法的工作中去。