Linux Swap 文件完全指南:从创建到调优 - Written By AI(Claude-Opus4.6)
AI创作声明:以下内容由大模型总结自我与大模型的对话。
Linux Swap 文件完全指南:从创建到调优 - Written By AI(Claude-Opus4.6)
作为一名后端开发工程师,你迟早会遇到服务器内存不够用的窘境。本文将带你深入理解 Linux Swap 的工作原理,并手把手教你如何正确地创建、启用和调优 Swap 文件。
目录
什么是 Swap?
Swap(交换空间)是 Linux 内存管理机制的重要组成部分。简单来说,它是磁盘上的一块区域,充当物理内存(RAM)的”溢出缓冲区”。
当系统的物理内存即将耗尽时,Linux 内核会将一些不活跃的内存页(inactive pages)从 RAM 移动到 Swap 空间中,从而释放 RAM 给更急需的进程使用。当这些被换出的内存页再次被访问时,内核会将它们从 Swap 读回到 RAM——这个过程叫做 swap in(换入)。
1 | |
关键概念
| 术语 | 含义 |
|---|---|
| Swap Out | 内核将不活跃内存页从 RAM 写入 Swap 空间 |
| Swap In | 内核将之前换出的页从 Swap 空间读回 RAM |
| Page | 内存管理的最小单位,通常为 4KB |
| Swappiness | 内核使用 Swap 的积极程度(0-200,默认60) |
Swap 分区 vs Swap 文件
Linux 支持两种 Swap 实现方式:
| 特性 | Swap 分区 | Swap 文件 |
|---|---|---|
| 创建方式 | 需要独立磁盘分区 | 普通文件即可 |
| 灵活性 | 创建后难以调整大小 | 可随时创建、删除、调整 |
| 性能 | 理论上略好(无文件系统开销) | 现代内核下差异极小 |
| 适用场景 | 安装时规划好的服务器 | 云服务器、VPS、临时扩展 |
| 推荐度 | ★★★☆☆ | ★★★★★(现代主流方案) |
结论:除非你有非常特殊的性能需求,否则 Swap 文件是更好的选择——灵活、简单、易管理。自 Linux 内核 2.6 以来,Swap 文件的性能已经与 Swap 分区几乎没有差别。
什么时候需要 Swap?
推荐的 Swap 大小
| 物理内存 (RAM) | 推荐 Swap 大小 | 需要休眠时 |
|---|---|---|
| ≤ 2 GB | 2× RAM | 3× RAM |
| 2 – 8 GB | 等于 RAM | 2× RAM |
| 8 – 64 GB | 至少 4 GB | 1.5× RAM |
| > 64 GB | 至少 4 GB | 不建议休眠 |
必须配置 Swap 的场景
- 小内存 VPS/云服务器(1-2GB RAM):编译代码、运行数据库时容易 OOM
- 运行 Java 应用:JVM 的内存占用往往超出预期
- 需要休眠(Hibernate):休眠时整个 RAM 内容会写入 Swap
- 数据库服务器:MySQL/PostgreSQL 等在高并发时可能突发内存需求
不太需要 Swap 的场景
- 内存充足(>64GB)且负载可预测的专用服务器
- 对延迟极其敏感的实时系统(Swap I/O 会引入不可预测的延迟)
实战:6 步创建并启用 Swap 文件
以下是在 Ubuntu/Debian 系统上创建 2GB Swap 文件的完整步骤。每一步都有详细解释。
Step 1:分配磁盘空间
1 | |
| 参数 | 说明 |
|---|---|
sudo |
以 root 权限执行(在根目录创建文件需要) |
fallocate |
快速分配磁盘空间,不实际写入数据,几乎瞬间完成 |
-l 2G |
--length 的缩写,指定文件大小为 2 GiB |
/swapfile |
文件路径,惯例放在根目录下 |
为什么用
fallocate而不是dd?传统方式是
dd if=/dev/zero of=/swapfile bs=1M count=2048,它会逐块写入零数据,2GB 可能需要几十秒。而fallocate直接在文件系统层面预留空间,速度快几个数量级。注意:
fallocate在某些文件系统(如btrfs、ZFS)上可能不支持,此时需回退到dd方式。
Step 2:锁定文件权限
1 | |
权限 600 的含义:
1 | |
为什么这一步至关重要? Swap 文件中存储的是从内存换出的数据,可能包含密码、密钥、数据库记录等敏感信息。如果其他用户可以读取 swap 文件,就等于可以窥探其他进程的内存内容——这是严重的安全漏洞。
如果跳过这一步,swapon 会发出警告:
1 | |
Step 3:格式化为 Swap 格式
1 | |
mkswap(make swap)在文件头部写入 swap 签名和元数据:
- Magic number:标识这是一个合法的 swap 空间
- UUID:唯一标识符
- 页大小信息:通常为 4096 bytes
- 可用页数:总空间除以页大小
典型输出:
1 | |
这一步类似于用
mkfs.ext4格式化磁盘分区——都是在存储介质上建立特定格式的数据结构,只不过这里的格式是 swap。
Step 4:立即激活 Swap
1 | |
执行后,Linux 内核立即开始使用该文件作为交换空间。这是即时生效的,无需重启。
但有一个问题:这只是临时生效——系统重启后,这个 swap 就不会自动挂载了。所以我们需要下一步。
Step 5:持久化配置(开机自动挂载)
1 | |
命令拆解:
| 部分 | 说明 |
|---|---|
echo '...' |
输出配置字符串 |
| |
管道符,传递给下一个命令 |
sudo tee -a |
以 root 权限追加写入文件(-a = append) |
/etc/fstab |
File System Table,系统启动时读取的挂载配置表 |
为什么不用
sudo echo '...' >> /etc/fstab?因为
>>重定向是由当前 shell 执行的,而当前 shell 是普通用户权限。sudo只提升了echo的权限,>>操作仍然会因权限不足而失败。tee命令本身被sudo提权,所以可以成功写入。这是 Linux 中一个经典的权限”坑”。
fstab 条目解析:
1 | |
Step 6:验证
1 | |
预期输出:
1 | |
| 列 | 含义 |
|---|---|
| NAME | swap 设备/文件路径 |
| TYPE | file(文件)或 partition(分区) |
| SIZE | 总大小 |
| USED | 已使用量 |
| PRIO | 优先级,数值越大越优先使用 |
其他验证方式:
1 | |
进阶:Swappiness 调优
什么是 Swappiness?
swappiness 是一个内核参数,控制内核将内存页换出到 Swap 的积极程度:
| 值 | 行为 |
|---|---|
0 |
尽可能不使用 swap(仅在内存极度不足时使用) |
10 |
推荐的服务器设置,减少 swap 使用 |
60 |
默认值,平衡策略 |
100 |
积极使用 swap |
查看当前值
1 | |
临时修改(立即生效,重启失效)
1 | |
永久修改
1 | |
调优建议
| 场景 | 推荐 swappiness | 原因 |
|---|---|---|
| 数据库服务器 | 1 - 10 | 数据库有自己的缓存管理,频繁 swap 会严重影响查询性能 |
| Web 服务器 | 10 - 30 | 减少不必要的 swap,保持响应速度 |
| 桌面系统 | 40 - 60 | 平衡内存使用和应用响应性 |
| 内存紧张的 VPS | 60 - 80 | 更积极地使用 swap,避免 OOM |
常见问题排查
1. fallocate 报错 “fallocate: fallocate failed: Operation not supported”
原因:文件系统不支持 fallocate(如 btrfs、某些网络文件系统)。
解决:改用 dd:
1 | |
2. swapon 报错 “swapon: /swapfile: read swap header failed”
原因:忘记执行 mkswap 格式化步骤。
解决:
1 | |
3. 重启后 Swap 消失
原因:没有将配置写入 /etc/fstab。
验证:
1 | |
如果没有输出,执行 Step 5 添加配置。
4. 如何关闭并删除 Swap 文件?
1 | |
5. 如何调整 Swap 大小?
无法直接调整,需要先关闭旧的,再创建新的:
1 | |
总结
完整命令速查
1 | |
流程图
1 | |
Swap 是 Linux 内存管理中不可或缺的一环。即使你的服务器有充足的内存,配置一个合理大小的 Swap 也是一种良好的实践——它为你的系统提供了一个安全网,在内存使用突增时避免 OOM Killer 直接杀死进程。
希望这篇文章对你有帮助!如果有任何疑问,欢迎在评论区讨论。
作者:一个曾经因为没配 Swap 而在凌晨被 OOM 告警吵醒的程序员 🙃
同步发文于CSDN和我的个人博客,(AI)创作不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源