Ubuntu交换区(Swap)扩容方法

[复制链接]
发表于 2026-10-5 11:24:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

内存吃满,服务开始被 OOM Killer 杀掉,第一反应就是加 Swap。可 Ubuntu 从 18.04 起默认装的已经不是 Swap 分区,而是一个 Swap 文件,两者的调整方式完全不同。本文把两种情况的分工讲清楚,并给出扩容的完整步骤。

Swap 是什么,两种形态有啥区别

Swap 是磁盘上专门划出的一块空间,物理内存不够时内核把暂时不用的页换到这里,腾出 RAM 给正在跑的任务。本质上它都是「虚拟内存的后备区」,差别只在承载形式:

  • Swap 分区:单独划一块磁盘空间、用 mkswap 标成 swap 类型。传统做法,开销略低。
  • Swap 文件:在普通文件系统里放一个大文件(默认路径 /swapfile)。Ubuntu 18.04 以后默认就是这个,灵活、好调大小、不好坏盘。

先看当前系统用的是哪种:

swapon --show

输出里 TYPE 列是 file 就是文件,partition 就是分区:

# swap 文件
NAME      TYPE      SIZE USED PRIO
/swapfile file        4G   0B   -2

# swap 分区
NAME      TYPE      SIZE USED PRIO
/dev/sda2 partition  4G   0B   -2

顺带一提:如果要做休眠(suspend to disk),Swap 分区更可靠;日常内存扩容用文件就够了。

方案一:调整 Swap 文件

假设要把 swap 从 4G 扩到 8G,流程是「关旧 — 删旧 — 建新 — 启用 — 写 fstab」:

1. 关闭并删除旧 swap 文件

sudo swapoff /swapfile
sudo rm /swapfile

2. 创建新 swap 文件

sudo dd if=/dev/zero of=/swapfile bs=1G count=8

bs=1G count=8 表示写 8 个 1GB 的块,也就是 8G。也可以用 fallocate -l 8G /swapfile,速度更快且不真正占用空间(文件系统支持时)。

3. 收紧权限

sudo chmod 600 /swapfile

这步别省。swap 文件里可能残留内存页内容,权限放太开等于把数据裸奔出去。

4. 格式化并启用

sudo mkswap /swapfile
sudo swapon /swapfile

5. 写进 fstab 保证重启后还在

sudo vim /etc/fstab

追加一行(原来那行 /swapfile 要删掉或注释掉,否则会重复挂载):

/swapfile none swap sw 0 0

保存退出后跑 sudo mount -a 验证没写错。

6. 验证

swapon --show
free -h

方案二:调整 Swap 分区

老系统或者装系统时手动分了 swap 分区的,得动分区表。注意:改分区表是有数据风险的,动之前一定先备份。

sudo swapoff -a
fdisk -l

找到 swap 所在的分区(比如 /dev/nvme0n1p12),先停用,然后删掉旧分区、新建一个指定大小的分区,再:

sudo mkswap /dev/nvme0n1p12
sudo swapon /dev/nvme0n1p12

最后同样编辑 /etc/fstab,把原来的那行替换成新分区:

/dev/nvme0n1p12 none swap sw 0 0

再用 swapon --show 和 free -h 确认。

要不要调 swappiness

Swap 启用不等于立刻用。内核换页积极不积极,由 swappiness 控制(0–100,默认 60,值越大越早把内存换出去):

cat /proc/sys/vm/swappiness
sudo sysctl vm.swappiness=10

想永久生效就写进 /etc/sysctl.conf。数据库服务器建议调低(10 以内),避免 MySQL / PostgreSQL 的热数据被无谓地换出去,反而拖慢;桌面或内存紧张的小机器可以适当调高。

踩坑清单

  • 改了文件大小却没换路径:直接 dd 覆盖同一个 /swapfile 而没先 swapoff,写入会失败。
  • fstab 里两行 swap:旧的没删,重启后 swapon 报错或分配异常。
  • 权限没改成 600:部分系统直接拒绝启用,或者留隐私隐患。
  • swap 比内存还大:一般配 1–2 倍内存就够了,配 8 倍纯属浪费磁盘,而且会掩盖真正的内存泄漏问题。
  • 把 swap 放根目录分区:根目录本来就紧张,swap 一写满整个磁盘直接服务全挂,最好放独立卷或数据盘。

Swap 只是缓冲,不是内存。扩容能续命,真要根治还得查谁在吃内存。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表