使用ZSWAP改善低内存电脑的性能
我们都知道,当电脑物理内存不够操作系统使用时,操作系统会把部分物理内存的内容临时写入磁盘中,在物理内存足够后再从磁盘读回物理内存,这个过程叫做SWAP。 然而由于磁盘的写入/读取速度要远远慢于内存的读写速度,因此SWAP的过程会严重拖慢电脑性能。 当电脑内存足够,SWAP交换数据较少的时候还没什么,但若电脑内存不足引起大量SWAP,那电脑性能将会受到严重的影响,这时你会发现你的磁盘在不断地转动。
缓解SWAP的问题有两个方法,一个方法是想办法提高读写磁盘的速率,比如将机械硬盘换成SSD盘。 另一个方法就是想办法降低SWAP发生的概率。
Linux kernel自3.11开始引入了zswap的功能,它能够将原本要交换到磁盘上的内存压缩,放到内存的一个内存池中,从而减少发生SWAP的概率。
启用zswap
临时启用zswap
临时启用zswap很简单,只需要
sudo echo 1|tee /sys/module/zswap/parameters/enabled
永久启用zswap
若想每次重启都自动启用zswap,则可以修改启动时的内核参数,添加上 zswap.enabled=1
- 编辑
/etc/default/grub
,在GRUB_CMDLINE_LINUX_DEFAULT
后加上zswap.enabled=1
- 运行
grub-mkconfig -o /boot/grub/grub.cfg
重新生成GRUB配置文件 - 重启电脑
在archlinux上,我们还可以通过 systemd-swap
来帮我们开启zswap
sudo pacman -S systemd-swap --noconfirm sudo systemctl enable systemd-swap sudo systemctl start systemd-swap
配置zswap
zswap有下面几个配置参数:
grep -R . /sys/module/zswap/parameters/
/sys/module/zswap/parameters/enabled:Y /sys/module/zswap/parameters/max_pool_percent:25 /sys/module/zswap/parameters/compressor:lz4 /sys/module/zswap/parameters/zpool:zbud
其中:
- zwap.enabled: 表示是否启用zswap功能
- zswap.compressor: 表示用来压缩内存的算法,可以是lzo、lz4、lz4hc、deflate
- zswap.max_pool_percent: 用来表示存放压缩内存的内存池的最大值,内存池本身并不是预先分配好的,而是根据需要慢慢增加,但最大不超过这个限定值
- zswap.zpool: 内存池的管理算法,可以是zbud或z3fold,其中z3fold要比zbud有更好的压缩率
你可以手工将上面这些参数加入到启动的内核参数中,比如 zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=20 zswap.zpool=z3fold
若是通过 systemd.swap
来管理交换区的,则可以通过修改 /etc/systemd/swap.conf
来进行配置
grep -i zswap /etc/systemd/swap.conf
# Zswap # Zswap create compress cache between swap and memory for reduce IO # https://www.kernel.org/doc/Documentation/vm/zswap.txt zswap_enabled=1 zswap_compressor=lz4 # lzo lz4 zswap_max_pool_percent=25 # 1-99 zswap_zpool=zbud # zbud z3fold