问题背景
在使用阿里云轻量服务器时,经常会遇到一个令人头疼的问题:默认配置没有 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
注意事项
- 硬盘空间占用:Swap 文件会占用硬盘空间,创建前请确保有足够的磁盘空间
- 性能影响:虽然 Swap 可以缓解内存不足问题,但过度使用会导致系统变慢,因为硬盘读写速度远低于内存
- 监控使用情况:建议定期监控 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,最根本的解决方案还是升级服务器配置或优化应用程序的内存使用。