什么是 Swap
Linux 中的 Swap 即为系统交换区,类似于 Windows 的虚拟内存,当内存不足的时候,把一部分磁盘空间虚拟成内存使用,以解决内存容量不足的情况。Linux 系统的内存管理必须使用交换区来建立虚拟内存。尽管对于交换空间的合适大小有很多意见,但这实际上取决于您的个人喜好和您的应用程序要求。通常,等于或两倍于系统 RAM 量的量是一个很好的起点。另一个好的经验法则是,如果您只是将它用作 RAM 后备,那么任何超过 4G 的交换空间都可能是不必要的。
创建交换分区
- 创建一个文件作为交换空间,这个文件可以是任何大小,但通常建议的大小是物理内存的两倍或更大
1
| sudo fallocate -l 8G /swapfile
|
1
| sudo chmod 600 /swapfile
|
- 格式化交换空间,使用
mkswap 命令将文件格式化为交换空间
- 激活交换空间,使用
swapon 命令激活交换空间
- 自动激活交换空间,为了在操作系统启动时自动激活交换空间
1
| /swapfile none swap sw 0 0
|
或者
动态调整交换分区大小
在生产环境中,发现 Swap 过大或者过小,需要不停机(动态)调整 Swap 的大小。比如,将 Swap 从 8G 降低为 4G 大小:
特别注意
无论 Swap 是扩容还是缩容(两者都需要执行 swapoff),都必须先检查系统的空闲物理内存(RAM)是否足够。
- 在执行
swapoff 前,必须确认系统的空闲物理内存(RAM)是否足够容纳 Swap 中的数据
1 2 3
| total used free shared buff/cache available Mem: 8.0G 6.5G 500M 100M 1.0G 600M Swap: 8.0G 1.8G
|
- 判断方法:
- 检测目标: Mem 的
available(可用量)必须大于 Swap 的 used(已使用量) - 如果条件不满足,执行
swapoff 会可能会引起系统崩溃或 OOM - 举例:
- 如果
available = 3G,swap used = 2G → 安全,可以直接执行 swapoff。 - 如果
available = 1G,swap used = 2G → 高危,不要直接执行 swapoff。
- 如果空闲物理内存(RAM)足够容纳 Swap 中的数据,可以直接执行
swapoff 操作- 直接执行操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| sudo swapoff /home/swap
swapon --show
sudo rm /home/swap
sudo dd if=/dev/zero of=/home/swap bs=1M count=4096 status=progress sudo chmod 600 /home/swap sudo mkswap /home/swap sudo swapon /home/swap
swapon --show
|
- 最后检查
/etc/fstab 系统配置文件,保证开机自动启用 Swap1 2 3 4
| vim /etc/fstab
/home/swap swap swap default 0 0
|
- 如果空闲物理内存(RAM)不足以容纳 Swap 中的数据,可以先增加一个临时的新 Swap,再执行
swapoff 操作- 先增加一个临时的新 Swap(大小要足以容纳旧 Swap 中的数据,不必等于旧 Swap 的总大小),让系统有额外的 Swap 缓冲
1 2 3 4 5 6 7 8
| # 创建并启用 2G 临时的新 Swap sudo dd if=/dev/zero of=/home/temp_swap bs=1M count=2048 status=progress sudo chmod 600 /home/temp_swap sudo mkswap /home/temp_swap sudo swapon /home/temp_swap
# 确认临时的新 Swap 已启用 swapon --show
|
- 关闭旧 Swap
1 2 3 4 5 6 7 8
| # 关闭旧的 Swap sudo swapoff /home/swap
# 确认旧的 Swap 已关闭 swapon --show
# 删除旧的 Swap sudo rm /home/swap
|
- 创建并启用新的 Swap
1 2 3 4 5 6 7 8
| # 创建并启用 4G 新的 Swap sudo dd if=/dev/zero of=/home/swap bs=1M count=4096 status=progress sudo chmod 600 /home/swap sudo mkswap /home/swap sudo swapon /home/swap
# 确认新的 Swap 已启用 swapon --show
|
- 关闭临时的新 Swap
1 2 3 4 5 6 7 8
| sudo swapoff /home/temp_swap
swapon --show
sudo rm /home/temp_swap
|
- 最后检查
/etc/fstab 系统配置文件,保证开机自动启用 Swap1 2 3 4
| vim /etc/fstab
/home/swap swap swap default 0 0
|
swapoff 命令的介绍
swapoff 命令的本质
- 将 Swap 中的所有数据迁回物理内存(RAM),并停用 Swap 设备。
swapoff 命令的执行过程
- 系统会尝试将 Swap 空间里被换出的内存页全部加载回物理内存(RAM)。
- 完成数据迁移后,Swap 分区或文件被标记为未启用。
- 如果只有一个 Swap,后续内存紧张时,Linux 不能再使用 Swap 作为缓冲,进程只能留在物理内存(RAM)中。
swapoff 命令的副作用
| 影响 | 具体表现 |
|---|
| 内存占用瞬间增加 | Swap 中的数据必须全部搬回物理内存(RAM),如果 RAM 不足,可能会引起系统崩溃或 OOM。 |
| 系统性能抖动 | 数据迁移会产生大量磁盘 I/O + 内存拷贝,短时间内 CPU 和 磁盘 I/O 压力上升。 |
| 进程可能被杀掉 | 如果迁移过程中可用 RAM 不足,Linux OOM Killer 会强制杀掉部分进程来释放内存。 |
| 系统无 Swap 保护 | 如果只有一个 Swap,那么在 swapoff 后,系统将会失去 Swap 的缓冲区,一旦 RAM 再次被耗尽,进程将直接被 OOM 杀掉。 |