问题背景

在使用阿里云轻量服务器时,经常会遇到一个令人头疼的问题:默认配置没有 Swap 交换空间。当运行内存占用较高的应用(如编译项目、运行 CI/CD 流程、部署应用等)时,服务器经常会因为内存不足而卡死或无响应。

我在每次执行 Deploy 部署操作时都会遇到这个问题,机器直接卡死,无法继续工作。通过配置 Swap 交换空间,成功缓解了这一问题,现在运行稳定多了。

什么是 Swap?

Swap(交换空间)是 Linux 系统中的一种虚拟内存技术。当物理内存(RAM)不足时,系统会将暂时不用的数据从内存转移到硬盘上的 Swap 空间,从而释放内存供其他程序使用。虽然 Swap 的读写速度比物理内存慢,但它可以有效防止系统因内存不足而崩溃。

配置步骤

1. 检查当前 Swap 状态

首先,我们需要确认系统当前是否已经配置了 Swap:

free -h
swapon --show

如果 Swap 行显示为 0,说明系统没有配置交换空间。

2. 创建 Swap 文件

根据服务器内存大小,建议创建与内存容量相等或稍大的 Swap 空间。以 2GB 内存的服务器为例,创建 2GB 的 Swap 文件:

# 方法一:使用 fallocate 快速创建(推荐)
sudo fallocate -l 2G /swapfile

# 方法二:如果 fallocate 命令不可用,使用 dd 命令
sudo dd if=/dev/zero of=/swapfile bs=1G count=2

说明

  • /swapfile 是 Swap 文件的路径,可以根据需要修改
  • 2G 表示创建 2GB 大小的文件
  • fallocate 命令速度更快,优先使用

3. 设置文件权限

为了安全,Swap 文件应该只允许 root 用户读写:

sudo chmod 600 /swapfile

4. 格式化为 Swap 格式

将创建的文件格式化为 Swap 交换空间:

sudo mkswap /swapfile

5. 启用 Swap

激活刚刚创建的 Swap 文件:

sudo swapon /swapfile

6. 验证 Swap 是否生效

再次查看内存和 Swap 状态:

free -h

输出示例:

              total        used        free      shared  buff/cache   available
Mem:           2.0G        1.2G        100M         10M        700M        600M
Swap:          2.0G          0B        2.0G

可以看到 Swap 一行已经显示 2.0G,说明配置成功。

7. 配置开机自动挂载

为了让 Swap 在系统重启后自动生效,需要将其写入 /etc/fstab 文件:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

验证 /etc/fstab 配置是否正确:

cat /etc/fstab

优化建议

调整 Swappiness 参数(可选)

swappiness 参数控制系统使用 Swap 的积极程度,取值范围 0-100:

  • 0:尽可能不使用 Swap,只在内存完全不足时使用
  • 60(默认值):平衡使用物理内存和 Swap
  • 100:积极使用 Swap

对于内存较小的服务器,建议将 swappiness 设置为 10-30,避免过度使用 Swap 导致性能下降:

# 查看当前 swappiness 值
cat /proc/sys/vm/swappiness

# 临时修改(重启后失效)
sudo sysctl vm.swappiness=10

# 永久修改
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

注意事项

  1. 硬盘空间占用:Swap 文件会占用硬盘空间,创建前请确保有足够的磁盘空间
  2. 性能影响:虽然 Swap 可以缓解内存不足问题,但过度使用会导致系统变慢,因为硬盘读写速度远低于内存
  3. 监控使用情况:建议定期监控 Swap 的使用情况,如果经常大量使用 Swap,说明需要升级服务器配置或优化应用

监控 Swap 使用情况

实时查看内存和 Swap 状态

# 查看内存使用情况
free -h

# 持续监控(每 2 秒刷新一次)
watch -n 2 free -h

查看哪些进程在使用 Swap

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

删除 Swap(如需移除)

如果以后需要删除 Swap 配置,可以执行以下步骤:

# 1. 关闭 Swap
sudo swapoff /swapfile

# 2. 从 /etc/fstab 中删除对应行
sudo sed -i '/\/swapfile/d' /etc/fstab

# 3. 删除 Swap 文件
sudo rm /swapfile

总结

配置 Swap 是解决小内存服务器运行大型应用的有效方案。虽然不能完全替代物理内存,但可以在一定程度上缓解内存不足导致的系统卡死问题。对于阿里云轻量服务器这类默认没有 Swap 的环境,强烈建议配置 Swap 以提高系统稳定性。

当然,如果应用长期大量使用 Swap,最根本的解决方案还是升级服务器配置或优化应用程序的内存使用