启用压缩内存zram,可以用CPU性能在一定程度上缓解内存紧缺的问题。

目前linux发行版大多都支持zram。
只要VPS不是基于OpenVZ/LXC,大多都可以轻松给其添加zram,利用VPS宿主机较为强劲的CPU性能,缓解主机商只分配少得可怜的内存的问题。
在Debian下,只需几行命令便可以创建好zram(以下命令需root权限):

modprobe zram
echo $((512*1024*1024)) >/sys/block/zram0/disksize
mkswap /dev/zram0
swapon -p 5 /dev/zram0

第一行启用zram模块时可以指定创建多个zram设备,附加参数num_devices即可,如需要创建4个zram设备,则为modprobe zram num_devices=4,之后就可以在/dev和/sys/block中看到zram0至zram3了,对于有多个核心的设备,推荐zram数量与核心数量一致。修改第2条命令可以调整zram区的大小,建议设置为VPS实际空间的一半。该参数设置的是zram可容纳的原始数据的最大值。
swapon命令通过指定-p参数可以设置swap区的优先级,通常系统安装时创建的swap分区默认优先级为-1,之后手动添加的swap分区优先级依次为-2、-3、-4...为了使linux优先使用zram作为swap,可以将其设置为一个正数(比如第4条命令中将其设置为5)。
通过cat /sys/block/zram0/mm_stat可以查看当前zram0设备的内存占用情况。以下面一个ARM系统上工作的zram输出为例:

root@Linux:~# cat /sys/block/zram0/mm_stat
13344768  1972465  2437120        0  2437120     1280        0

输出的参数中的前3个依次为原始数据大小、压缩后的数据大小、该zram设备的总计内存占用。可以通过第二个或第三个参数初一第一个参数得到当前的压缩率。此处以原始数据计算得到的压缩率为1972465/13344768=14.8%,大多数情况下zram的压缩率在20%~50%左右。
另外,zram默认采用lzo算法进行压缩。可以通过cat /sys/block/zram0/comp_algorithm查看当前使用的压缩算法和内核支持的算法。

root@Linux:/sys/block/zram0# cat /sys/block/zram0/comp_algorithm
[lzo] lz4

如果当前内核支持lz4,可以通过echo lz4 > /sys/block/zram0/comp_algorithm切换为lz4算法,根据https://zh.wikipedia.org/wiki/LZ4上的说明,lz4压缩率略差于lzo,两者具有差不多的压缩速度,但是lz4算法的解压速度显著快于lzo算法,对应zram在读取时会有速度的明显提升。
对于zram的详细说明可以在内核文档中找到:https://www.kernel.org/doc/Documentation/blockdev/zram.txt
可以使用以下bash脚本进行zram的批量添加,所给的参数为创建8个大小为2G的zram设备,可以按照需要自行修改:

#!/bin/bash
num_dev=8
blk_size=2048
modprobe zram num_devices=$num_dev
for i in $(seq 0 $(($num_dev-1)))
do
    echo $(($blk_size*1024*1024)) >/sys/block/zram$i/disksize
    mkswap /dev/zram$i
    swapon -p 5 /dev/zram$i
done

如果在modprobe zram时没有指定num_devices,且之后需要增加zram设备数,但已有zram设备正在使用中时,无需rmmod zram再重新modprobe zram,只需读取一次/sys/class/zram-control/hot_add即可。该路径为只读,每次读取的时候会创建一个zram设备,同时返回设备id。

root@Linux:~# cat /sys/class/zram-control/hot_add
1

如上述返回值为1,则可在/dev和/sys/block中看到新增的zram1设备。
需要移除单个zram时,只需将设备id输入给/sys/class/zram-control/hot_remove即可,注意移除之前需要先停用相应的设备(对于swap用途需要执行swapoff,对于文件挂载用途则需要umount)。例如,单独移除zram0的命令:

root@Linux:~# echo 0 >/sys/class/zram-control/hot_remove

zram作为一个块设备,除了可以用作swap,也可以格式化为一般的文件系统并挂载到指定路径。比如,在Armbian中系统默认将zram1挂载为/var/log,即所有日志都被压缩后储存在内存中。
在其他Linux中可以手动进行这样的操作。首先选择一个没有被使用的zram设备,比如设置num_devices=2后仅使用了zram0作为swap,而zram1尚未使用。在使用echo写入/sys/block/zram1/disksize设置了大小以后,使用文件系统的格式化命令对其进行格式化,如:

mkfs.ext4 /dev/zram1

之后这个块设备可以像一般的硬盘设备一样挂载,唯一的区别在于需要启用discard选项使得删除的文件被文件系统释放,否则删除的文件仅仅是打上了已删除的标记,仍然会占用内存空间。将zram1挂载到/tmp/zram1的命令如下,注意需要先创建好/tmp/zram1

mount /dev/zram1 -o discard /tmp/zram1

mkfs.ext4格式化的ext4分区默认会设置5%的保留空间仅供特殊用户(如root)使用,如果希望其他用户能完整使用该zram空间,可以使用tune2fs设置该参数为0:

tune2fs -m 0 /dev/zram1

标签: Linux

添加新评论