为Linux系统添加虚拟内存文件,以及开启内存压缩

标签: swapfile ; zram ;


因为平时用不到很大的软件,觉得物理内存还够用,安装系统时也就没有分配交换分区。直到某一天需要用一款比较大的软件时(Android Studio),发现内存不够用了。临时买内存来不及,而且主板上也插满了,只能更换不能添加。只好在现有基础上做一些设置,暂时过渡一下。

选项一 在根目录下建立一个交换文件。交换文件就是在硬盘上建立一个文件,系统会将它视为内存的一部分。当系统内存不足时会将数据转移到交换文件上,等于用硬盘空间模拟内存空间,扩大了系统的内存容量。但是速度比真正的内存差了好几个数量级。

选项二 启用内存压缩。Windows 10上已经默认启用了内存压缩,实际使用体验还是让人惊喜的。在小内存机器上(2G)使用Windows 10,还跑一些不算小的软件。在物理内存明显不够用的情况下,居然很少体验到数据在物理内存和虚拟内存之间来回捣腾导致的卡顿。Linux默认没有开启内存压缩,不过Linux内核早就支持了,提供内存压缩的内核模块叫做zram

重要 通过swapon的命令行选项-p以及fstab的选项pri,分别指定了zram和swapfile的优先级,确保在物理内存不足时优先使用zram而不是swapfile。

具体步骤

一、建立swapfile

  1. Ext4分区
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
sudo chmod 600 /swapfile
sudo mkswap /swapfile
  1. Btrfs分区
sudo btrfs filesystem mkswapfile --size 4G /swapfile

根据分区类型的不同,执行不同的命令,最后得到的结果就是在根目录下生成了 /swapfile,并且已经格式化为swap格式。接下来:

sudo swapon /swapfile

启用该交换文件,执行free命令或者cat /proc/swaps,可以看到结果。确认无误后,修改/etc/fstab,在文件最后添加一行:

/swapfile swap swap defaults,pri=1 0 0

让系统在启动时自动挂载该交换文件。

二、启用内存压缩

使用内存压缩需要让zram模块随系统启动自动载入。

新建/etc/modules-load.d/zram.conf,在其中添加一行:

zram

重启系统,运行命令lsmod | grep zram,确认zram内核模块已经load。接下来,在/usr/local/bin目录下新建一个脚本zram-config.sh

#!/bin/bash

# 加载zram模块
modprobe zram

# 计算ZRAM大小为物理内存的50%
mem_total=$(grep MemTotal /proc/meminfo | awk '{print int($2 * 0.5)}')
mem_total_bytes=$((mem_total * 1024))

# 设置ZRAM设备的大小
echo $mem_total_bytes > /sys/block/zram0/disksize

# 格式化ZRAM设备为swap
mkswap /dev/zram0

# 启用ZRAM设备作为交换空间,优先级为5
swapon -p 5 /dev/zram0

chmod +x /usr/local/bin/zram-config.sh

接下来,添加一个systemd服务 /etc/systemd/system/zram.service

[Unit]
Description=Configure ZRAM swap

[Service]
Type=oneshot
ExecStart=/usr/local/bin/zram-config.sh
RemainAfterExit=true

[Install]
WantedBy=multi-user.target
systemctl enable --now zram

如果没有错误发生,此时再运行cat /proc/swaps命令就会看到多了一个叫做/dev/zram0的交换空间。该交换空间和上面建立的swapfile类似,不同的是,它不在硬盘上,而是在物理内存中。与硬盘上的swapfile不同,写入/dev/zram0交换空间中的内存会被自动压缩,从而达到节省内存空间的目的,而且速度比硬盘上的swapfile快得多。