Linux下使用zram(压缩内存)

2068 查看

Compressed memory

Mac OS X Mavericks增加了一个新特性——压缩内存。WWDC 2013上特别介绍了这个特性。

懒得写压缩内存的说明,抄一段TualatriX的博客吧:

我先来简单介绍下什么是「Compressed Memory」。

Active memory:活跃的内存,比方可以说是开个5个App,每个占用了100M,那么就有500M活跃内存;

Inactive memory:非活跃的内存,比如关掉了三个App,那么这三个App占用的共300M内存就不再是活跃了,但是内核还会保留它。如果这时立马再启动这三个App,就会以非常快的速度打开了,因为还没有被其他App占用的Inactive memory这时又被激活了。如果很长一段时间内这些非活跃内存都没有再用的话,随着系统内存占用增加,这些非活跃内存也会被清空而用做新的用途。

那么Compressed Memory在其中扮演什么角色呢?很简单,它尽可能久的保留那些会用到的非活跃内存,以使系统更快的响应潜在的第二次响应。但是为了照顾新的内存需求,内核会压缩这些非活跃内存以腾出空间,以供新的App使用。

大概就是这么个过程,一般我们会觉得「压缩」而联想到这项技术省了内存,实际上Compressed Memory的核心价值在于是它加快了整个系统的响应速度。

当然,压缩和解压缩需要消耗一点CPU,但是现在的电脑,大多数情况下,瓶颈在内存而不是CPU。

zram

WWDC不会告诉你的是,相似的特性Linux下早有了,叫zram,2009年的时候就进了kernel的staging。现在大部分发行版应该都支持了。Google的Chrome OS默认开启。

启用很简单,Ubuntu(Precise以上版本),直接sudo apt-get install zram-config就行。zram-config会自动搞定一切。

其他系统的话,在/etc/rc.local里加入:

sh# 加载zram模块
modprobe zram &&
# 分配部分内存作zram,大小建议为总内存的10%-25%,这里分配了512M.
echo $((512*1024*1024)) > /sys/block/zram0/disksize &&
# 启用zram设备为swap。zram的原理就是分出一块内存当swap分区用,其中的数据是压缩的,这样速度快,而且占用空间小。
mkswap /dev/zram0 &&
# 给zram设备分配一个高优先级,否则要是放着zram不用,去用硬盘上的swap分区就欲哭无泪了
swapon -p 10 /dev/zram0 &&
# rc.local要求最后返回0
exit 0

这样就可以了。

Debian 可以手动加启动文件

zswap & zcache

内核比较新的童鞋还可以尝试下zswap和zcache,是类似zram的技术。关于三者的比较可以看lwn.net的文章

简单来说,zcache 好像后来移出 kernel 的 staging 了。zswap 最大压缩率只能到 50 % 而 zram 比 zswap 压缩率更高,代价是 page reclaim 更困难。