在 Linux 服务器的日常运维中,当物理内存面临瓶颈时,Swap(交换空间)往往是防止系统 OOM(Out Of Memory)崩溃的最后一道防线。然而,仅仅创建 Swap 是不够的,如何合理分配优先级、确保配置持久化,并在多 Swap 设备间实现高效协同,是进阶运维的必修课。
本文将以一次真实的服务器扩容操作为例,带你完整走一遍从创建 Swap 文件、调整优先级、修复权限警告到持久化配置的实战全流程。
一、 创建并启用新的 Swap 文件
在现代 Linux 发行版中,相比于传统的 Swap 分区,使用 Swap 文件具有极高的灵活性。我们可以随时动态调整其大小。
假设我们需要创建一个 2GB 的 Swap 文件,可以通过 fallocate 快速分配空间(若文件系统不支持,也可使用 dd 命令):
fallocate -l 2G /swapfile2
chmod 600 /swapfile2 # 必须设置为 600 权限,确保仅 root 可读写
mkswap /swapfile2 # 格式化为 Swap 格式
swapon /swapfile2 # 立即启用
执行 swapon --show 和 free -h 即可验证新 Swap 是否已成功挂载并纳入系统内存池。
二、 多 Swap 设备的优先级调度
当系统中存在多个 Swap 设备时,Linux 内核会根据优先级(Priority)来决定数据换入换出的顺序。数值越大,优先级越高。
为了最大化利用磁盘性能,我们通常会将新建在高速磁盘上的 Swap 设为高优先级,旧 Swap 作为兜底。首先,我们需要关闭现有的 Swap 以重新应用优先级:
swapoff /www/swap
swapoff /swapfile2
# 重新启用并指定优先级
swapon -p 10 /swapfile2 # 新 Swap,优先级 10(优先使用)
swapon -p 5 /www/swap # 旧 Swap,优先级 5(备用缓冲)
⚠️ 运维避坑指南:在执行
swapoff前,务必确保物理内存充足。如果内存已经极度紧张,强制关闭 Swap 会触发内核保护机制,导致Device or resource busy错误。此时建议先清理缓存(echo 3 > /proc/sys/vm/drop_caches)或直接安排业务低峰期重启。
三、 修复 Swap 权限警告
在重新启用旧 Swap 时,系统可能会抛出 insecure permissions 0644, 0600 suggested 的警告。这是因为 Swap 文件中可能包含敏感的内存数据,如果权限过于宽松,会带来安全隐患。
修复方法非常简单,只需在关闭状态下修正权限即可:
chmod 600 /www/swap
swapon -p 5 /www/swap
四、 持久化配置与 fstab 语法验证
临时生效的优先级在重启后会失效,我们需要将配置写入 /etc/fstab。推荐使用 pri= 参数来固化优先级:
/www/swap none swap sw,pri=5 0 0
/swapfile2 none swap sw,pri=10 0 0
在修改 /etc/fstab 后,强烈建议使用 findmnt --verify --fstab 进行语法验证。你可能会看到类似如下的警告:
[W] target specified more than once
[W] non-bind mount source /www/swap is a directory or regular file
无需惊慌:这些是 Swap 配置的正常现象。target specified more than once 是因为 Swap 的挂载点都是 none;而 regular file 则是因为我们使用的是 Swap 文件而非块设备。只要输出显示 0 parse errors, 0 errors,就说明配置绝对安全。
最后,别忘了执行 systemctl daemon-reload 让 systemd 重新加载配置缓存。
五、 总结
通过合理的优先级设置,我们可以让 Linux 内核在内存紧张时,优先使用高性能的 Swap 空间,将低速存储作为最后的缓冲池。这不仅提升了系统的响应速度,也为排查内存泄漏等深层问题争取了宝贵的时间。
Swap 只是内存管理的辅助手段,真正的性能优化始终离不开对应用内存的合理分配与物理内存的按需扩容。
你觉得这篇博客文章的逻辑和排版符合你的预期吗?需要我帮你补充一些关于 vm.swappiness 参数调优的进阶内容吗?或者需要我把它改写成更幽默、口语化的“踩坑日记”风格?
💬 评论
加载中...