在服务器环境中使用 Swap(交换空间)是一个需要谨慎权衡的技术决策,虽然 Swap 可以作为物理内存不足时的“救命稻草”,但它也会显著影响系统性能。
以下是关于服务器使用 Swap 分区的全面指南,包括最佳实践、配置建议、优缺点分析以及现代替代方案。
核心原则:Swap 不是内存的替代品
- 性能差异巨大:物理内存(RAM)的读写速度比硬盘(即使是 SSD)快几个数量级,当系统频繁使用 Swap 时,会导致严重的磁盘 I/O 瓶颈,表现为系统响应极慢、延迟飙升。
- 定位:Swap 应仅作为防止 OOM(Out of Memory)崩溃的最后防线,而不是日常运行的主力内存。
Swap 大小建议
Swap 的大小取决于你的物理内存大小和业务类型:
| 物理内存 (RAM) | 推荐 Swap 大小 | 说明 |
|---|---|---|
| < 2 GB | 2 × RAM | 确保有足够的缓冲空间防止崩溃。 |
| 2 GB – 8 GB | 等于 RAM | 平衡内存与交换空间。 |
| 8 GB – 64 GB | 4 GB – 8 GB | 4GB 足够作为安全网;若运行大型数据库(如 MySQL/PostgreSQL),可适当增加。 |
| > 64 GB | 4 GB – 16 GB | 大内存服务器通常不需要大量 Swap,主要目的是防止突发峰值导致 OOM。 |
注意:对于云服务商(如 AWS、简米云、酷番云)提供的实例,通常建议开启 Swap,但大小不宜过大,以免掩盖内存泄漏问题。
关键配置:Swappiness 参数
Linux 内核通过 vm.swappiness 参数控制使用 Swap 的倾向。
- 取值范围:0 – 100
- 默认值:通常是 60(Ubuntu/CentOS 可能不同)。
- 推荐值:
- 数据库服务器 / 高性能应用:建议设置为 10 或 0。
0:仅在物理内存完全耗尽时才使用 Swap。10:轻微使用 Swap,但极力避免。
- 桌面环境 / 一般用途服务器:保持默认或设为 10-20。
- 数据库服务器 / 高性能应用:建议设置为 10 或 0。
如何修改 Swappiness:
# 查看当前值 cat /proc/sys/vm/swappiness # 临时修改(重启后失效) sudo sysctl vm.swappiness=10 # 永久修改 sudo sed -i 's/vm.swappiness=./vm.swappiness=10/' /etc/sysctl.conf sudo sysctl -p
创建 Swap 的两种方法
Swap 文件(推荐,灵活)
无需重新分区,适合云主机和已运行的服务器。
# 1. 创建 4GB 的 swap 文件 sudo fallocate -l 4G /swapfile # fallocate 不可用,使用dd 命令: # sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 # 2. 设置权限 sudo chmod 600 /swapfile # 3. 格式化为 swap sudo mkswap /swapfile # 4. 启用 swap sudo swapon /swapfile # 5. 永久生效:添加到 /etc/fstab echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Swap 分区(传统,性能略优)
适用于物理机或安装时已分区的场景。
# 假设 /dev/sdb1 是预留的 swap 分区 sudo mkswap /dev/sdb1 sudo swapon /dev/sdb1 # 在 /etc/fstab 中添加:/dev/sdb1 none swap sw 0 0
何时应该禁用 Swap?
在以下场景中,建议禁用 Swap 或将其 Swappiness 设为 0:
- 实时交易系统 / 高频交易:任何磁盘 I/O 都可能导致不可接受的延迟。
- 容器化环境(Docker/K8s):
- Kubernetes 默认建议禁用 Swap,因为 kubelet 无法准确管理容器内存限制。
- 如果必须使用,需确保 Docker 和 K8s 版本支持 Swap 管理,并仔细调优。
- SSD 寿命敏感环境:频繁写入 Swap 会加速 SSD 磨损(虽然现代 SSD 寿命较长,但仍需考虑)。
- 内存充足且无突发峰值风险:如果服务器内存始终有 30% 以上空闲,Swap 几乎无用,反而增加复杂性。
监控与调优
如何监控 Swap 使用情况?
# 查看整体内存和 swap 使用情况 free -h # 查看哪些进程在使用 swap sudo smem -t -k -P | head -n 20 # 实时监控 sudo htop # 按 F2 -> Setup -> Display options -> 勾选 "Swap usage"
常见陷阱:
- Swap 使用率高但系统仍慢:说明系统正在“抖动”(Thrashing),即频繁在内存和磁盘间交换数据,此时应增加物理内存或优化应用内存使用,而不是调整 Swap 大小。
- OOM Killer 触发:Swap 已满且物理内存耗尽,Linux 会启动 OOM Killer 杀死进程,可通过
dmesg | grep -i "out of memory"查看被杀死的进程。
现代替代方案:zRAM / zswap
对于内存受限的服务器(如小型 VPS、嵌入式设备),推荐使用 zRAM:
- 原理:在 RAM 中划分一块区域,作为压缩的 Swap 设备。
- 优点:
- 数据在内存中压缩后交换,速度远快于磁盘 Swap。
- 减少磁盘 I/O,延长 SSD 寿命。
- 无需额外磁盘空间。
- 适用场景:内存小(如 1GB-2GB)的服务器、容器节点。
# Ubuntu/Debian 安装 zram sudo apt install zram-tools # 编辑 /etc/default/zramswap 调整压缩算法和大小
总结建议
- 大多数生产服务器:保留 Swap,但设置
swappiness=10,大小 4GB 左右即可。 - 高性能/低延迟应用:禁用 Swap,确保物理内存充足。
- 小内存 VPS:优先使用 zRAM 而非磁盘 Swap。
- 永远不要依赖 Swap 来解决内存不足的问题:它只是临时缓冲,根本解决方案是优化代码、增加内存或水平扩展。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/482388.html



