Debian 12 创建系统交换分区 Swap

什么是 Swap

Linux 中的 Swap 即为系统交换区,类似于 Windows 的虚拟内存,当内存不足的时候,把一部分磁盘空间虚拟成内存使用,以解决内存容量不足的情况。Linux 系统的内存管理必须使用交换区来建立虚拟内存。尽管对于交换空间的合适大小有很多意见,但这实际上取决于您的个人喜好和您的应用程序要求。通常,等于或两倍于系统 RAM 量的量是一个很好的起点。另一个好的经验法则是,如果您只是将它用作 RAM 后备,那么任何超过 4G 的交换空间都可能是不必要的。

创建交换分区

  • 创建一个文件作为交换空间,这个文件可以是任何大小,但通常建议的大小是物理内存的两倍或更大
1
sudo fallocate -l 8G /swapfile
  • 更改文件权限,确保交换文件的访问权限正确设置
1
sudo chmod 600 /swapfile
  • 格式化交换空间,使用 mkswap 命令将文件格式化为交换空间
1
sudo mkswap /swapfile
  • 激活交换空间,使用 swapon 命令激活交换空间
1
sudo swapon /swapfile
  • 自动激活交换空间,为了在操作系统启动时自动激活交换空间
1
2
# 编辑系统配置文件,在文件末尾添加以下一行内容
sudo vi /etc/fstab
1
/swapfile none swap sw 0 0
  • 验证交换空间状态
1
swapon -s

或者

1
free -h

动态调整交换分区大小

在生产环境中,发现 Swap 过大或者过小,需要不停机(动态)调整 Swap 的大小。比如,将 Swap 从 8G 降低为 4G 大小:

特别注意

无论 Swap 是扩容还是缩容(两者都需要执行 swapoff),都必须先检查系统的空闲物理内存(RAM)是否足够。

  • 在执行 swapoff 前,必须确认系统的空闲物理内存(RAM)是否足够容纳 Swap 中的数据
1
free -h
1
2
3
              total        used        free      shared  buff/cache   available
Mem: 8.0G 6.5G 500M 100M 1.0G 600M
Swap: 8.0G 1.8G
  • 判断方法:
    • 检测目标: Mem 的 available(可用量)必须大于 Swap 的 used(已使用量)
    • 如果条件不满足,执行 swapoff 会可能会引起系统崩溃或 OOM
    • 举例:
      • 如果 available = 3Gswap used = 2G → 安全,可以直接执行 swapoff
      • 如果 available = 1Gswap used = 2G → 高危,不要直接执行 swapoff
    • 如果空闲物理内存(RAM)足够容纳 Swap 中的数据,可以直接执行 swapoff 操作
      • 直接执行操作
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        # 关闭旧的 Swap
        sudo swapoff /home/swap

        # 确认旧的 Swap 已关闭
        swapon --show

        # 删除旧的 Swap
        sudo rm /home/swap

        # 创建并启用 4G 新的 Swap
        sudo dd if=/dev/zero of=/home/swap bs=1M count=4096 status=progress
        sudo chmod 600 /home/swap
        sudo mkswap /home/swap
        sudo swapon /home/swap

        # 确认新的 Swap 已启用
        swapon --show
      • 最后检查 /etc/fstab 系统配置文件,保证开机自动启用 Swap
        1
        2
        3
        4
        # 编辑 /etc/fstab 系统配置文件,检查 Swap 文件的路径是否正确
        vim /etc/fstab

        /home/swap swap swap default 0 0
    • 如果空闲物理内存(RAM)不足以容纳 Swap 中的数据,可以先增加一个临时的新 Swap,再执行 swapoff 操作
      • 先增加一个临时的新 Swap(大小要足以容纳旧 Swap 中的数据,不必等于旧 Swap 的总大小),让系统有额外的 Swap 缓冲
        1
        2
        3
        4
        5
        6
        7
        8
        # 创建并启用 2G 临时的新 Swap
        sudo dd if=/dev/zero of=/home/temp_swap bs=1M count=2048 status=progress
        sudo chmod 600 /home/temp_swap
        sudo mkswap /home/temp_swap
        sudo swapon /home/temp_swap

        # 确认临时的新 Swap 已启用
        swapon --show
      • 关闭旧 Swap
        1
        2
        3
        4
        5
        6
        7
        8
        # 关闭旧的 Swap
        sudo swapoff /home/swap

        # 确认旧的 Swap 已关闭
        swapon --show

        # 删除旧的 Swap
        sudo rm /home/swap
      • 创建并启用新的 Swap
        1
        2
        3
        4
        5
        6
        7
        8
        # 创建并启用 4G 新的 Swap
        sudo dd if=/dev/zero of=/home/swap bs=1M count=4096 status=progress
        sudo chmod 600 /home/swap
        sudo mkswap /home/swap
        sudo swapon /home/swap

        # 确认新的 Swap 已启用
        swapon --show
      • 关闭临时的新 Swap
        1
        2
        3
        4
        5
        6
        7
        8
        # 关闭临时的新 Swap
        sudo swapoff /home/temp_swap

        # 确认临时的新 Swap 已关闭
        swapon --show

        # 删除临时的新 Swap
        sudo rm /home/temp_swap
      • 最后检查 /etc/fstab 系统配置文件,保证开机自动启用 Swap
        1
        2
        3
        4
        # 编辑 /etc/fstab 系统配置文件,检查 Swap 文件的路径是否正确
        vim /etc/fstab

        /home/swap swap swap default 0 0

swapoff 命令的介绍

  • swapoff 命令的本质

    • 将 Swap 中的所有数据迁回物理内存(RAM),并停用 Swap 设备。
  • swapoff 命令的执行过程

    • 系统会尝试将 Swap 空间里被换出的内存页全部加载回物理内存(RAM)。
    • 完成数据迁移后,Swap 分区或文件被标记为未启用。
    • 如果只有一个 Swap,后续内存紧张时,Linux 不能再使用 Swap 作为缓冲,进程只能留在物理内存(RAM)中。
  • swapoff 命令的副作用

影响具体表现
内存占用瞬间增加 Swap 中的数据必须全部搬回物理内存(RAM),如果 RAM 不足,可能会引起系统崩溃或 OOM。
系统性能抖动数据迁移会产生大量磁盘 I/O + 内存拷贝,短时间内 CPU 和 磁盘 I/O 压力上升。
进程可能被杀掉如果迁移过程中可用 RAM 不足,Linux OOM Killer 会强制杀掉部分进程来释放内存。
系统无 Swap 保护如果只有一个 Swap,那么在 swapoff 后,系统将会失去 Swap 的缓冲区,一旦 RAM 再次被耗尽,进程将直接被 OOM 杀掉。