数据存储管理技术的更新换代
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据存储管理技术的更新换代
关键词:数据存储
1.引言
在有数据存储能力的电子设备中,从微型的手机到大型的计算机和数据库系统,数据管理的一个关键技术是由替换算法(Replacement Algorithm)来实现的。此类算法概念简单,但其优化和系统实现有各种挑战和困难。1966年,IBM学者比雷迪(L.Belady)[1]发表了LRU(Least Recent Used)替换算法。1968年美国麻省理工学院教授考巴脱(F.J. Corbato,1990年图灵奖获得者)[2]用Clock 近似操作在分时操作系统中的内存管理中实现了LRU算法。在1966年到2009年的四十几年里,计算机学者和系统工程师从理论和实践上对替换算法的更新和改进做了不懈的努力。在过去很长的一段时期里,LRU是存储管理的经典算法。尽管LRU算法有几个致命的缺陷,但由于它具有简单且可操作性强的特点,这个算法及其Clock的近似实现在数据存储系统中广泛使用。这个局面在我们的LIRS替换算法[3]及其近似实现算法Clock-pro[4]发表后,发生了改变。近年来在主要的操作系统和数据库系统中,LIRS和Clock-pro逐步取代了LRU和Clock,更新了这个存储管理的关键技术。
随着CPU计算速度的不断加快和网络技术的更新,数据存储层也在不断加深。在CPU芯片上有L1、L2和L3三层硬件快速缓存(Cache);操作系统将程序的虚拟地址转换为内存的物理地址,这些转换数据也缓存在芯片内的TLB里(Translation Lookaside Buffer);在DRAM内存中有行缓存区(Row Buffer)。除了放置主存数据以外,DRAM还设有I/O数据缓存区(Buffer Cache),磁盘内也有缓存区(DiskCache)。数据中心和互联网上都有各种大大小小的缓存区。
如果数据在某一层缓存区找不到,系统就要到下层去找,这样大大增加了访问的延迟。例如,通过互联网,从美国到欧洲获取一个数据块的延迟,是从自己计算机的L1快速存储器取同样数据块延迟的3亿倍!增加访问数据的延迟也增加了不必要的能源消耗和系统的不稳定因素,所以替换算法的质量在数据密集型计算中起着非常关键的作用。
2.LRU算法及其优缺点
LRU算法是通过一个LRU栈(Stack)将访问的数据自上而下地压进栈里,这样,在栈顶的数据总是最新访问的(Most Recently Used或MRU),而在栈底的数据是最少访问的(LRU)。当访问命中(Hit)时,LRU算法将此数据块移到栈顶;当访问不命中(Miss)时,如果存储区已满,LRU算法将栈底的数据块替换出去,将在另一层存储空间获取的数据块压入栈顶。LRU栈里的每一块数据与栈顶的距离给出了它多久没有被访问的信息(又称为Recency)。
LRU算法的一个基本假设是:一个数据块一旦被访问了,它还会再被访问。这个假设对局部性强的数据是适用的,而且基于这个假设的算法的数据结构简单,实现容易。
但是LRU算法的简单假设导致了它在结构上的三个缺陷。第一,一次性访问的数据和弱局部性的数据,可以长期滞留在LRU栈中,大量的此类数据块的频繁访问还可以“污染”缓存区,将局部性强的数据块替换出去;第二,如果LRU栈的长度是k,一个k+1的数据循环访问是没有任何命中的;第
三,几组访问频率不同的数据块在一起会相互冲突,访问频率高的数据可以被访问频率低的数据替换掉。
为了解决LRU算法的这三个问题,计算机学者和系统工程师从算法和系统实现上入手,做了大量的工作,但是成效不是很大,在很长的时期里,LRU以及Clock都在计算机系统中占有主导的位置。我们在设计替换算法和开发相关系统软件的启始,就设立了两个明确的目标:(1)从根本上解决LRU 的三个问题;(2)保存LRU的所有优点,即合理的假设和简单的数据结构。
3.LIRS算法简介
当一个数据块被两次访问后,在这两个数据块中间的其它非重复访问的数据块的数量,被定义为重新访问距离(Reuse-distance)。一个数据块的重新访问距离的长度可以精确地测量其局部性的强度,即距离越短,局部性越强,反之则局部性就弱。LIRS算法是用重新访问距离来做替换决定的,这样可以从根本上解决LRU的三个问题。但是最大的挑战是如何在有限的空间里快速地测量重新访问距离。我们利用一个大栈和一个小栈来构造LIRS的数据结构,在大栈中,记录有三种数据块:(1)经常被访问的块(重新访问距离短的);(2)刚刚被访问的块(重新访问距离很长的);(3)刚刚被替换出去的。在小栈中只记录刚刚被访问的块。每次访问都对数据块的重新访问距离做测量,使得数据块可以动态地在两个栈中交换位置。从而LIRS算法有效地解决了LRU的三个问题。重新访问距离长的或一次性访问的数据块会很快被替换出去,而局部性强的数据块会保持在大栈中。在循环中,大栈中保存的数据不会被替换掉。在LIRS的算法中,访问频率低的数据被及时替换掉。LIRS算法尽管比LRU算法动态变化得多,但是它的复杂度与LRU一致都是O(1)。详情可参阅文献[3]。
4.Clock-pro和BP-wrapper
好的算法不等于在实际系统上一定有好的效果。为此,我们为LIRS做了一个可以在系统中有效实现[2]的近似算法Clock-pro。该算法大大改进了Clock 算法的单指针简单结构,用三根指针将LIRS 所有关键功能给出有效的近似实现(详见文献[4])。
LIRS算法在系统实现中遇到的另一个挑战是锁竞争(Lock Contention)。替换算法的数据结构是互斥的(Mutual Exclusive),即在数据结构被改动时,它需要一个锁保护。这个锁保护使并发数据访问增加了延迟,这样,整个系统的可伸展性(Scalability)受到了限制。针对这个问题,我们开发了一个系统工具BP-Wrapper,利用批处理(Batch)和预取锁(Profetch),使任何一个替换算法,包括LIRS都可以在系统运行中使竞争带来的延迟降到最小(详见文献[5])。
5.多核处理器中的共享存储器管理
LIRS算法中的一个重要原则就是利用大栈保护局部性强的数据,利用小栈去控制和替换局部性弱的数据。在多核处理器中有一个共享的L3存储器。多线程在访问L3的时候会发生硬件无法控制的冲突。我们在操作系统中,利用页面管理和L3块之间的关系,开发了一个系统软件控制的L3划分系统。这样,操作系统就可以通过划分L3来保护局部性强的线程,控制和限制局部性弱的线程(详见文献[6])。这个在Linux开发的系统上已被英特尔公司正式采用,并广泛在工业应用中推广,几家大的工业生产线(比如,西门子公司的自控装置)用了此系统后,多核处理器的性能得到大大提高。