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 -h4. 优化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.conf5. 监控Swap使用情况
5.1 基础命令
# 查看内存和Swap总量 free -h # 查看具体Swap文件 swapon --show # 实时监控(按Ctrl+C退出) vmstat 15.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不生效的可能原因
文件系统不支持:某些云盘(如阿里云普通云盘)性能太低,内核会主动禁用Swap
- 解决方案:换成高效云盘或SSD
权限问题:
sudo chmod 600 /swapfile sudo chown root:root /swapfilefstab格式错误:
- 正确格式:
/swapfile none swap sw 0 0 - 常见错误:路径写错、参数不对
- 正确格式:
6.2 删除Swap文件
# 禁用Swap sudo swapoff /swapfile # 从fstab删除 sudo sed -i '/swapfile/d' /etc/fstab # 删除文件 sudo rm /swapfile7. 性能对比测试数据
我在1核2GB的腾讯云轻量服务器上做了测试:
| 场景 | 无Swap | 2GB Swap |
|---|---|---|
| 编译Node.js 16.0.0 | OOM崩溃 | 成功(耗时+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%的性能损失。