介绍

  • zRAM 和传统的交换空间(Swap)都是 Linux 系统用来增加可用内存的技术,但它们的工作方式和使用场景有所不同。

  • 一般来说,能用ZRAM更好,但是有些VPS的cpu配置不行那就不要开zram了。

  1. ZRAM:

    • 存储介质: zRAM 是一种压缩的 RAM 块设备,它使用内存本身来存储压缩的数据。
    • 性能: zRAM 的读写速度远快于传统 Swap,因为它直接在 RAM 上操作。压缩和解压缩数据需要一定的 CPU 资源,但通常这种开销小于从硬盘读写数据的时间。
    • 可靠性: 由于 zRAM使用的是 RAM,频繁的读写可能会对 RAM 的寿命造成影响,尽管实际影响非常小。
    • 用途: zram 非常适合用于拥有有限 RAM 或需要快速交换区的设备,如嵌入式设备或旧计算机,也常用于Android设备。
  2. 传统交换空间(Swap):

    • 存储介质: Swap 通常使用硬盘驱动器(HDD)或固态驱动器(SSD)作为交换区。
    • 性能: 因为硬盘速度远慢于 RAM,使用 Swap 可能会显著减慢系统速度,尤其是在内存耗尽时。
    • 可靠性: Swap 在不同的物理介质上,因此不会影响 RAM 的寿命。
    • 用途: 在物理内存用完时,可以作为溢出区域,但由于速度慢,通常只适合非常低的内存压力。

zram

  • 可以同时保留硬盘的 Swap 文件 / 分区,视内存而定,设置优先使用 ZRAM即可
  • ZRAM 不会立刻占用设定的内存大小,它是动态分配的,设置的只是“上限”
  1. 安装 zram-tools

    1
    2
    apt update
    apt install zram-tools
  2. 配置 zRAM 参数

    默认的配置比较保守,可以修改配置文件以达到更好效果

    打开配置文件:

    1
    nano /etc/default/zramswap

    将文件内容修改为如下配置(或取消对应行的注释并修改):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #可以查看自己系统还支持哪些压缩算法:cat /sys/block/zram0/comp_algorithm

    # 压缩算法:推荐使用 zstd;也可以选择lz4,它比zstd速度快,但相应的压缩率更低
    # zstd 在压缩率和解压速度之间取得了目前最好的平衡,是现代 Linux 的首选。

    ALGO=zstd

    # zRAM 分配的物理内存比例:建议设置为 50,这表示 zRAM 最多可以使用系统总物理内存的 50%(若物理内存 ≤ 512MB,50% 可能过大(CPU 负担重),可以试着改为 25%~30%)。
    # 注意:这并不意味着它会立刻占用 50% 的内存,而是随着需要动态增长的上限。
    PERCENT=50

    # Swap 优先级:设置为最高优先级(比如 100)。
    # 如果你的系统同时存在硬盘 Swap,这能确保系统优先使用 zRAM。
    PRIORITY=100

    保存并退出(在 Nano 中按 Ctrl+O 存盘,Enter 确认,Ctrl+X 退出)。

    应用更改并重启服务:

    1
    2
    systemctl restart zramswap
    systemctl enable zramswap
  3. 验证

    使用以下命令查看当前的 Swap 状态:

    1
    swapon --show

    你会看到类似下面的输出,注意 TYPEpartition,并且 PRIO100

    1
    2
    NAME       TYPE       SIZE USED PRIO
    /dev/zram0 partition 488M 0B 100

    还可以使用 zramctl 命令查看更详细的压缩统计信息:

    1
    zramctl

    输出示例:

    1
    2
    NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
    /dev/zram0 zstd 488M 4K 73B 12K 2 [SWAP]
  4. 进阶操作:参数调优

    创建或编辑 sysctl 配置文件:

    1
    sudo nano /etc/sysctl.d/99-zram.conf
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # 1. 提高使用 Swap 的积极性 (默认通常是 60)
    # 因为 zRAM 速度很快,我们希望系统更积极地把冷数据压缩到 zRAM 中,腾出物理内存给文件缓存。
    # 推荐值:100 - 150 之间。
    vm.swappiness = 100

    # 2. 禁用页簇 (Page Cluster)
    # 传统的 Swap 每次会连带读取相邻的内存页(因为磁盘顺序读取比随机读取快)。
    # 但 zRAM 是在内存中操作,连带读取反而会增加 CPU 计算解压的负担。
    # 将其设置为 0,表示每次只交换需要的页面。
    vm.page-cluster = 0

    # 3. 调整缓存压力阈值
    # 稍微降低系统回收 VFS 缓存(目录和 inode)的倾向。
    vm.vfs_cache_pressure = 50

    # 提前触发后台内存回收,适度防止内存突发紧张(若 CPU 经常飙到 100%,可考虑调低到 30 或 20)
    vm.watermark_scale_factor = 50

    # 禁用水位提升,避免 kswapd 瞬间大量占用 CPU 进行压缩
    vm.watermark_boost_factor = 0

    保存文件后,应用内核参数使其立即生效:

    1
    sysctl --system
  5. 删除

    停止并禁用 zram 服务:

    1
    2
    sudo systemctl stop zramswap
    sudo systemctl disable zramswap

    彻底卸载 zram-tools(可选,如果以后不再需要)

    1
    sudo apt remove --purge zram-tools

    清理配置文件(可选)

    1
    sudo rm -f /etc/default/zramswap
  6. 参考与鸣谢

swap

创建swap交换分区

  1. 此命令将显示当前正在使用的所有交换分区及其相关信息,包括标签和 UUID。

    1
    sudo swapon --show
  2. 创建交换空间大小1G,可自行修改:

    根据自己vps内存修改,2G以下建议实际内存2倍,2-4G建议1.5倍

    1
    sudo fallocate -l 1G /swapfile
  3. 授予权限

    1
    chmod 600 /swapfile
  4. 启用交换内存

    1
    2
    3
    4
    mkswap /swapfile

    swapon /swapfile
    #如果需要 显式设置低优先级,确保硬盘 Swap 始终排在 ZRAM 之后,即先使用ZRAM,可以设置优先级(此命令设置优先级为 10):swapon -p 10 /swapfile
  5. 开机启用交换空间

    1
    2
    3
    echo '/swapfile swap swap defaults 0 0' >> /etc/fstab

    #如果需要 显式设置低优先级,确保硬盘 Swap 始终排在 ZRAM 之后,即先使用ZRAM,可以设置优先级(此命令设置优先级为 10):echo '/swapfile none swap sw,pri=10 0 0' | sudo tee -a /etc/fstab

删除swap交换分区

  1. 此命令将显示当前正在使用的所有交换分区及其相关信息,包括标签和 UUID。

    1
    sudo swapon --show
  2. 关闭要删除的交换分区。 运行以下命令:

    1
    sudo swapoff -L {swap_label}

    将 “{swap_label}” 替换为要删除的交换分区的标签。 如果您知道它的 UUID,请使用以下命令:

    1
    sudo swapoff -U {swap_uuid}

    将 “{swap_uuid}” 替换为要删除的交换分区的 UUID。

  3. 删除交换分区文件。如果您使用的是文件作为交换分区的话,运行以下命令:

    1
    sudo rm {swap_file}

    将 “{swap_file}” 替换为包含交换分区的文件路径和名称。

  4. 更新 /etc/fstab 文件。 打开 /etc/fstab 文件,并找到包含要删除的交换分区的行。 在此行上添加 “#” 符号(无引号),以将其注释掉,或者直接将该行从文件中删除。 保存更改。完成以上步骤后,即可成功删除指定的交换分区。

参考与鸣谢