Linux添加Swap交换分区,解决内存不足问题

前言

服务器内存不够用了?MySQL 启动就报内存不足?或者运行着运行着就被 OOM Killer 杀进程了?这时候除了加内存条,还有个应急办法——加 Swap 交换分区。Swap 就是把磁盘的一部分当内存用,虽然慢,但能救急。本文就讲一下怎么在 Linux 下添加 Swap 交换分区。

什么是 Swap

Swap 交换分区,就是把磁盘的一部分空间当作内存来用。当物理内存不够的时候,系统会把不常用的内存数据换到磁盘上,腾出物理内存给正在用的进程。

注意: Swap 只是应急方案,不能当内存用。磁盘比内存慢几百倍,如果频繁使用 Swap,系统会非常卡。

第一步:查看当前 Swap 情况

先看看现在有没有 Swap,多大:

free -h

输出示例:

              total        used        free      shared  buff/cache   available
Mem:          1.8Gi       1.2Gi       200Mi        50Mi       400Mi       300Mi
Swap:            0B          0B          0B

上面的例子里 Swap 是 0B,说明没有配置 Swap。

也可以看:

swapon -s

第二步:创建 Swap 文件

我们用文件的方式创建 Swap,比分区方式灵活,随时可以删。

1. 创建一个 2G 的 Swap 文件

dd if=/dev/zero of=/swapfile bs=1M count=2048

参数说明:

  • if=/dev/zero:输入源,零设备
  • of=/swapfile:输出文件
  • bs=1M:块大小1M
  • count=2048:2048块,也就是2G

2. 设置文件权限

chmod 600 /swapfile

必须设置成 600,不然系统不认。

3. 格式化成 Swap

mkswap /swapfile

输出会显示:

Setting up swapspace version 1, size = 2097151 KiB
no label, UUID=xxxx-xxxx

第三步:启用 Swap

swapon /swapfile

查看是否启用成功:

free -h

现在应该能看到 Swap 那行有数值了。

第四步:配置开机自动挂载

写入 /etc/fstab,重启后自动启用。

vi /etc/fstab

在最后一行添加:

/swapfile swap swap defaults 0 0

第五步:调整 Swap 使用优先级

Linux 默认是尽量用物理内存,Swap 只用在内存不够的时候。这个策略一般不用改。

如果想调整 Swap 的使用倾向,可以改 /etc/sysctl.conf:

vm.swappiness = 10

swappiness 值范围是 0~100:

  • 0:尽量不用 Swap
  • 100:积极使用 Swap
  • 10:推荐值,内存不够才用 Swap

改完执行:

sysctl -p

常见操作

查看 Swap 使用情况

swapon -s

关闭 Swap

swapoff /swapfile

删除 Swap

swapoff /swapfile
rm /swapfile

然后把 /etc/fstab 里那行也删掉。

实际应用场景

场景1:MySQL 启动报内存不足

MySQL 启动的时候需要加载很多数据到内存,如果内存不够会直接启动失败。加个 Swap 就能启动了。

场景2:临时跑大任务

有时候要临时跑个大任务,内存不够,加个 Swap 救急。

场景3:防止 OOM Killer 杀进程

内存不够的时候,系统会用 OOM Killer 杀掉占内存最多的进程。加个 Swap 能缓冲一下,避免直接被杀。

常见坑

坑1:Swap 文件权限不对

创建完 Swap 文件之后忘了 chmod 600,结果 swapon 报错。

解决: 一定要先设置权限:

chmod 600 /swapfile

坑2:/etc/fstab 写错了

和挂载硬盘一样,/etc/fstab 写错了重启会进不去系统。

解决: 改完先执行 swapon -a 测试一下。

坑3:Swap 太大了影响性能

Swap 不是越大越好。如果 Swap 用得很频繁,系统会非常卡,因为磁盘比内存慢几百倍。

建议: Swap 大小设成物理内存的 0.5~2 倍就够了。比如 2G 内存,Swap 设 2~4G 就行。

坑4:SSD 上放 Swap 还好,机械硬盘上放 Swap 很卡

如果是机械硬盘,频繁读写 Swap 会非常卡。SSD 还好一点。

总结

添加 Swap 的完整流程:

  1. dd 创建 Swap 文件
  2. chmod 600 设置权限
  3. mkswap 格式化
  4. swapon 启用
  5. 写 /etc/fstab 开机自动挂载
  6. 调整 swappiness 优先级

Swap 只是应急方案,真正解决内存不足还是要加物理内存。但应急的时候,Swap 确实能救一命。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:44 

Linux查看内存使用情况,free和vmstat命令详解

前言

服务器卡了,第一反应就是看看内存够不够用。很多人一看到 free 很少就慌了,觉得内存不够要扩容。其实 Linux 的内存管理和 Windows 不一样,free 少不代表内存真的不够。本文就讲一下怎么用 free 和 vmstat 两个命令正确查看内存使用情况。

free 命令

基本用法

直接输入:

free

输出示例:

              total        used        free      shared  buff/cache   available
Mem:        8165036     4000000     2000000       50000     2165036     4000000
Swap:       2097148           0     2097148

输出详解

列 含义
total 总内存大小
used 已使用的内存
free 完全空闲的内存
shared 共享内存
buff/cache 缓存和缓冲区占用的内存
available 真正可用的内存(重点看这列)

重点:available 才是真正可用的内存

很多人只看 free 列,看到只剩几百M就慌了。其实 Linux 会把空闲内存都用来做缓存(buff/cache),这些缓存是可以随时回收的。

看 available 列才是真正可用的内存。 比如上面的例子,free 只有2G,但 available 有4G,说明还有4G内存可以用。

free 常用参数

free -h

以人类可读的格式显示(自动用G/M/K单位):

              total        used        free      shared  buff/cache   available
Mem:           7.8Gi       3.8Gi       1.9Gi        50Mi       2.1Gi       3.8Gi
Swap:          2.0Gi          0B       2.0Gi
free -m

以MB为单位显示。

free -g

以GB为单位显示。

free -s 5

每5秒刷新一次。

free -c 3

总共显示3次后退出。

vmstat 命令

基本用法

直接输入:

vmstat

输出示例:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 2000000  50000 2100000    0    0    10    20   100   50  5  2 92  1  0

输出详解

procs 进程部分:

  • r:等待运行的进程数
  • b:处于不可中断睡眠的进程数

memory 内存部分:

  • swpd:已用的交换分区大小
  • free:空闲内存
  • buff:缓冲区大小
  • cache:缓存大小

swap 交换分区部分:

  • si:从磁盘交换到内存的速度(KB/s)
  • so:从内存交换到磁盘的速度(KB/s)

io 磁盘I/O部分:

  • bi:从磁盘读取的速度(块/s)
  • bo:写入磁盘的速度(块/s)

cpu CPU部分:

  • us:用户态CPU占用
  • sy:内核态CPU占用
  • id:空闲CPU
  • wa:等待I/O的CPU
  • st:被虚拟机偷走的CPU

vmstat 常用参数

vmstat 1

每秒刷新一次,按 Ctrl+C 退出。

vmstat 1 5

每秒刷新一次,总共刷新5次。

vmstat -s

显示内存统计信息。

怎么判断内存够不够用

看 available 够不够

free -h

看 available 列,如果 available 还有几百M以上,说明内存够用。

看 swap 用了多少

free -h

如果 Swap 的 used 列有数值,说明物理内存不够用了,系统在把内存数据换到磁盘上。这时候性能会大幅下降。

看 si 和 so

vmstat 1

如果 si 和 so 列长期不为0,说明系统在频繁换页,内存不够用了。

实际排查案例

案例1:内存够不够

free -h

看 available 列,如果还有几个G,说明内存够用。

案例2:系统变慢,怀疑内存不足

vmstat 1

看 si 和 so 是不是很高,如果很高说明在频繁换页,内存不够。

案例3:哪个进程占内存最多

top

按 M 键按内存排序,看哪个进程占的内存最多。

常见坑

坑1:把 free 少当成内存不足

Linux 的内存管理机制和 Windows 不一样,空闲内存都用来做缓存了,buff/cache 那部分是可以随时回收的。看 available 列才是真正可用的内存。

坑2:看到 swap 用了就慌

如果 swap 用了一点,但 si 和 so 都是0,说明那是历史遗留的,不影响性能。只有当 si 和 so 长期不为0的时候才是问题。

坑3:内存不够就随便扩容

内存不够的原因可能有很多:

  • 某个程序内存泄漏
  • 数据库缓存配置太大
  • 日志缓存没配置

先找出原因,再决定要不要扩容。

总结

查看内存使用情况的核心命令:

  1. free -h:快速看内存总览,重点看 available 列
  2. vmstat 1:实时监控内存和换页情况,看 si 和 so
  3. top 按M:看哪个进程占内存最多

记住一个原则:Linux 的 free 少不是问题,available 少才是问题。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:36