首先,查看当前系统的情况。
代码: 全选
# 查看当前系统是否启用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