开始输入,可搜索发票、服务、域名、工单,以及 更多...
内存较小的 VPS 在编译软件、运行数据库或流量突增时,容易因内存耗尽触发 OOM,导致 MySQL 等进程被系统强制结束。Linux 添加 Swap 虚拟内存可以在物理内存不足时把不常用的数据暂存到磁盘,作为一道安全缓冲。本文介绍如何创建 swap 文件、开机自动启用以及调整 swappiness,适用于 Debian/Ubuntu 与 CentOS/Rocky/AlmaLinux 的 KVM VPS 和独立服务器。
先用 free -h 查看内存和现有 swap,用 swapon --show 确认是否已启用 swap,再用 df -h 确认根分区有足够的剩余空间。下表是常见的 swap 大小参考:
| 物理内存 | 建议 Swap 大小 |
|---|---|
| 1 GB 及以下 | 1–2 GB |
| 2–4 GB | 2 GB |
| 8 GB 及以上 | 2–4 GB(或按需) |
free -h
swapon --show
df -h /
fallocate 可以瞬间分配指定大小的文件,速度最快。如果提示不支持(部分旧版文件系统),改用 dd 逐块写入,耗时稍长但兼容性最好。下文以 2 GB 的 /swapfile 为例。
# Create a 2 GB swap file
fallocate -l 2G /swapfile
# If fallocate fails ("Operation not supported"), use dd instead
dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
swap 文件中可能包含内存里的敏感数据,必须设置为仅 root 可读写(600)。然后用 mkswap 格式化为 swap 格式,用 swapon 立即启用,再次执行 free -h 应能看到 Swap 一行的容量。
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
free -h
swapon 只对本次开机有效,需要在 fstab 中加入一行才能在重启后自动挂载 swap。修改前先备份 fstab。
cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' >> /etc/fstab
swappiness 取值 0–100,表示内核使用 swap 的积极程度。服务器场景通常希望优先使用物理内存,只在必要时才用 swap,建议设置为 10 左右。通过 /etc/sysctl.d/ 写入配置文件可以永久生效。
cat /proc/sys/vm/swappiness # usually 60 (Debian/Ubuntu) or 30 (some RHEL images)
sysctl vm.swappiness=10 # apply now
# Make it permanent
echo 'vm.swappiness=10' > /etc/sysctl.d/99-swappiness.conf
sysctl --system
如果不再需要 swap 或想调整大小,先停用并从 fstab 中删除对应行,再删除文件。调整大小时重新执行步骤 2–4 即可。
swapoff /swapfile
sed -i '\|^/swapfile |d' /etc/fstab
rm -f /swapfile
free -h
“Invalid argument”多见于 fallocate 在不支持的文件系统上创建的文件,改用 dd 重新创建即可。“Operation not permitted”通常表示服务器是容器型虚拟化,不允许自行添加 swap,此时请联系支持确认。
不是。swap 过大并不会提升性能,反而占用磁盘空间;当系统频繁使用大量 swap 时,响应会明显变慢。按上表设置即可,真正内存不足应升级配置。
可以执行 grep VmSwap /proc/*/status | sort -k2 -n | tail 查看占用 swap 最多的进程,或安装 htop 并显示 SWAP 列。
如按以上步骤操作后仍无法解决,欢迎提交工单联系 IMIDC 7×24 技术支持。提交时请注明服务器 IP、操作系统、已执行的命令和报错截图,工程师可以更快定位问题。