内存压缩技术提高计算机系统性能的方法和实现
谭 兰 卢显良
(电子科技大学计算机科学与工程学院四川成都610054)
【摘 要】 随着CPU的运行速度和内存性能之间的差异不断增大,由交换引起的I/O请求所带来的大延迟必然会对系统性能造成相当大的损害。为了提高系统性能,又尽可能的不增加现有系统的成本,本文采用了内存压缩这一技术。内存压缩技术是以块设备驱动程序的形式来实现的。采用块设备驱动程序的原因是无需修改操作系统的源代码,而且模块可以在无需重新启动系统的情况下动态的装载和卸载。通过对内存压缩系统的性能与功能测试,结果表明对不同的程序,运行时间有不同程度的提高。
【关键词】 内存压缩、块设备驱动程序、虚存系统
在过去的十年中,CPU的运行速度和内存性能之间的差异不断增大,因此存储组织结构对整个计算机系统性能的影响变得重要。这个问题在高速缓存(cache)和主存(内存)系统组织上引出了新的矛盾。而且,在存储系统和磁盘技术之间存在着一个更大的不匹配,这个不匹配导致了几个数量级的性能差异。与此同时普通程序对内存的需求却以每年50%-100%的速率增长。随着复杂应用程序和面向对象编程等高级编程技巧的进一步使用,这个增长率还会一直保持下去。因此,通过提高存储系统结构性能,或减少程序对内存的需要为目标的方法,将使计算机系统的性能得到显著的提高。
P.Denning曾经指出过,程序在执行时将呈现出局部性规律,即在一较短时间内,程序的执行仅限于某个部分;相应地,它所访问的存储空间也局限于某个区域。基于局部性原理,一个作业在运行之前,没有必要全部都装入内存,而仅将那些当前要运行的那部分页面或段,先装入内存便可启动运行,其余部分暂时留在磁盘上。程序在运行时,如果它所要访问的页(段)已调入内存,便可继续执行下去,但如果程序所要访问的页(段)尚未调入内存(成为缺页或缺段),此时程序应利用操作系统所提供的请求调页(段)功能,将它们调入内存,以使进程能继续执行下去。这样,便可使一个大的用户程序在较小的内存空间中运行;也可使内存中同时装入更多的进程并发执行。从用户的角度看,该系统所具有的内存容量,将比实际内存容量大得多,人们把这样的存储器称为虚拟存储器,简称虚存。虚存系统带来的好处是极具吸引力的,并且也在不同操作系统上的试验证明了虚存是可以工作的。基于此,虚存已经成为绝大多数现代操作系统中的一个重要组成部件了。
1 内存压缩方法和基本流程
111内存压缩设计方法
在普通的虚存系统中,尽管我们已经在逻辑上扩大了内存容量,然而由交换引起的I/O请求所带来的大延迟(几个数量级)却对系统性能造成了很大的损害。为了提高系统性能,可以增加更多的RAM。但是,这样做的结果必然导致系统成本的增加。在不增加现有系统的成本的前提下,为了尽可能的提高系统性能,
我们采用了内存压缩这一技术。内存压缩技术的主要思想是将要换出的页以压缩的形式,存放在预先分配的内存中;当系统下一次访问该页引起缺页错时,系统从预分配的内存区中到压缩过的该页,将其解压缩后即可以供系统使用。这样,通过避免换出和换入这两个过程对低速硬盘的访问,达到了提高系统整体性能的目的。内存压缩在系统的存储层次中逻辑地加入一层———压缩内存层。系统在该层中以压缩的格式保存需要换出的物理页面,当页面再次被系统引用时,解压缩该压缩页后,即可被系统立即使用。
内存压缩系统由一个可装载的设备驱动程序构成,这一途径很容易在不同的操作系统之间进行移植。采用设备驱动程序还有一个好处就是当压缩内存不能给系统带来什么好处时,可以简单地将其卸载而不需要重新启动系统。内存压缩的系统结构由设备驱动程序,保存缓存压缩过的页的驱动程序内
存,交换设备和普通的内存组成。系统结构如图1所示。
图1内存压缩的系统结构
112内存压缩基本流程
内存压缩系统的基本流程分为以下几步:1、该驱动程序被装载入系统,以一个普通的块设备驱动程序存在于系统中。这个块设备按交换分区的格式格式化,然后作为交换设备加到系统中。基于装载时的参数,分配一定的内核内存。这块内存随后被细分为固定大小的Cell(当前我们的实现是256字节)。这些Cell被链接成一个链表,构成最初的空闲链表。同时,还要初始化一个逻辑页号到物理块的映射表(L PM,Logical to Physi2 cal Mapping)。在映射表中,包含了多个页表项。每个页表项(entry)包含一个first指针和一个last指针,first指针指向该一个压缩页的第一个Cell的起始地址,而last指针指向其最后一个Cell;2、操作系统将一页交换出去,系统将向这个特殊的交换设备发一个写操作;3、设备驱动程序解释这个写操作,然后压缩这个页;4、设备驱动程序将这个压缩过的页拷贝到先前预分配的内存区中;5、进程想访问这个页时,系统会向这个设备驱动程序发读请求,也相当于缺页错;6、驱动程序解释这个对设备的读请求,先在压缩内存中按照某种算法寻所需要的页,若到,则解压缩这个页,并返回给系统;若没到,则会启动I/O操作从磁盘上重新读取
。
解压缩一个压缩页的速度远超过从硬盘中对数据的速度,这样也就减少了应用程序的整个执行时间。内
存压缩算法如图2所示:
字符串长度压缩图2内存压缩算法流程图
81福 建 电 脑 2004年第12期
2 内存压缩的具体实现
内存压缩系统的设备驱动程序大致可以分为3个模块:块设备内存管理模块,压缩模块和块设备驱动程序。211块设备内存管理模块
将压缩内存设备作为一个交换磁盘,根据装载设备时指定的参数或默认设定为这个设备在内核中划分出一定大小的内存区,存储交换出的页,交换出的页以压缩的形式存储在该设备中。为了能有效管理内存,设计了一种管理压缩页的方法———Link -Fit 方法。在这个方法中,每一个逻辑块(即压缩后的块)被存储在一些被称为Cell 的基本分配块中。每个Cell 的大小都是相同的———256字节。这些块不需要一定是连续的,而是通过指针链接在一起构成一个完整的逻辑实体。212压缩模块
压缩模块所采用的压缩算法是当今特别流行的Z iv -Lem 2pel 压缩算法,该算法是基于对原子记号(Token )字符串的完全重复的检测。它利用内存中的数据的规律性,通过从输入数据中一次扫描32位,并且查数值上相近的数据———尤其是,即使一个字的低10位不同,但是高22位相同的重复。因此,
一个字的位模式的部分匹配就得到了。在通读输入数据时,将每种信息写到一个临时的数组中,然后一个单独的处理后操作通过一个快速的打包例程将这些信息打包到输出页中,而不是直接将一个压缩字写到输出中去。输出页是分段的,每一段包含一种数据:标签,字典项,低字节,以及完整的字。213块设备驱动程序
块设备驱动程序基于linux 操作系统,它主要依靠如下几个函数来实现其具体功能:
设备初始化函数:int zipmem
-init (void ):
该函数的功能是向内核注册zipmem 设备,并为zipmem 设备设置必要的值,然后初始化设备。
设备清除函数:
int zipmem -cleanup (void ):
该函数在卸载一个设备时,作一下必要的清除工作,主要是调用相应的函数刷新设备,释放在初始化中身前申请的内存区,然后清除在一些全局数组中保留的关于压缩内存的相关信息。
make -request 函数:
int zipmem -make -request (request -queue -t 3queue ,int rw ,struct buffer -head 3bh ):
该函数是整个设备驱动程序中最重要的函数,设备的读写都是通过这个函数来完成的。
open 和release 函数:
int zipmem -open (struct inode 3inode ,struct file 3filp )int zipmem -release (struct inode 3inode ,struct file 3filp ):
open 和release 函数用于维护使用计数,在添加和减少一个使用计数时,均需要将设备上锁,在成功修改后解锁。3 功能测试和性能测试
在完成系统设计、编码工作以后,对此web 代理服务器进行了测试工作,测试系统是否达到了预期的设
计目标和性能。测试环境如下,硬件环境:Celeron 733,256MBytes 内存,Maxtor 5400RPM 20G 硬盘;软件环境:RedHat Linux 7.2内核版本号为2.4.7-10。311功能测试
首先测试压缩内存块设备作为普通的设备驱动是否能正常工作。测试方法为:1、编译时指定不使用压缩选项。2、将设备装载后,从/proc/devices 中读出为zipmem 设备分配的主设备号,当前读出来的主设备号为254,然后在/dev 目录下用“mkn 2od /dev/zipmem b 2540”命令建立一个设备特殊文件。3、调用mkswap 将zipmem 建立为交换分区,具体的命令为“mkswap /dev/zipmem ”mkswap 使用默认值。4、最后使用“swapon /dev/zipmem ”激活zipmem 设备,使其作为一个活动的交换设备。
测试结果:压缩内存块设备作为交换设备工作正常。312性能测试
使用的测试工具是SPEC 2000CPU benchmark 测试包中的应用程序。在256M 系统中运行top (1)后得到的各应用程序在内存中的驻留大小为表1所示:
表1在一个256M 内存的系统上运行top 得到的程序在内存中的驻留大小整数
浮点数
程序Mbytes 程序Mbytes G zip 180
wupwise 176bzip2179-184apsi
191
G ap
192
测试的程序在内存中具有不同大小的工作集,为测试速度的提升所采用的机器配置如表2所示。在这里,假设平均压缩率为2×。
表2SPEC 2000Benchmark 测试使用的配置程序总内存(MBytes )压缩内存(MBytes )有效内存(MBytes )wupwise 9616112apsi 16048208gzip 64872gap 16032192bzip2641680 对比使用内存压缩和未使用压缩内存的数据,得到的提速结果如图3所示:
图3由SPEC 2000Benchmark 得到的结果
4 结论
本文介绍了内存压缩的基本技术,提出把需要交换到磁盘的页面压缩,并把它们存储在内存中的实现方法。这样,当一个缺页错误发生时只需解压缩该页即可,从而避免了磁盘访问带来的巨大延迟。该技术是以Linux 块设备驱动程序的形式来实现。测试结果表明,对那些在运行过程中对内存需求很高的应用
程序的运行速度有一定的提高。测试数据也表明,对绝大多数应用程序而言,使用大约25%的内存来保存压缩过的页是比较合适的。当然,现在的结果只是针对只有一个大程序单独运行的情况而言,还未考虑当内存中有多个大程序同时运行的情况。此外,当前的系统还缺乏针对不同的应用程序行为自动调整压缩内存大小的机制。这些都需要进一步的研究。
参考文献
[1]Daniel P.Bovet &Marco Cesati.深入理解Linux 内核.中国电力出版社
[2]Alessandro Rubini &Jonathan Corbet Linux.设备驱动程序第二版.中国电力出版社
[3]Paul R.Wilson ,Scott F.Kaplan ,and Yannis Smaragdakis.The case for Compressed Caching in Virtual Memory Systems [4]
R.N.Williams.An Extremely Fast Z iv -Lempel Compression Algorithm.In Data Compression Conference ,April 1991.
9
12004年第12期 福 建 电 脑
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论