我们来系统性地讲解 Linux Swap,包括概念、实现机制、配置、优化、查看方法、常见问题以及实战练习。

📘 Linux Swap 详解
1. 什么是 Swap?
Swap(交换空间)是 Linux 内核在 物理内存不足 时,将部分不活跃的内存页(page)临时换出到 磁盘上的交换空间 的机制。
-
本质:虚拟内存扩展技术,将内存压力转移到磁盘。
-
形式:
- Swap 分区:专用磁盘分区(常见于传统安装方式)。
- Swap 文件:普通文件,挂载后作为 swap 使用(灵活,易扩容)。
📌 类比:物理内存是高速办公桌,swap 就像临时放到文件柜里,不常用的资料会被搬走,腾出桌面空间。
2. 内核的 Swap 行为
Linux 内核通过 Page Frame Reclamation(页面回收机制)决定何时启用 swap:
-
Page Aging:内核给页面打分(活跃/不活跃列表)。
-
LRU(Least Recently Used)链表:
- Active List(活跃页)
- Inactive List(可回收页)
-
Swap-out 条件:
- 内存不足,或内核检测到内存紧张。
- 内核扫描 inactive list,将不常用页写入 swap。
-
Swap-in 条件:
- 进程再次访问已 swap 出的页,触发缺页异常(page fault)。
- 内核将该页从 swap 读回内存。
3. SLES(SUSE Linux Enterprise Server)中的 Swap 配置
3.1 查看 Swap 使用情况
bash
# 总览
free -h
# 查看详细使用情况
swapon --show
# 查看内存/Swap 页面的内核统计
cat /proc/meminfo | grep -i swap
示例输出:
bash
NAME TYPE SIZE USED PRIO
/dev/dm-1 partition 8G 1G -2
3.2 添加 Swap 分区
bash
# 创建分区 (fdisk 或 parted)
mkswap /dev/nvme0n1p3
swapon /dev/nvme0n1p3
# 永久启用 (写入 /etc/fstab)
echo "/dev/nvme0n1p3 swap swap defaults 0 0" >> /etc/fstab
3.3 添加 Swap 文件
bash
# 创建 4G swap 文件
fallocate -l 4G /swapfile
# 设置权限
chmod 600 /swapfile
# 格式化
mkswap /swapfile
# 启用
swapon /swapfile
# 永久启用
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
4. Swap 优化与内核参数
4.1 swappiness 参数
控制内核使用 swap 的倾向(0-100,默认 60)。
- 0:尽可能不使用 swap,除非 OOM。
- 100:积极使用 swap,将文件缓存留在内存。
查看:
bash
cat /proc/sys/vm/swappiness
临时修改:
ini
sysctl -w vm.swappiness=10
永久修改:
bash
echo "vm.swappiness=10" >> /etc/sysctl.conf
4.2 vm.overcommit_memory
控制内核内存分配策略:
- 0:启发式分配(默认)。
- 1:总是允许超过物理内存分配。
- 2:严格模式,不允许超过 swap+物理内存。
查看:
bash
cat /proc/sys/vm/overcommit_memory
5. 常见问题 (FAQ)
Q1: Swap 是否越大越好?
❌ 不一定。Swap 过大不会提高性能,反而可能掩盖内存不足问题。
👉 建议:内存 ≤ 8GB 时,Swap=2×内存;内存 > 8GB 时,Swap≈内存或 1/2。
Q2: Swap 和 zram 有什么区别?
- Swap:基于磁盘(SSD/HDD),速度慢。
- zram:基于内存压缩,比 swap 快,但仍然占用部分 RAM。
Q3: 如何判断系统是否在频繁使用 Swap?
vmstat 1
si
(swap in)和so
(swap out)字段长时间不为 0 → 内存压力大。
Q4: swap 导致性能下降怎么办?
- 增加物理内存。
- 调低
vm.swappiness
。 - 使用 zram 替代 swap。
6. 实战练习
练习 1:查看当前 swap 使用情况
sql
free -h
swapon --show
练习 2:新建 2G swap 文件并启用
bash
fallocate -l 2G /swap_test
chmod 600 /swap_test
mkswap /swap_test
swapon /swap_test
swapon --show
练习 3:调节 swappiness 并观察效果
css
sysctl -w vm.swappiness=90
stress --vm 2 --vm-bytes 1G --timeout 60s
vmstat 1
7. 总结
- Swap:扩展内存的重要机制,但速度远慢于内存。
- 关键参数 :
vm.swappiness
、vm.overcommit_memory
。 - SLES 管理工具 :
swapon
/swapoff
、zram
支持。 - 优化建议:适度配置 swap,不要依赖过大 swap,合理调节 swappiness。