为云服务器开启swap功能

2025-06-12 18:20:00
丁国栋
原创 11
摘要:本文记录如何为Linux设置swap。

给云服务器添加Swap交换空间

Swap空间是当物理内存(RAM)不足时,系统将部分内存数据交换到磁盘上的空间。

对于云服务器,尤其是内存较小的实例,添加Swap可以提高系统稳定性。因为在系统内存不充裕的情况下,如果一些出现一些突发性能情况内存很可能会严重不足,导致系统响应缓慢或者无响应并且可能会持续较长的时间,而添加了swap之后,可以一定程度上缓解这些问题,特别是一些需要瞬间性能的场景(需要使用较多的内存,但消耗内存的时间很短)。

因此个人建议,如果我们的内存不是很充裕,我们可以为云主机设置swap。

通常来说,云服务商并没有给云主机配置swap空间。主要有以下几个原因:

1. 性能考虑

  • 磁盘 I/O 瓶颈:Swap 依赖磁盘读写,而云服务器的磁盘通常是共享存储(如云硬盘或网络存储),频繁的 Swap 操作会导致 I/O 性能下降,影响整体系统响应速度。
  • SSD 寿命问题:如果云服务器使用 SSD,频繁的 Swap 写入会缩短其使用寿命。

2. 稳定性与可预测性

  • 避免性能陡降:当内存不足时,系统会频繁使用 Swap,导致服务响应变慢,甚至出现卡死现象。云厂商更希望用户直接升级内存,而不是依赖 Swap 来掩盖内存不足的问题。
  • 防止邻居干扰:在共享存储的云环境中,如果某台机器频繁使用 Swap,可能会影响同一物理主机上的其他虚拟机。

3. 商业策略

  • 鼓励用户购买更多内存:云厂商通常按内存大小计费,默认不配置 Swap 可以使用户在内存不足时选择升级配置,而不是依赖 Swap 勉强运行。
  • 简化默认配置:Swap 的优化需要根据应用场景调整(如 swappiness),默认不配置可以让用户按需自行优化。

4. 容器化与弹性伸缩的影响

  • Kubernetes 和容器环境:现代云原生应用通常运行在容器中,而 Kubernetes 等编排系统对内存限制较严格,Swap 可能导致容器被 OOM Killer 杀死,影响调度。
  • 自动伸缩替代 Swap:云厂商更推荐用户使用自动伸缩(Auto Scaling)或无服务器(Serverless)方案来应对突发流量,而不是依赖 Swap。

5. 安全与管控

  • 防止内存泄漏被掩盖:Swap 可能让内存泄漏的应用继续运行,而不会立即崩溃,导致问题更难排查。
  • 敏感数据持久化风险:Swap 可能将内存中的敏感数据(如加密密钥)写入磁盘,带来潜在的安全隐患。

什么时候应该手动添加 Swap?

尽管云厂商默认不提供 Swap,但在以下情况仍建议手动配置:

  • 内存较小的低配实例(如 1GB 内存的测试机),避免进程被 OOM Killer 直接杀死。
  • 运行传统应用(如老旧 Java 服务),这些应用可能依赖 Swap 来缓解内存压力。
  • 突发流量缓冲,在内存不足时提供短暂缓冲,让管理员有时间干预。

总结

云厂商默认不配置 Swap 主要是出于性能、稳定性和商业策略的考虑。用户可以根据自身需求手动添加 Swap,但需要注意 I/O 和性能影响,长期来看,升级内存或优化应用才是更可持续的方案

检查现有Swap空间

首先检查服务器是否已有Swap空间:

free -h
# 或
swapon --show

创建Swap文件

如果当前没有Swap或需要增加Swap空间,可以按照以下步骤操作:

1. 创建Swap文件

# 创建一个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. 使Swap永久生效

编辑/etc/fstab文件:

sudo nano /etc/fstab

添加以下行:

/swapfile swap swap defaults 0 0

调整Swap设置(可选)

调整swappiness值

swappiness值决定系统使用Swap的倾向性(0-100):

# 查看当前值
cat /proc/sys/vm/swappiness
# 临时修改(推荐设置为10-60之间)
sudo sysctl vm.swappiness=30
# 永久修改
echo "vm.swappiness=30" | sudo tee -a /etc/sysctl.conf

调整缓存压力

# 查看当前值
cat /proc/sys/vm/vfs_cache_pressure
# 修改(默认100,可以设置为50)
sudo sysctl vm.vfs_cache_pressure=50
echo "vm.vfs_cache_pressure=50" | sudo tee -a /etc/sysctl.conf

删除Swap文件(如需)

如果需要删除Swap文件:

# 禁用Swap
sudo swapoff /swapfile
# 删除Swap文件
sudo rm /swapfile
# 从/etc/fstab中删除相关行
sudo nano /etc/fstab

注意事项

  1. Swap空间大小建议:

    • 内存 < 2GB:Swap = 内存的2倍
    • 内存 2-8GB:Swap = 等于内存大小
    • 内存 > 8GB:Swap = 内存的0.5倍或更少
  2. 使用SSD的云服务器可以更安全地使用Swap,因为SSD的读写速度比HDD快得多。

  3. 过多的Swap使用会导致性能下降,因为磁盘I/O比内存慢得多。

  4. 对于生产环境数据库服务器,通常建议禁用Swap或设置极低的swappiness值。

发表评论
博客分类