运维
创建时间:
Swap是什么?如何分配?
Swap是什么?如何分配? - 详细内容介绍
什么是 Swap?
可以把服务器的内存(RAM)想象成一张桌子:
- 内存大 → 桌子大 → 可以同时放很多书(程序/数据)。
- 内存小 → 桌子小 → 书放不下。
Swap 就像是桌子旁边的抽屉(硬盘/SSD 空间划出来的一块区域):
- 当桌子(内存)不够用时,系统会把暂时不用的书(数据)搬到抽屉里(Swap),腾出桌面空间。
- 等需要用的时候再拿回来。
特点
- 优点:避免“桌子放不下时直接崩溃(OOM Kill)”,系统还能坚持下去。
- 缺点:抽屉(Swap 在硬盘/SSD)比桌子(RAM)慢很多倍,所以性能会下降。
为什么你需要 Swap?
如果你的服务器(学生机)只有 2GB/4GB 内存,但 Next.js 构建会瞬间吃 1~2GB+ 内存,超过就会触发 OOM Kill,导致你看到 SSH 掉线、服务挂掉。 👉 有了 Swap,就算物理内存满了,系统还能把一部分数据挪到硬盘里,不至于立刻杀进程。
怎么看有没有 Swap?
free -h输出里有一行:
Swap: 0B 0B 0B说明还没开 Swap。 如果是:
Swap: 4.0G 0B 4.0G说明有 4GB Swap,可以帮你缓冲。
怎么加 Swap?
常见操作(给 4GB swap):
# 创建一个 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系统的脚本
#!/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使用方法
-
在服务器上创建脚本文件:
vim check_or_create_swap.sh把上面内容粘贴进去,保存退出。
-
赋予可执行权限:
chmod +x check_or_create_swap.sh -
用 root 权限运行:
sudo ./check_or_create_swap.sh -
脚本会:
- 显示当前 swap 状态
- 如果没有,就自动创建一个 4GB 的
/swapfile - 启用并写入
/etc/fstab,确保开机自动生效 - 最后再显示新的 swap 状态
⚠️ 提示:
- 如果你的服务器硬盘空间比较小,可以把
SIZE="4G"改成2G。 - 如果要更稳(比如跑很多构建任务),可以改成
8G。 - 查看整体磁盘挂载情况命令
df -h- df = disk free
- -h = human readable(人类可读,显示 GB/MB)
示例输出:
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:挂载点(/ 就是根目录,主要看这个)