Swap分区在系统的物理内存不够用的时候,把硬盘内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。
Linux Swap 分区创建与管理教程(CentOS7,系统内存优化)
Swap 是磁盘上的一块区域,当物理内存不够时把不活跃的内存页换出到磁盘,防止 OOM。 不是越大越好:SSD 上 swap 会增加写入;HDD 上 swap 速度极慢。生产数据库建议少用 swap,主要防 OOM 兜底。
一、查看当前 Swap 状态
free -h
# 或
swapon --show
# 或详细
cat /proc/swaps
输出示例:
total used free shared buff/cache available
Mem: 7.6Gi 1.2Gi 4.5Gi 100Mi 1.9Gi 5.8Gi
Swap: 2.0Gi 0B 2.0Gi
- 如果
Swap行全是 0,说明没启用 swap。
二、方案 1:创建 Swap 文件(最常用,无需分区,灵活)
1. 创建指定大小的文件
# 创建 4GB 空文件(if=源设备 of=目标 bs=块大小 count=块数)
dd if=/dev/zero of=/swapfile bs=1M count=4096
# 或更快方式(fallocate,推荐,瞬间完成)
fallocate -l 4G /swapfile
2. 严格权限(swap 文件必须 600,否则不启用)
chmod 600 /swapfile
3. 格式化为 swap
mkswap /swapfile
输出会提示:Setting up swapspace version 1, size = 4194300 KiB no label, UUID=...
4. 启用
swapon /swapfile
验证:
free -h
swapon --show
5. 写入 fstab 开机自动挂载
vi /etc/fstab
添加一行:
/swapfile swap swap defaults 0 0
测试 fstab 无误(必做!写错开不了机):
mount -a
三、方案 2:使用独立磁盘分区(性能略好,推荐数据库机器)
假设有一块新盘 /dev/sdb:
# 1. 分区
fdisk /dev/sdb
# n 新建分区 -> p 主分区 -> 回车默认 -> t 改类型 -> 输入 82 (Linux swap) -> w 保存
# 2. 格式化swap
mkswap /dev/sdb1
# 3. 启用
swapon /dev/sdb1
# 4. fstab(推荐用UUID)
blkid /dev/sdb1
# 复制UUID,写入:
UUID="xxxx-xxxx" swap swap defaults 0 0
四、关闭与删除 Swap
# 临时关闭某个 swap
swapoff /swapfile
# 全部关闭
swapoff -a
# 删除文件
rm -f /swapfile
# 删 fstab 对应行(重要!否则下次开机报错)
五、调优 swappiness(核心参数)
vm.swappiness 表示内核多大程度倾向用 swap,范围 0~100:
- 0:尽量不用 swap(除非 OOM 临界)
- 60:默认值(桌面 / 通用)
- 100:积极使用 swap
# 查看当前值
cat /proc/sys/vm/swappiness
# 临时改(立即生效)
sysctl vm.swappiness=10
# 永久生效
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p
生产推荐值:
- 数据库 / 服务器:
10(尽量用物理内存) - 桌面 / 笔记本:
10~30 - 内存很小的机器:保持默认 60
六、推荐 Swap 大小经验值
表格
| 物理内存 | 推荐 swap |
|---|---|
| ≤ 2GB | 内存 2 倍 |
| 2~8GB | 等于内存 |
| 8~64GB | 4~16GB(兜底 OOM 即可) |
| ≥ 64GB | 4~8GB |
休眠(hibernate)场景需要 swap ≥ 内存大小;服务器一般不关机休眠,不需要太大。
七、多 Swap 优先级
如果有多个 swap(比如 SSD 一个 HDD 一个),可以指定优先级,让快的优先用:
# fstab 写法
/swapfile_ssd swap swap defaults,pri=10 0 0
/dev/sdb1 swap swap defaults,pri=5 0 0
pri 数字越大越优先。
八、实操完整示例(CentOS7 加 4G swap)
# 1. 检查现状
free -h
# 2. 创建4G文件
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 3. 永久挂载
echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
# 4. 调优
sysctl vm.swappiness=10
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p
# 5. 验证
free -h
swapon --show
九、常见问题
- swapon: /swapfile: insecure permissions 0644, 0600 suggested → 没 chmod 600,立刻改。
swapon: failed: Operation not permitted→ 容器 / 云主机禁用 swap;或内核参数vm.swappiness=0不影响启用,看 dmesg。- 创建后 free 里还是 0 → 没执行
swapon,或者 mkswap 失败。 - swap 一直被占用但内存够用 → 调小
swappiness,并执行swapoff -a && swapon -a清空。 - SSD 寿命顾虑 → swap 是高频随机写,不要放 SSD 上跑重 swap 负载;生产优先加内存。
- fstab 写错导致开机报错 → 进紧急模式,把那一行注释掉;以后改 fstab 必跑
mount -a验证。
十、配套监控命令
# 实时看内存与swap
free -h -s 1
# 看哪个进程在占 swap(按swap用量排序)
for f in /proc/*/status ; do awk '/VmSwap/{print $2" "$3" "'$f}' $f; done | sort -n | tail
# 或用 smem
yum install smem
smem -s swap -r
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END











暂无评论内容