[Share Experiences] 【经验分享】用 ZRAM 替代 SWAP,榨干内存的每一分价值
Tofloor
poster avatar
Linux大宝
deepin
2023-01-02 07:02
Author

一、起因

鄙人的电脑是微软的 Surface Pro3 平板,已经有 7 年的历史,现在安装了 Kubuntu 20.04.3

没在意是动了哪里,近几天,在打字时总感觉出字不顺畅,延迟比较明显,放音乐时也是断断续续的,于时对 CPU 使用率进行检查,一切正常,又对内存进行检查,发现内存使用率不足50%,但 swap 却了用近80%,当时只是开了钉钉(包括在线文档编辑)、WPS、QQ 和 Audacious 而已,虽说 4G 内存放在这年头的确是小了点,但可用内存还剩这么多, swap 却是如此之高的使用率肯定是让人不爽的。

(可能有人会说“加内存啊”,不好意,在下的 Surface 平板,有加内存的那点功夫还不如直接买新电脑了,但这年头的经济,买不起啊~)

于是对 vm.swappiness 进行修改,反复尝试了两天,发现就算把数值改成 1,甚至最后改成 0,只要一开钉钉、微信和 WPS 三件套,swap 使用率就居高不下,若再开个 Edge,总是一卡一卡的。

来点极端的,sudo swapoff -a && sudo swapon -a,重启 swap,但十几秒后,swap 用量又窜上去了……

之后,又尝试修改了 vm.dirty_ratio、vm.dirty_background_ratio、vm.dirty_expire_centisecs、vm.vfs_cache_pressure 的参数,感觉没啥效果

二、用 ZRAM 替代 SWAP

昨晚躺床上,突然想起以前折腾过一段时间的 zram,用它来替代 swap 行不行呢?

今天一早,测试开始:

1、关闭了 swap,仅使用内存
sudo swapoff -a

只开了钉钉、微信、QQ 、一个终端(本想着若系统卡顿,立即启用 swap)和 Edge,4G内存几乎被占满,但当在打开 WPS 时,随即系统立即卡死,连在终端中开 swap 的机会给没给,只得强行硬重启

2、安装上了 zram,保持关闭 swap,使用默认的 lzo-rle 压缩格式
sudo apt install zram-config

同时开了钉钉、微信、QQ 、WPS 和 Edge, zram 虚拟的 swap 占满、内存使用超过 70%,再打开 VLC 时,虽没卡死,但系统已经明显卡顿

3、依然关闭 swap,把 zram 的压缩格式换为 lz4hc

检查支持的压缩格式

cat /sys/block/zram0/comp_algorithm

支持的压缩格式包括:lzo、lzo-rle、lz4、lz4hc、842、zstd

sudo nano /usr/bin/init-zram-swapping

找到

echo ​mem > /sys/block/zram{DEVNUMBER}/disksize

在其【前】添加一行:

echo "lz4hc" > /sys/block/zram${DEVNUMBER}/comp_algorithm

重启电脑,可以看到压缩效率明显提升,如下图同时开了一堆程序,zram 虚拟的 swap 占满、内存使用接近 65%,此时系统依然流畅

而这种情形,在日常使用时,几乎是不可能做到如此极端的

Reply Favorite View the author
All Replies
jiutian123
deepin
2023-01-02 07:43
#1

nsz@nsz-PC:~$ sudo apt search zram
正在排序... 完成
全文搜索... 完成
libblockdev-kbd2/未知 2.26-1 amd64
kernel block device plugin for libblockdev

udisks2-zram/未知 2.9.4-1 amd64
zram support for udisks2

udisks2-zram-dbgsym/未知 2.9.4-1 amd64
debug symbols for udisks2-zram

zram-tools/未知,未知 0.3.3.1-1 all
utilities for working with zram

安装哪个呢?

Reply View the author
SamLukeYes
deepin
2023-01-02 07:48
#2

swappiness 调太低相当于把 swap 废了。在只用 zram 的情况下,swappiness 可以调得很大,我目前用的值是 180。

Reply View the author
Lwh2008--听话模式
deepin
2023-01-02 08:12
#3

zstd在我的电脑上面速度最快,压缩率最高。。。

Reply View the author
xiao80
deepin
2023-01-02 08:19
#4
Lwh2008--听话模式

zstd在我的电脑上面速度最快,压缩率最高。。。

请教下怎么比出来的?

Reply View the author
xiao80
deepin
2023-01-02 08:25
#5

不错,看来在内存吃紧的情况下,zram 确实达到了不错的效果。建议收藏。

根据 arch wiki:
https://wiki.archlinux.org/title/Improving_performance#RAM,_swap_and_OOM_handling

其实还有一个 zswap 也能达到和 zram 同样的效果。这个是新内核默认开启的,你不妨看看你的系统上是否用到了这个功能呢。另外 wiki 还建议在确定要用 zram 的情况下,关闭 zswap。

再折腾极端一点,如果有独立显卡内存,还可以把显存拿来当 swap 用。

Reply View the author
Lwh2008--听话模式
deepin
2023-01-02 08:28
#6
xiao80

不错,看来在内存吃紧的情况下,zram 确实达到了不错的效果。建议收藏。

根据 arch wiki:
https://wiki.archlinux.org/title/Improving_performance#RAM,_swap_and_OOM_handling

其实还有一个 zswap 也能达到和 zram 同样的效果。这个是新内核默认开启的,你不妨看看你的系统上是否用到了这个功能呢。另外 wiki 还建议在确定要用 zram 的情况下,关闭 zswap。

再折腾极端一点,如果有独立显卡内存,还可以把显存拿来当 swap 用。

一个一个试。。。

Reply View the author
Linux大宝
deepin
2023-01-02 17:40
#7
Lwh2008--听话模式

zstd在我的电脑上面速度最快,压缩率最高。。。

好的,在下也试一试

Reply View the author
Linux大宝
deepin
2023-01-02 17:45
#8
It has been deleted!
jiutian123
deepin
2023-01-02 19:00
#9
SamLukeYes

swappiness 调太低相当于把 swap 废了。在只用 zram 的情况下,swappiness 可以调得很大,我目前用的值是 180。

其他的不用调吗?

Reply View the author
SamLukeYes
deepin
2023-01-02 19:18
#10
jiutian123

其他的不用调吗?

我以前用 Arch 的时候是在这个帖子抄的作业(需要梯子),除了调 vm.swappiness 以外还要根据你用的压缩格式调 vm.page-cluster。

Reply View the author
Linux大宝
deepin
2023-02-11 01:45
#11
xiao80

不错,看来在内存吃紧的情况下,zram 确实达到了不错的效果。建议收藏。

根据 arch wiki:
https://wiki.archlinux.org/title/Improving_performance#RAM,_swap_and_OOM_handling

其实还有一个 zswap 也能达到和 zram 同样的效果。这个是新内核默认开启的,你不妨看看你的系统上是否用到了这个功能呢。另外 wiki 还建议在确定要用 zram 的情况下,关闭 zswap。

再折腾极端一点,如果有独立显卡内存,还可以把显存拿来当 swap 用。

现在的内核,都是支持 zswap 的。

zram 是主动划出一部分内存拿来做为系统的交换分区(换言之,就可以不用再在硬盘上划交换分区或设置 swap 文件了),尺寸固定。与瘟到死中把交换文件放到 Ramdisk 中的原理一致。

zswap 则是在已经有 swap 分区或文件的基础上,把一部分交换数据先缓存到内存上,内存上放不下了才调入到 swap,尺寸是动态的。

两者不能同时启用。

两者的差别也不大,不过我还是喜欢 zram,因为按我的理念,我就没考虑过要划 swap 分区。

之前的情况大家也看到了,不管我怎么设置 swap 总是居高不下,内存利用率也提不起来,

现设置个 zram,把压缩格式换成最符合我心意的 lz4hc(速度极快,压缩率也不赖)、关闭了真实的 swap 文件,我才管你这个虚拟的 swap 分区使用率是高是低,反正都是在内存里转。

Reply View the author