使用zram技术替代zswap技术降低系统延迟

CPU/显卡/打印机/USB设备等硬件问题
回复
zrqlx126
帖子: 400
注册时间: 2007-06-22 18:52

使用zram技术替代zswap技术降低系统延迟

#1

帖子 zrqlx126 » 2025-04-24 4:28

zram技术具有完全不占用系统I/O接口的特点,现在大多数电脑cpu性能过剩,在实际使用中使用几乎可以忽略不计的cpu占用,即可大幅降低内存占用,减低系统延迟,提升系统反应速度,尤其适合在嵌入式设备上使用。但是目前大部分linux均使用zswap技术,这里结合ubunu25.04进行一番尝试。需要注意的是接下来的操作具有危险性,请谨慎操作。
首先,查看当前系统的情况。

代码: 全选

# 查看当前系统是否启用zswap交换空间
cat /sys/module/zswap/parameters/enabled
# 查看当前系统交换设备情况
cat /proc/swaps
一般来说,ubuntu安装完成后,会在根目录生成swap.img文件,用于交换空间,同时在/etc/fstab中有加载交换空间的相应条目。

代码: 全选

# 卸载所有交换空间
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
至此,已经禁用zswap交换空间,接下来,我们开始启用zram交换空间。

代码: 全选

# 启动时加载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
紧接着,我们调整一下内核管理内存的逻辑,配合zram实现降低延迟的目的。

代码: 全选

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
我们可以看到,系统将内存的一部分虚拟为一个块设备zram0,并将其作为交换空间。
zram.png
fast.png
最后,如果不想手动修改,这里给出一个包,可直接在附件下载。
附件
zram-swap_1.0-myubuntu_all.deb
(3.01 KiB) 已下载 63 次
上次由 zrqlx126 在 2025-04-24 15:34,总共编辑 1 次。
我是个杯具
帖子: 17
注册时间: 2009-10-25 0:22
系统: Ubuntu 25.04

Re: 使用zram技术替代zswap技术降低系统延迟

#2

帖子 我是个杯具 » 2025-04-24 9:16

直接apt install systemd-zram-generator 重启就完事了,哪有这么麻烦,swap文件也不用停用,把swap的优先级改成1就行了。
头像
imxys
帖子: 80
注册时间: 2014-05-03 22:44
系统: Ubuntu 24.04;Manjaro

Re: 使用zram技术替代zswap技术降低系统延迟

#3

帖子 imxys » 2025-04-27 10:22

不明觉厉
回复