前言
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
所以我特地去找了下这个新算法的相关测试数据,结果它还是垃圾
压缩率
速度与延迟
图表
总的来说,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
remark,感谢大佬
lz4在使用上比較容易引發問題,雖然頻寬最大延遲最低,但是較容易引發意外卡頓跟OOM。
lz4負載輕的時候很快,但是重負載的時候較lz4跟zstd差。
大大您參考的reddit討論串下方其實也有人實測出這點,所以使用最好還是用lzo或者zstd選一個。
其次是page cluster,我測試過0 1 3,實際上3是最順暢的,至於原因我也不曉得。
https://segmentfault.com/a/1190000041578292
這篇的大大也是做了很詳盡的測試,單看表格選出延遲最低或者頻寬最大都沒意義。
最後做ElasticSearch 基準測試時那些優化跑出來的結果都是不如默認的,跟我使用經驗相同。
當然這些詳細的測試很有參考價值,可能是跟實際場景有落差導致實驗跟基準測試結果不同吧。
👍