使用 zram 进行内存压缩

对于像 KS-3 这样只有 4GB 内存的小内存服务器,如果想在上面跑一些比较复杂的服务,经常会遇到内存不足的问题。一般说到内存不足,第一反应都是加 swap 空间,但是对于机械硬盘的场景,添加盲目添加 swap 空间并不是一个好的选择,因为这样会显著增加系统整体的 latency。这个时候 zram 就可以派上用场了。

zram 是在 Linux Kernel 3.2 加入的一个模块,其功能是在内存中开辟一块空间,用来存储压缩后的内存数据,这样可以在牺牲一定的 CPU Cycle 的情况下,在内存中存储尽量多的数据而不需要写入到磁盘。

对于 Ubuntu 系统,开启 zram 的方法很简单,只需要安装 zram-config 这个包之后重启即可。zram 默认会将系统内存的一半作为 zram,然后根据 CPU 核心数平均分配到每个 zram 设备。比如在我的 KS-3 上,通过 zramctl 查看 zram 的情况,是这样的:

# zramctl
NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram3 lz4           491M   4K   63B    4K       4 [SWAP]
/dev/zram2 lz4           491M   4K   63B    4K       4 [SWAP]
/dev/zram1 lz4           491M   4K   63B    4K       4 [SWAP]
/dev/zram0 lz4           491M   4K   63B    4K       4 [SWAP]

注意到这里的压缩算法,有两种算法 lzo 和 lz4 可选,默认是 lzo。根据 Benchmark,lz4 的压缩和解压性能在压缩率和 lzo 持平的情况下显著高于后者,因此我们应该采用 lz4 而非 lzo 以获得更高的系统效率。

虽然 zramctl 可以帮助调整 zram 的情况,但是我们还是应该在系统启动时就将这些东西配置好。zram-config 安装好后会默认添加 zram-config.service,这个 service 是运行 /usr/bin/init-zram-swapping 这个脚本以配置对应的 zram 设备,默认情况下,其配置设备的内容应该是这样:

#!/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))

# initialize the devices
for i in $(seq ${NRDEVICES}); do
  DEVNUMBER=$((i - 1))
  echo $mem > /sys/block/zram${DEVNUMBER}/disksize
  mkswap /dev/zram${DEVNUMBER}
  swapon -p 5 /dev/zram${DEVNUMBER}
done

如果我们要默认使用 lz4 算法,那么应该将最后一段改成这样:

# 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

注意算法设置一定要在配置空间大小之前,否则不能正确修改。

修改过后,运行 systemctl restart zram-config 就可以载入新的配置。

参考资料:

https://askubuntu.com/questions/1044976/make-zram-use-lz4-compression-algorithm
https://github.com/lz4/lz4
https://sites.google.com/site/easylinuxtipsproject/speed#TOC-Only-768-MB-RAM-or-less:-enable-zRam
http://tuxdiary.com/2015/07/28/zram/
https://wiki.archlinux.org/index.php/improving_performance#Zram_or_zswap

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注