较为低配的服务器"内存不足"是每个服务器管理员都可能遇到的噩梦。当应用突然需要更多内存,或者系统负载激增时,物理内存(RAM)很快就会被耗尽,导致系统性能急剧下降,甚至触发OOM(Out of Memory)杀手进程,强制终止重要应用程序。
这时,Swap空间就像是一个应急的"安全气囊"——它不是真正的物理内存,而是硬盘上预留的一块特殊区域,用于在内存不足时临时存储不活跃的内存页。虽然Swap的读写速度远不及RAM(特别是使用传统机械硬盘时),但它能有效防止系统因内存耗尽而崩溃,为争取解决问题的时间。
本教程将介绍Swap的工作原理、配置方法和优化技巧:
为服务器建立Swap
合理调整现有Swap空间大小
优化Swap使用策略以平衡性能与稳定性
监控Swap使用情况,及时发现内存问题
无论是管理生产环境的系统管理员,还是希望优化个人Linux设备的开发者,掌握Swap管理都是必备技能。让我们开始吧!
什么是 Swap?
Swap(交换空间)是 Linux 系统中的一种虚拟内存技术,当物理内存(RAM)不足时,系统会将部分内存中的数据暂时存储到硬盘上的 Swap 分区或 Swap 文件中,以释放 RAM 空间供其他进程使用。
检查当前 Swap 使用情况
在开始管理 Swap 之前,先检查系统当前的 Swap 状态:
sudo swapon --show
free -h
cat /proc/swaps
这些命令将显示:
- 已激活的 Swap 设备/文件
- 总 Swap 空间及使用量
- 内存和 Swap 的整体使用情况
创建 Swap 文件(无 Swap 分区时)
如果系统没有 Swap 分区,可以创建 Swap 文件:
- 创建一个空文件(这里创建 4GB 的 Swap 文件):
sudo fallocate -l 4G /swapfile
如果 fallocate
不可用,可以使用:
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
- 设置正确的权限:
sudo chmod 600 /swapfile
- 格式化为 Swap 文件:
sudo mkswap /swapfile
- 启用 Swap 文件:
sudo swapon /swapfile
- 使配置永久生效(系统重启后自动挂载):
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
调整 Swap 使用倾向
Linux 内核参数 swappiness
控制系统使用 Swap 的倾向,值范围 0-100:
- 0:尽可能不使用 Swap
- 100:积极使用 Swap
查看当前值:
cat /proc/sys/vm/swappiness
临时修改(重启后失效):
sudo sysctl vm.swappiness=10
永久修改:
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
调整 Swap 空间大小
增加 Swap 空间
- 禁用当前 Swap:
sudo swapoff /swapfile
- 调整文件大小(例如增加到 8GB):
sudo fallocate -l 8G /swapfile
- 重新格式化和启用:
sudo mkswap /swapfile
sudo swapon /swapfile
减少 Swap 空间
- 禁用 Swap:
sudo swapoff /swapfile
- 缩小文件(例如减少到 2GB):
sudo truncate -s 2G /swapfile
- 重新格式化和启用:
sudo mkswap /swapfile
sudo swapon /swapfile
删除 Swap 文件
如果不再需要 Swap 文件:
- 禁用 Swap:
sudo swapoff /swapfile
- 从
/etc/fstab
中删除相关行 - 删除文件:
sudo rm /swapfile
使用多个 Swap 区域
系统可以同时使用多个 Swap 分区或文件:
sudo swapon /swapfile1
sudo swapon /swapfile2
查看所有活动的 Swap 区域:
swapon --show
性能优化建议
- SSD vs HDD:Swap 在 SSD 上性能更好,但会消耗 SSD 寿命
- Swappiness 值:服务器建议 10-30,桌面系统可稍高
Swap 大小:
- 内存 < 2GB:Swap = 2倍内存
- 内存 2-8GB:Swap = 等于内存
- 内存 > 8GB:Swap = 0.5倍内存或更少
- 监控:定期检查 Swap 使用情况,频繁使用 Swap 可能表明需要增加内存
监控 Swap 使用
# 实时监控
watch -n 1 free -h
# 查看 Swap 使用详情
vmstat 1 5
# 查看哪些进程使用了 Swap
sudo smem --sort swap
Linux 系统中的 Swap 空间,根据实际需求调整其大小和使用策略。
Linux Swap 性能影响与使用建议
Swap 的性能代价:为什么过度使用会很糟糕?
Swap 虽然可以防止内存耗尽导致系统崩溃,但它是以严重牺牲性能为代价的。以下是关键的性能问题:
1. Swap 的读取速度 vs. RAM(对比悬殊)
存储类型 | 典型延迟 | 典型带宽 | 适用场景 |
---|---|---|---|
RAM (DDR4) | ~100 ns | 20-50 GB/s | 高速计算、缓存 |
NVMe SSD (Swap) | ~50-100 μs | 2-5 GB/s | 紧急内存扩展(仍有性能下降) |
SATA SSD (Swap) | ~100-200 μs | 0.5-1 GB/s | 勉强可用,但影响明显 |
HDD (Swap) | ~5-10 ms | 50-200 MB/s | 极端情况才用,否则系统几乎卡死 |
实际影响:
- 如果应用频繁换出到 HDD Swap,响应时间可能 慢 1000 倍 以上,导致服务超时。
- 即使是 SSD/NVMe Swap,仍然比 RAM 慢 100-1000 倍,高负载下仍可能拖垮性能。
2. 典型问题场景:Swap 导致的性能灾难
案例 1:数据库服务器因 Swap 崩溃
- 现象:MySQL 查询突然变慢,从 10ms 飙升到 10s。
- 原因:内存不足,查询缓存被换出到 HDD Swap。
- 结果:数据库连接堆积,最终整个服务不可用。
案例 2:Java 应用因 Swap 停顿
- 现象:JVM 频繁 GC,每次 Full GC 耗时从 1s 变成 30s。
- 原因:JVM 堆内存被换出到 Swap,GC 需要反复读取 Swap。
- 结果:应用几乎无响应,用户请求超时。
案例 3:Kubernetes 节点因 Swap 被驱逐
- 现象:K8s 节点突然变成
NotReady
,Pod 被驱逐。 - 原因:节点内存耗尽,Swap 使用过高,Kubelet 判定节点异常。
- 结果:Pod 被重新调度,服务短暂中断。
3. 什么时候该用 Swap?什么时候该避免?
✅ 适合使用 Swap 的场景
- 低内存服务器(< 4GB RAM):避免 OOM Killer 直接杀进程。
- 突发内存需求:临时应对流量高峰,争取时间扩容。
- 开发/测试环境:防止因内存泄漏导致系统崩溃。
❌ 应避免 Swap 的场景
- 高性能数据库(MySQL、Redis、Elasticsearch):禁用 Swap 或设置
vm.swappiness=1
。 - Kubernetes 生产环境:默认建议关闭 Swap(
--fail-swap-on=false
需谨慎)。 - 延迟敏感型应用(高频交易、实时计算):Swap 会导致不可预测的延迟。
4. 最佳实践:如何减少 Swap 的性能影响?
- 优先加内存:Swap 是应急方案,不是 RAM 的替代品。
- 使用 SSD/NVMe Swap(避免 HDD):至少比机械硬盘快 100 倍。
- 调整
vm.swappiness
(建议 1-10):减少内核主动使用 Swap 的倾向。 - 监控 Swap 使用(如
vmstat 1
、sar -S 1
):发现异常时及时扩容或优化应用。 - 关键服务限制内存(
cgroups
、docker --memory
):防止单个进程耗尽内存触发 Swap。
Swap 是最后的保险,不是解决方案
Swap 可以防止系统崩溃,但无法提供良好性能。
- 如果 Swap 使用率经常 > 0%,说明内存不足,应该扩容 RAM。
- 如果 Swap 频繁读写,系统已经处于危险状态,必须优化!
合理使用 Swap,但永远不要依赖它! 🚀