什么是 Swap

可以把服务器的内存(RAM)想象成一张桌子:

  • 内存大 → 桌子大 → 可以同时放很多书(程序/数据)。
  • 内存小 → 桌子小 → 书放不下。

Swap 就像是桌子旁边的抽屉(硬盘/SSD 空间划出来的一块区域)

  • 当桌子(内存)不够用时,系统会把暂时不用的书(数据)搬到抽屉里(Swap),腾出桌面空间。
  • 等需要用的时候再拿回来。

特点

  • 优点:避免“桌子放不下时直接崩溃(OOM Kill)”,系统还能坚持下去。
  • 缺点:抽屉(Swap 在硬盘/SSD)比桌子(RAM)慢很多倍,所以性能会下降。

为什么你需要 Swap?

如果你的服务器(学生机)只有 2GB/4GB 内存,但 Next.js 构建会瞬间吃 1~2GB+ 内存,超过就会触发 OOM Kill,导致你看到 SSH 掉线、服务挂掉。
👉 有了 Swap,就算物理内存满了,系统还能把一部分数据挪到硬盘里,不至于立刻杀进程。


怎么看有没有 Swap?

1
free -h

输出里有一行:

1
Swap:   0B   0B   0B

说明还没开 Swap。
如果是:

1
Swap:   4.0G   0B   4.0G

说明有 4GB Swap,可以帮你缓冲。

怎么加 Swap?

常见操作(给 4GB swap):

1
2
3
4
5
6
7
8
9
10
11
# 创建一个 4GB 的文件当作 swap 空间
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 开机自动挂载
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# 查看
free -h

✅ 总结:
Swap 就是“虚拟内存”,用硬盘空间临时当内存,解决内存不足导致的崩溃问题。它不会让程序更快,但能让小内存机器更稳,不至于一跑构建就挂。

适用于Ubuntu系统的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash
# 检查并创建 Swap 脚本
# 用法:sudo bash check_or_create_swap.sh

SWAPFILE="/swapfile"
SIZE="4G" # 可以改成 2G、8G

echo ">>> 检查当前 Swap 状态..."
free -h

# 判断是否已经有 swap
if swapon --show | grep -q "$SWAPFILE"; then
echo ">>> 已经存在 $SWAPFILE,不需要再创建。"
exit 0
fi

if [ "$(swapon --show | wc -l)" -gt 0 ]; then
echo ">>> 系统已经有其它 Swap,不需要再创建。"
swapon --show
exit 0
fi

echo ">>> 没有发现 Swap,开始创建 ${SIZE} swap 文件..."

# 创建 swapfile
fallocate -l $SIZE $SWAPFILE
chmod 600 $SWAPFILE
mkswap $SWAPFILE
swapon $SWAPFILE

# 设置开机自动挂载
if ! grep -q "$SWAPFILE" /etc/fstab; then
echo "$SWAPFILE none swap sw 0 0" >> /etc/fstab
fi

echo ">>> 创建完成,当前 Swap 状态:"
free -h
swapon --show

使用方法

  1. 在服务器上创建脚本文件:

    1
    vim check_or_create_swap.sh

    把上面内容粘贴进去,保存退出。

  2. 赋予可执行权限:

    1
    chmod +x check_or_create_swap.sh
  3. 用 root 权限运行:

    1
    sudo ./check_or_create_swap.sh
  4. 脚本会:

    • 显示当前 swap 状态
    • 如果没有,就自动创建一个 4GB 的 /swapfile
    • 启用并写入 /etc/fstab,确保开机自动生效
    • 最后再显示新的 swap 状态

⚠️ 提示:

  • 如果你的服务器硬盘空间比较小,可以把 SIZE="4G" 改成 2G
  • 如果要更稳(比如跑很多构建任务),可以改成 8G
  • 查看整体磁盘挂载情况命令
1
df -h
  • df = disk free
  • -h = human readable(人类可读,显示 GB/MB)

示例输出:

1
2
3
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1 40G 15G 23G 40% /
tmpfs 987M 0 987M 0% /dev/shm
  • Size:磁盘总大小
  • Used:已用空间
  • Avail:剩余可用空间
  • Use%:使用率
  • Mounted on:挂载点(/ 就是根目录,主要看这个)