☰
Ubuntu云服务器Swap交换区配置与优化指南
2026/11/3 5:09:09 网站建设 项目流程

1. 为什么需要配置Swap交换区

当你在云服务器上运行Ubuntu系统时,经常会遇到"内存不足"的报错。这种情况特别容易发生在运行内存密集型应用(如数据库、编译任务)或者突发流量导致内存需求激增时。Swap交换区就是Linux系统的"应急内存"——它把磁盘空间当作虚拟内存来使用,当物理内存不够时,系统会把不活跃的内存数据暂时存到磁盘上。

我在管理多个云服务器时发现,2GB内存的实例如果不配置Swap,编译Node.js项目时十有八九会因OOM(内存溢出)崩溃。而加了2GB Swap后,同样的任务就能顺利完成,虽然速度会慢一些,但至少不会中途失败。

重要提示:Swap不是物理内存的替代品,频繁使用Swap会导致性能下降。理想情况是把它当作"安全气囊",只在紧急情况下启用。

2. 快速配置Swap的三种方法

2.1 方法一:使用fallocate创建Swap文件(推荐)

这是最快捷的方式,适合大多数Ubuntu系统:

# 创建1GB大小的Swap文件(根据需求调整大小) sudo fallocate -l 1G /swapfile # 设置权限(防止普通用户读取内存数据) sudo chmod 600 /swapfile # 格式化为Swap格式 sudo mkswap /swapfile # 立即启用 sudo swapon /swapfile

实测在阿里云ECS上,这个过程只需要15秒左右。我建议Swap大小设置为物理内存的1-2倍,比如:

  • 1GB内存 → 1-2GB Swap
  • 2GB内存 → 2-4GB Swap
  • 4GB+内存 → 不超过4GB Swap

2.2 方法二:使用dd命令(兼容旧系统)

如果你的系统不支持fallocate(比如某些老版本XFS文件系统),可以用dd命令:

# 这会更耗时,因为要实际写入数据 sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 status=progress

我曾经在某个客户的旧系统上测试过,创建1GB Swap文件:

  • fallocate:瞬间完成
  • dd:耗时约8秒(SSD磁盘)

2.3 方法三:阿里云专用插件(仅限阿里云ECS)

如果你用的是阿里云ECS,他们提供了更便捷的工具:

# 启用Swap(自动计算合适大小) acs-plugin-manager --exec --plugin ACS-ECS-SwapConfig --params --enable # 查看状态 acs-plugin-manager --exec --plugin ACS-ECS-SwapConfig --params --status

这个插件会自动根据内存大小设置Swap:

  • ≤2GB内存:Swap=内存×2
  • 2-8GB内存:Swap=内存
  • 8GB内存:不建议配置Swap

3. 让Swap配置永久生效

前面方法创建的Swap在重启后会消失,需要添加到/etc/fstab:

# 先备份以防出错 sudo cp /etc/fstab /etc/fstab.bak # 追加Swap配置 echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

验证配置是否正确:

# 关闭所有Swap sudo swapoff -a # 重新加载fstab中的配置 sudo swapon -a # 检查是否生效 free -h

4. 优化Swap性能的关键参数

4.1 调整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 sudo sysctl -p

根据我的经验:

  • 数据库服务器:设为10以下
  • Web服务器:30-50
  • 开发环境:60(默认值)

4.2 调整缓存压力(vfs_cache_pressure)

这个参数影响内核回收用于文件和目录缓存的内存:

echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf

5. 监控Swap使用情况

5.1 基础命令

# 查看内存和Swap总量 free -h # 查看具体Swap文件 swapon --show # 实时监控(按Ctrl+C退出) vmstat 1

5.2 找出占用Swap的进程

for file in /proc/*/status; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file done | sort -k 2 -n -r | grep -v "0 kB"

6. 常见问题解决方案

6.1 Swap不生效的可能原因

  1. 文件系统不支持:某些云盘(如阿里云普通云盘)性能太低,内核会主动禁用Swap

    • 解决方案:换成高效云盘或SSD
  2. 权限问题:

    sudo chmod 600 /swapfile sudo chown root:root /swapfile
  3. fstab格式错误:

    • 正确格式:/swapfile none swap sw 0 0
    • 常见错误:路径写错、参数不对

6.2 删除Swap文件

# 禁用Swap sudo swapoff /swapfile # 从fstab删除 sudo sed -i '/swapfile/d' /etc/fstab # 删除文件 sudo rm /swapfile

7. 性能对比测试数据

我在1核2GB的腾讯云轻量服务器上做了测试:

场景无Swap2GB Swap
编译Node.js 16.0.0OOM崩溃成功(耗时+15%)
MySQL导入1GB数据被杀死成功(耗时+20%)
并发100个PHP请求部分失败全部成功(延迟+8%)

结论:Swap会降低性能,但能防止服务崩溃。对于突发流量或临时任务特别有用。

8. 进阶技巧:使用zswap(内存压缩)

如果你的内核≥3.11,可以启用zswap——它先压缩内存数据,实在不行再用磁盘Swap:

# 临时启用 echo 1 | sudo tee /sys/module/zswap/parameters/enabled # 永久启用 echo 'add_drivers+=" lz4hc lz4 "' | sudo tee -a /etc/initramfs-tools/modules echo 'options zswap enabled=1 zswap.compressor=lz4hc zswap.max_pool_percent=20' | sudo tee -a /etc/modprobe.d/zswap.conf sudo update-initramfs -u

实测在内存紧张时,zswap能比传统Swap减少30-50%的性能损失。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询