什么是swap
Swap(交换分区/交换文件)是 Linux 系统中的一种内存管理机制,其核心作用可以概括为“内存溢出缓冲”和“冷热数据分离”。它通过将硬盘空间虚拟为内存使用,来缓解物理内存不足的压力。
作用
1.核心作用
防止 OOM(内存溢出)导致进程被杀 这是 Swap 在生产环境中最重要的作用。当物理内存耗尽时,如果没有 Swap,Linux 内核会触发 OOM Killer(内存溢出杀手),直接强制杀死占用内存最高的进程(通常是数据库或 Java 应用),导致服务中断。启用 Swap后,系统会将不活跃的内存页移动到磁盘上,从而腾出物理内存给关键进程,避免服务突然崩溃。
优化物理内存利用率(冷热页分离) Swap 不仅仅是“备用内存”,它是内核内存调度的杠杆。内核会将长时间未访问的“冷数据”(Cold Pages)交换到磁盘,从而释放出宝贵的物理 RAM 给更活跃的进程或用于文件系统缓存(Page Cache)。这有助于提升整体系统的响应速度,特别是在运行 Redis、Nginx 等需要大量缓存的服务时。
支持系统休眠(Hibernation) 对于笔记本电脑或需要休眠功能的桌面系统,Swap 是必须的。系统在休眠时会将整个物理内存的状态写入 Swap 分区,以便唤醒时恢复现场。此时 Swap 的大小通常建议大于或等于物理内存。
工作原理与性能影响
速度差异:Swap 位于硬盘(即使是 SSD)上,其读写速度远低于物理内存(RAM)。因此,Swap 不能用来提升程序运行速度,频繁使用 Swap(即频繁的 Swap-in/Swap-out)会导致系统性能显著下降,出现卡顿或延迟毛刺。 非永久解决方案:Swap 只是临时的缓冲手段。如果系统长期依赖 Swap 运行,说明物理内存严重不足,根本解决办法是增加物理内存或优化应用程序的内存占用。
何时需要启用 Swap?
小内存服务器(≤ 2GB):强烈建议启用。小内存服务器极易因突发流量或内存泄漏导致 OOM,Swap 能提供关键的缓冲时间。 云服务器/生产环境:建议保留少量 Swap(如 1-2GB 或物理内存的 0.5-1 倍),作为防止极端情况下的安全网。 内存充足且负载稳定:如果物理内存非常大(如 64GB+)且应用内存管理良好,可以不启用 Swap,或者仅启用极小的 Swap 以防万一。
关键配置建议:Swappiness
vm.swappiness 参数控制内核使用 Swap 的积极程度(范围 0-100): 默认值 60:适合桌面环境,但在服务器上可能导致不必要的磁盘 I/O。 推荐值 10:适合大多数 Web 服务器和数据库服务器。这意味着内核会尽量使用物理内存,仅在物理内存真正紧张时才使用 Swap,平衡了稳定性和性能。 值 0:仅在内存完全耗尽时才使用 Swap,风险较高,可能直接触发 OOM。 值 100:极其积极地使用 Swap,通常仅用于特定分析任务,不建议生产环境使用。
Swap实战
第一步创建Swap文件
以下命令创建一个 2GB 的 Swap 文件(若希望更保守,可将 count=2048 改为 4096 创建 4GB):
# 1. 创建 2GB 的空文件 (bs=1M, count=2048 => 2048MB = 2GB)
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
# 2. 设置权限为 600 (仅 root 可读写,安全要求)
sudo chmod 600 /swapfile
第二步:格式化并启用
# 3. 将文件格式化为 Swap 类型
sudo mkswap /swapfile
# 4. 立即启用 Swap
sudo swapon /swapfile
第三步:验证是否生效
free -h
第四步:设置开机自动挂载
编辑 /etc/fstab 文件,确保重启后 Swap 依然有效:
第五步:调整 Swappiness
默认情况下,Linux 的 swappiness 值为 60,意味着系统会较积极地将内存数据交换到磁盘。对于服务器,这会导致不必要的磁盘 I/O 和性能抖动。
建议将 swappiness 调整为 10,让系统尽可能使用物理内存,仅在物理内存真正不足时才使用 Swap。
# 1. 临时生效(立即执行)
sudo sysctl vm.swappiness=10
# 2. 永久生效(写入配置文件)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
# 3. 加载配置
sudo sysctl -p
值含义:
- 0:尽量不使用 Swap,除非内存彻底耗尽。
- 10:推荐值,平衡性能与稳定性。
- 60:默认值,对小内存服务器来说过于激进。
- 100:极其积极地使用 Swap,严重降低性能。

评论
评论功能暂未开放。