Swap(交换空间)的大小不需要与物理内存严格成比例,应根据系统内存使用情况、业务峰值以及是否需要支持系统休眠来决定,而不是简单采用「Swap = RAM × 2」的固定公式。
1. 服务器 Swap 大小建议
对于普通 Linux 服务器,Swap 主要用于缓解内存压力,可以参考以下配置:
| 物理内存 RAM | 建议 Swap |
|---|---|
| 1GB | 1~2GB |
| 2GB | 1~2GB |
| 4GB | 2~4GB |
| 8GB | 2~4GB |
| 16GB | 2~4GB |
| 32GB | 4~8GB |
| 64GB 以上 | 4~16GB |
以上只是经验参考,实际配置应结合应用的内存峰值、内存增长趋势和磁盘空间决定。
Swap 主要有三个用途:一是将暂时不活跃的内存页换出,释放物理内存;二是为内存突增提供缓冲,降低触发 OOM Killer 的风险;三是为系统休眠保存内存镜像提供存储空间。
需要注意,Swap 不能替代物理内存。频繁发生 Swap In/Out 会导致性能下降,对数据库、Redis 等延迟敏感型服务尤其不利。
2. Swappiness 参数
Linux 提供 vm.swappiness 参数,用于调整内核在匿名内存回收与文件缓存回收之间的倾向。它不是 Swap 使用率阈值。
# 查看当前配置
cat /proc/sys/vm/swappiness
# 临时调整
sudo sysctl vm.swappiness=10
常见参考值:
| 场景 | Swappiness |
|---|---|
| 普通服务器 | 10~30 |
| 数据库服务器 | 1~10 |
| 桌面系统 | 40~60 |
具体数值应结合内核版本和业务负载测试,不建议机械套用。
3. 系统休眠对 Swap 的要求
桌面系统可能会需要支持 Hibernate(休眠),Swap 的规划方式就稍有差异。
Linux 休眠时,需要将内存中的运行状态保存为休眠镜像,写入 Swap 分区或支持的 Swap 文件。下次启动时,再通过 initramfs 读取镜像并恢复系统。
因此,休眠所需的 Swap 空间取决于实际休眠镜像大小,而不是简单等于物理内存。空闲页和可丢弃缓存通常不需要完整保存。
可以参考以下初始规划:
| RAM | 仅运行服务器 | 支持休眠 |
|---|---|---|
| 4GB | 2GB | 4~6GB |
| 8GB | 2~4GB | 8~12GB |
| 16GB | 2~4GB | 16~24GB |
| 32GB | 4~8GB | 32~40GB |
| 64GB | 4~16GB | 64~72GB |
休眠配置应以实际镜像大小和内核要求为准,表中数值是偏保守的规划参考。
可以通过以下命令查看内核休眠镜像大小上限:
cat /sys/power/image_size
该值以字节为单位,表示内核期望生成的休眠镜像大小上限,并不代表实际镜像大小。
另外,Swap 容量足够也不意味着一定能够成功休眠,还需要正确配置 resume 设备、Swap 文件的 resume_offset,以及 initramfs 中的恢复参数。
4. 如何监控 Swap 使用情况?
可以使用以下命令检查内存和 Swap:
free -h
swapon --show
vmstat 1
重点关注 vmstat 中的 si 和 so,分别代表 Swap 换入和换出的速率。如果持续出现较大的数值,说明系统可能存在内存压力,需要排查内存泄漏、异常进程或容量不足,而不是单纯扩大 Swap。
总结
Linux Swap 应根据使用场景分别规划:
- 服务器: 主要用于内存压力缓冲,通常配置 2~8GB 起步,再根据业务负载调整。
- 桌面和笔记本: 如果需要支持 Hibernate,建议按照接近或超过 RAM 的容量规划,并验证实际休眠镜像能否完整写入。
还需要区分 Hibernate 和 Suspend-to-RAM:前者将内存状态写入磁盘后断电,后者则依靠持续供电保留内存状态,通常不需要额外配置与 RAM 等大的 Swap 空间。