如何创建和管理swap分区 Linux系统优化

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~64GB4~16GB(兜底 OOM 即可)
≥ 64GB4~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

九、常见问题

  1. swapon: /swapfile: insecure permissions 0644, 0600 suggested → 没 chmod 600,立刻改。
  2. swapon: failed: Operation not permitted → 容器 / 云主机禁用 swap;或内核参数 vm.swappiness=0 不影响启用,看 dmesg。
  3. 创建后 free 里还是 0 → 没执行 swapon,或者 mkswap 失败。
  4. swap 一直被占用但内存够用 → 调小 swappiness,并执行 swapoff -a && swapon -a 清空。
  5. SSD 寿命顾虑 → swap 是高频随机写,不要放 SSD 上跑重 swap 负载;生产优先加内存。
  6. 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
喜欢就支持一下吧
点赞13 分享
评论 抢沙发
头像-次元社
欢迎您留下宝贵的见解!
提交
头像-次元社

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容