CSDN首页>

创新的Linux zswap压缩功能

发表于2013-03-21 10:46| 来源未知| 作者张帅

摘要:本篇文章,向您介绍一些针对Linux社区上Linux系统中的内存压缩技术。一种新提交的构架,称为“zswap”,一些初步的性能数据显示出对系统的潜在优势(分区或者guest), 约束内存交换内存页面到硬盘。此技术改进了整个系统的能力,大幅降低硬盘通常跟页面交换相关的I/O活动。我们也研究了zswap如何与PO...

 本篇文章,向您介绍一些针对Linux社区上Linux系统中的内存压缩技术。一种新提交的构架,称为“zswap,一些初步的性能数据显示出对系统的潜在优势(分区或者guest, 约束内存交换内存页面到硬盘。此技术改进了整个系统的能力,大幅降低硬盘通常跟页面交换相关的I/O活动。我们也研究了zswap如何与POWER7+处理器的新压缩加速器结合以提升系统整体能力,远远超过单独使用软件压缩。

这篇文章是一个正在进行的发生在Linux开源社区上的合作的最佳范例。新的部署被众多开发者,社区成员,感兴趣的客户和高性能团队设想,讨论,辩论,优化和升级。在PowerLinux科技社区,在Linux社区里我们致力于突显更多这样合作的例子。这些设想对x86系统和Power系统都可行,所以下面的案例均包括这两个系统。

什么是zswap

Zswap是一种新的轻量化后端构架,将进程中正交换出的页面压缩,并存储在一个基于RAM的内存缓冲池中。除一些为低内存环境预留的一小部分外,zswap缓冲池不预先分配,按需增加,最大尺寸可用户自定义。Zswap启动存在于主线程中的一个前端,称为frontswapzswap/frontswap进程在页面真正交换出之前监听正常交换路径,所以现有的交换页面选择机理不变。Zswap也引入重要功能,当zswap缓冲池满时自动驱除页面从zswap缓冲池到swap设备。防止陈旧页面填满缓冲池。

关于Linux内核通信列表(lkml)的zswap补丁已经提交审查,您可以在this post看到它们。

关于在Fedora17上安装建立具备zswap的内核的系统的介绍请见this wiki

有什么优势?

当页面被压缩并存储在基于RAM的内存池而不是真正交换到交换设备时,导致显著的I/O下降和一些情况下大幅提高工作量性能。当页面被交换回来是也一样 相比真正从交换设备取回页面,从内存zswap缓冲池中取回所需页面并解压缩,导致性能提升和I/O下降。

Performance Results

性能结果

使用SPECjbb2005工作量作为工程测试,我们收集了一些性能数据显示zswap的优势。SPECjbb2005使用Java度量标准评估服务器性能和计算整个度量,称为“bops” business operations per second每秒业务操作量)。要找更多关于评估度量标准或者最新的官方结果,请看SPEC web site。特别指出上述结果并未针对性能优化而调优,不能视为系统的官方评定度量标准结果,但是至少结果包含了研究目的。我们倾向于这种用途的度量标准因为我们更小心控制用于增量的活动内存的数量。

评估方法

SPECjbb2005工作量增加指定数量的数据仓库,或者运行时存储数据的单元数。数据仓库的数量是用户可控的设置,根据JVM可用线程数量来配置。当度量标准在运行全程中增加数据仓库的数量时,系统利用水平也增加。Bops分数汇报给每个运行的数据仓库。为此,我们关注数据仓库的bops分数,保持系统50%利用率。我们也增加每个数据仓库从交换开始的缺省运行时间到5分钟,突发性和更长的运行时间有助于得到更一致的结果。

结果中,系统被分配两种成绩,10GB内存和20GB交换设备。单一JVM用于SPECjbb2005运行,使用IBM Java。首先,当交换活动发生时基线测量开启,然后激活zswap运行测量以显示zswap的优势。我们同时收集Power7+和一个x86系统上的结果来观察不同体系结构上的性能影响。Sysstat包中的mpstat,vmstatiostat分析工具用于记录CPU使用率,内存使用率和I/O统计。我们推荐利用lpcpu包收集这些数据点。

演示交换和压缩的性能效果,我们从与可用内存量相等的JVM堆尺寸开始,然后增加JVM堆尺寸的增量直到我们完全超过闲置内存的数量,强迫交换(压缩与否都行)发生。我们记录整个参数和每个数据点的交换率来测量工作量需要更多页面时的影响。

设置zswap

当前配置,zswap被这个内核启动参数激活

zswap.enabled=1

压缩度量

我们查看了一些新的核内状态来决定运行时压缩的特点。度量如下使用:

zswap:

 /sys/kernel/debug/zswap

pool_pages - number pages backing the compressed memory pool

reject_compress_poor - reject pages due to poor compression policy (cumulative) (see max_compressed_page_sizesysfs attribute)

reject_zsmalloc_fail - rejected pages due to zsmalloc failure (cumulative)

reject_kmemcache_fail - rejected pages due to kmem failure (cumulative)

reject_tmppage_fail - rejected pages due to tmppage failure (cumulative)

reject_flush_attempted - reject flush attempted (cumulative)

reject_flush_fail - reject flush failed (cumulative)

stored_pages - number of compressed pages stored in zswap

outstanding_flushes - the number of pages queued to be written back

flushed_pages - the number of pages written back from zswap to the swap device (cumulative)

saved_by_flush - the number of stores that succeeded after an initial failure due to reclaim by flushing pages to the swap device

pool_limit_hit - the zswap pool limit has been reached 

有两个用户定义的zswap属性:

/sys/modules/zswap/parameters

max_pool_percent - the maximum percentage of memory that the compressed pool can occupy

max_compressed_page_size - the maximum size of an acceptable compressed page. Any pages that do not compress to be less than or equal to this size will be rejected (i.e. sent to the actual swap device)

frontswap:

/sys/kernel/debug/frontswap

failed_stores - how many store attempts have failed (cumulative)

loads - how many loads were attempted (all should succeed) (cumulative)

succ_stores - how many store attempts have succeeded (cumulative)

invalidates - how many invalidates were attempted (cumulative)

一旦zswap缓冲池变满,观察性能和交互行为,我们设置max_pool_percent参数为20 – 这意味着zswap可用到10GB内存的20%之多。

基线结果

下列图标代表通常交换模式下SPECjbb2005性能和运行交换率

注意可用内存被用至多达10GB,性能下降非常快(蓝线)并且通常页面交换到硬盘会增加(红线)。此行为在Power7+x86系统上一致。

Power7+ baseline results:

 

x86 baseline results:

 

 

 一旦系统开始交换和当JVM堆增加时, 可以看到性能大幅下降。

Zswap结果

下列图表代表当zswap激活后一次运行SPECjbb2005的性能和交换率。这个案例中,内存现在被压缩,大幅降低交换页面到硬盘的次数。工作量的性能(蓝线)还是下降但不是很陡,但更重要的是系统I/O负荷下降很快。

Power7+ with zswap compression:

 

x86 with zswap compression:

 

 可见,(I/O)交换率大幅降低。这因为,当页面重新需要调用时,更多的页面被压缩存储于zswap缓冲池而不是交换到硬盘。少量的真实交换因为一些页面压缩不良而发生 意味着它们不符合客户定义的最大压缩页面尺寸- 因此交换出到硬盘,或者陈旧页面被驱除出zswap缓冲池。

查看每次运行的zswap度量标准,我们从这些运行中计算出一些感兴趣的统计值 注意基础页面尺寸是不同的,Power64K页面)而x86 (4K页面),导致一些不同的行为。如上所述,我们设置最大zswap缓冲池(max zswap pool size)为全部内存的20% - 最大值设定可按需调整。在Power系统中,平均zswap压缩率为4.3。在x86上,平均zswap压缩率为3.6Power系统运行中,看到"pool_limit_hit"的入门门限从17GB数据点开始。x86运行时,pool limit门限来得更早 开始于15.5GB数据点。Power运行时,zswap缓冲池最多存储139,759个页面。x86上,页面存储最大数量是1,914,720。这意味着这些页面被压缩存储在zswap缓冲池中,而不是被交换到硬盘,导致明显可见的性能提升。

POWER7+硬件加速

POWER7+处理器引入新的板载硬件辅助加速器,提供内存压缩和解压缩功能,能提供相对于软件压缩显著的性能优势。例如,IBM Flex System p260 and p460 Compute Nodes系统规范可见这里 提到处理器的内存扩展加速特性。

目前,当硬件加速器存在时,zswap的设计能利用它们,包括软件或者硬件压缩。当用户激活zswap和硬件加速,zswap直接把要压缩或者解压缩的页面交给加速器而不是用软件执行这项工作。这里我们展示启动POWER7+板载内存压缩加速器的性能优势。

POWER7+硬件压缩结果

因为硬件加速器提升压缩效率,观察zswap度量标准我们发现在给定之间内有更多存储和加载需求,比软件压缩运行时,zswap缓冲池更快被填满。因为这种行为,硬件压缩运行时,我们设置max_pool_percent参数为30 – 意味着zswap可以用高达全部10GB内存的30%

下列图表展示,当zswapPOWER7+硬件加速器激活时,单次SPECjbb2005运行的性能和交换率。这个案例中,内存用硬件压缩而不是软件,这导致明显的性能提升。工作量的性能(蓝线)仍然下降,但是比zswap软件压缩案例下降斜度缓慢。系统I/O负荷也很满。

Power7+ hardware compression:

 

 

 可看出,(I/O)交换率大幅降低。这是由于大多数页面使用硬件加速器压缩,并存储于zswap缓冲池而不是交换到硬盘,当重新需要调用时,从zswap缓冲池取出,用硬件加速器解压缩,而不是从硬盘交换回内存。少量的真实交换也会发生,因为一些页面压缩不良 意味着它们不满足用户定义的最大压缩页面尺寸 因此被交换出到硬盘,或者陈旧页面被驱除出zswap缓冲池。

性能对比

下图显示普通交换和zswap压缩的性能对比,POWER7+图表也包括了硬件压缩结果,展示硬件加速器提供超越软件单独压缩的更大性能优势:

Power7+ performance comparison:

 

x86 performance comparison:

 

 

如图所示,zswap激活时,在堆尺寸超出可用内存时,工作量显示高达40%的性难提升,POWER7+结果显示硬件加速器可以提升相对基础性能高达60%

I/O)交换对比

下图展示普通交换和zswap交换间的不同交换率,POWER7+图表包括硬件加速结果,展示硬件加速器也大幅降低交换率。Zswap激活时,两种架构的交换率都大幅降低,包含POWER7+硬件加速结果

Power7+ swap I/O comparison:

 

x86 swap I/O comparison:

 

总结

新的zswap的实现可以提升性能同时降低I/O交换,可对共享相同I/O总线的其他部分有正向影响。新的POWER7+板载内存压缩加速器可以提供性能提升同时保持很低的I/O交换。

  • CSDN官方微信
  • 扫描二维码,向CSDN吐槽
  • 微信号:CSDNnews
程序员移动端订阅下载

微博关注

相关热门文章