前言

ZRAM这个玩意儿在移动端上已经存在很长时间了,但是不知道为什么现在PC上依然在使用普通的swap。在我看来,1202年,即使是移动端设备,其性能也已经足以应对ZRAM的性能开销

SWAP对于我这种跑AOSP已经快要IO爆炸的机子来说实在是雪上加霜

很让我惊讶的是,我居然没有找到比较标准的中文版ZRAM配置流程,这篇文章的内容是在外网东拼西凑总结出来的

配置

安装

为什么叫“安装”,因为已经有软件包封装好了对应的东西(甚至是systemctl服务),并不需要自己写脚本

sudo apt install zram-config

重启之后,一个内存大小一半的ZRAM就出现了

binary

zramctl --help

但是在这里似乎并不能修改开机时应用的内容

开机时配置

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

整个ZRAM的启动流程都写在里面了

算法的选择

理论

这个东西安卓圈的人研究过挺多的,最后的结论一般都是:默认的lzo就是垃圾
但是ubuntu下的默认算法居然也是lzo,但是是进化版的lzo-rle
所以我特地去找了下这个新算法的相关测试数据,结果它还是垃圾

压缩率

p

速度与延迟

p

图表

p

p

p

总的来说,lzo相比于lz4,只有那一点点可怜的压缩率优势,但是却为此损失了太多的速度
所以,能选的算法只有zstd和lz4
而zstd的速度对page-cluster并不敏感,而延迟却非常敏感,适合page-cluster=0
lz4的话,page-cluster是可以稍微开一点的

但是,内核默认的page-cluster=3就是屑

参考资料

https://www.reddit.com/r/Fedora/comments/mzun99/new_zram_tuning_benchmarks/

实操

要想设置算法,只需在zram被激活之前
echo "<算法名>" > /sys/block/zram<num>/comp_algorithm即可,可以写到开机时配置的脚本里
同理,page-cluster也可以这样设置sysctl vm.page-cluster=X
还有个决定调用激进度的swappiness sysctl vm.swappiness=X

最后我的配置文件

#!/bin/sh

# load dependency modules
NRDEVICES=$(grep -c ^processor /proc/cpuinfo | sed 's/^0$/1/')
if modinfo zram | grep -q ' zram_num_devices:' 2>/dev/null; then
  MODPROBE_ARGS="zram_num_devices=${NRDEVICES}"
elif modinfo zram | grep -q ' num_devices:' 2>/dev/null; then
  MODPROBE_ARGS="num_devices=${NRDEVICES}"
else
  exit 1
fi
modprobe zram $MODPROBE_ARGS

# Calculate memory to use for zram (1/2 of ram)
totalmem=`LC_ALL=C free | grep -e "^Mem:" | sed -e 's/^Mem: *//' -e 's/  *.*//'`
mem=$(((totalmem / 2 / ${NRDEVICES}) * 1024))

sysctl vm.page-cluster=0
sysctl vm.swappiness=100
# initialize the devices
for i in $(seq ${NRDEVICES}); do
  DEVNUMBER=$((i - 1))
  echo "lz4" > /sys/block/zram${DEVNUMBER}/comp_algorithm
  echo $mem > /sys/block/zram${DEVNUMBER}/disksize
  mkswap /dev/zram${DEVNUMBER}
  swapon -p 5 /dev/zram${DEVNUMBER}
done