这是一份内容详实、结构清晰的运维笔记,补充了 Swap 的原理、演进及适用场景。
在服务器运维中,经常遇到物理内存(RAM)不足导致服务崩溃的情况,特别是运行数据库(MySQL/PostgreSQL)或 Java 应用时。合理配置 Swap(交换空间)是防止系统 OOM(内存溢出)的重要手段。
本文介绍了 Swap 的核心原理、技术演进,并提供了一键式的配置教程。
一、 核心概念与技术演进
1. Swap 的原理
Swap 是 Linux 虚拟内存管理的一部分。当物理内存(RAM)被占满时,操作系统会将内存中暂时不活跃的数据页移动到硬盘上的 Swap 空间中,从而腾出物理内存给当前活跃的进程使用。
简单理解:它是物理内存的“备胎”或“扩容包”。
2. 技术发展
早期(分区时代):早期的 Linux 强制要求在安装系统时划分独立的 Swap 分区。调整大小非常麻烦,往往涉及磁盘重新分区。
现代(文件时代):随着内核的发展,Swap 文件的性能已经与 Swap 分区几乎无异。现在主流方案更推荐使用 Swap 文件,因为它可以随时创建、删除或调整大小,无需改变磁盘结构,灵活性极高。
介质变化:随着 SSD 和 NVMe 的普及,Swap 的读写速度大幅提升,不再像机械硬盘时代那样会导致系统严重卡顿。
3. 优势
防止 OOM Killer:当内存耗尽时,Linux 会触发 OOM Killer 机制强制杀掉高内存占用的进程(通常是数据库)。Swap 提供了一个缓冲,避免服务直接崩溃。
成本优化:对于偶尔出现内存峰值的业务,增加 Swap 比升级物理内存(加钱)更经济。
系统休眠:某些场景下,系统休眠需要将内存数据写入 Swap。
二、 适用环境与系统
适用系统:Debian, Ubuntu, CentOS, Rocky Linux 等主流 Linux 发行版。
推荐场景:
小内存 VPS(如 512MB - 2GB 内存),必须配置。
运行 MySQL/Redis 等数据库服务(防止突发流量导致数据库被杀)。
编译大型软件(如编译 GCC 或内核)时。
Java 应用(JVM 比较吃内存)。
三、 实操步骤:建立 4GB Swap 文件
以下操作建议在 root 用户下进行。
1. 检查现有 Swap
在操作前,先确认系统当前是否已经有 Swap。
Bash
swapon --show
如果没有任何输出,说明当前没有开启 Swap。
2. 创建 4GB 的 Swap 文件
我们在根目录下创建一个名为 /swapfile 的文件,大小为 4G (4096MB)。
Bash
# 方式 A:使用 fallocate (推荐,速度快)
fallocate -l 4G /swapfile
# 方式 B:如果系统提示不支持 fallocate,请使用 dd 命令 (更通用但稍慢)
# dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress
3. 设置权限 (重要)
为了安全,必须限制只有 root 用户能读写该文件,防止敏感内存数据泄露。
Bash
chmod 600 /swapfile
4. 格式化并激活
将文件格式化为 Swap 格式,并立即启用。
Bash
# 标记为 swap 空间
mkswap /swapfile
# 激活 swap
swapon /swapfile
5. 设置开机自动挂载
默认情况下,重启后手动开启的 Swap 会失效。我们需要修改 /etc/fstab 文件。
Bash
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
四、 性能优化:调整 Swappiness
Swappiness 是一个 0-100 的数值,控制系统使用 Swap 的积极程度:
60 (默认):系统会比较积极地把不常用的数据存入 Swap。
0:只有物理内存完全用光时才用 Swap。
对于服务器环境,我们希望尽可能使用速度极快的物理 RAM,仅在真正紧缺时才用慢速的 Swap。因此建议将值调低至 10。
Bash
# 1. 临时生效 (用于测试)
sysctl vm.swappiness=10
# 2. 永久生效 (写入配置文件,重启依然有效)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-swap.conf
五、 最终验证
输入以下命令查看内存结构,确保设置成功:
Bash
free -h
预期输出示例:
你应该能在 Swap 这一行看到 Total 接近 4.0Gi。
Plaintext
total used free shared buff/cache available
Mem: 1.9Gi 450Mi 120Mi 1.0Mi 1.3Gi 1.3Gi
Swap: 4.0Gi 0B 4.0Gi