使用zram技术替代zswap技术降低系统延迟
发表于 : 2025-04-24 4:28
zram技术具有完全不占用系统I/O接口的特点,现在大多数电脑cpu性能过剩,在实际使用中使用几乎可以忽略不计的cpu占用,即可大幅降低内存占用,减低系统延迟,提升系统反应速度,尤其适合在嵌入式设备上使用。但是目前大部分linux均使用zswap技术,这里结合ubunu25.04进行一番尝试。需要注意的是接下来的操作具有危险性,请谨慎操作。
首先,查看当前系统的情况。
一般来说,ubuntu安装完成后,会在根目录生成swap.img文件,用于交换空间,同时在/etc/fstab中有加载交换空间的相应条目。
至此,已经禁用zswap交换空间,接下来,我们开始启用zram交换空间。
紧接着,我们调整一下内核管理内存的逻辑,配合zram实现降低延迟的目的。
最后,我们重载配置文件,并进行测试。
我们可以看到,系统将内存的一部分虚拟为一个块设备zram0,并将其作为交换空间。
最后,如果不想手动修改,这里给出一个包,可直接在附件下载。
首先,查看当前系统的情况。
代码: 全选
# 查看当前系统是否启用zswap交换空间
cat /sys/module/zswap/parameters/enabled
# 查看当前系统交换设备情况
cat /proc/swaps
代码: 全选
# 卸载所有交换空间
sudo swapoff --all
# 禁用zswap交换空间
echo 0 | sudo tee /sys/module/zswap/parameters/enabled
# 注释fstab相应条目
sudo sed -i 's/\/swap.img/# \/swap.img/' /etc/fstab
# 为确保内核启动时不启用zswap,我们直接修改grub
echo 'GRUB_CMDLINE_LINUX_DEFAULT="quiet splash zswap.enabled=0"' | sudo tee /etc/default/grub.d/no-zswap.cfg
sudo update-grub
代码: 全选
# 启动时加载zram内核模块
echo 'zram' | sudo tee /etc/modules-load.d/zram.conf
# 为zram内核模块设置参数,这里虚拟一个块设备。
echo 'options zram num_devices=1' | sudo tee /etc/modprobe.d/zram-num.conf
# 为了实现加载zram内核模块时,同时设置参数,我们为udev热拔插写一个规则文件。
# 这里使用zstd压缩模式,实际使用中可以取得较好的平衡。
# 这里使用一小段脚本,设置虚拟块设备的大小,实际使用中一般设置为物理内存的一半,
# 过大反而影响性能增加延迟,过小起不到降低延迟的作用。
echo 'ACTION=="add", KERNEL=="zram0", PROGRAM=="/usr/libexec/zram-swap/swap-mem.sh", RESULT=="[0-9]*", ATTR{comp_algorithm}="zstd", ATTR{disksize}="%c", TAG+="systemd"' | sudo tee /etc/udev/rules.d/99-zram.rules
代码: 全选
# 为规则文件写一小段脚本,计算出物理内存一半的大小
cat > swap-mem.sh << 'EOF'
#! /bin/bash
set -e
echo $(echo $(LC_ALL=C free | grep -e "^Mem:" | sed -e 's/^Mem: *//' -e 's/ *.*//') / 2*1024 | bc)
EOF
sudo install -m755 swap-mem.sh /usr/libexec/zram-swap/swap-mem.sh
代码: 全选
# 再写一个service文件并设置为开机自启动,配合udev实现systemd管理块设备
cat > zram-swap.service << 'EOF'
[Unit]
Description=zram swaping
BindTo=dev-zram0.device
After=dev-zram0.device
Before=systemd-oomd.service
[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=/usr/sbin/mkswap /dev/zram0
ExecStart=/usr/sbin/swapon --priority 5 /dev/zram0
ExecStop=/usr/sbin/swapoff /dev/zram0
ExecStopPost=echo 1 > /sys/block/zram0/reset
[Install]
WantedBy=multi-user.target
EOF
sudo install -m644 zram-swap.service /usr/lib/systemd/system/zram-swap.service
# 重新加载systemd单元
sudo systemctl daemon-reload
sudo systemctl enable zram-swap.service
代码: 全选
cat > 99-sysctl.conf << 'EOF'
vm.vfs_cache_pressure=500
vm.page-cluster=0
vm.swappiness=100
vm.dirty_background_ratio=1
vm.dirty_ratio=50
EOF
sudo install -m644 99-sysctl.conf /etc/sysctl.d/99-sysctl.conf
代码: 全选
# 重载规则
sudo udevadm control --reload
# 重新内存管理参数
sudo sysctl --load=/etc/sysctl.d/99-sysctl.conf
# 加载zram内核模块
sudo modprobe zram num_devices=1
# 启动zram-swap.service服务
sudo systemctl start zram-swap.service