VPS内存不够用?Swap交换分区创建与调优教程

新手必撞的一堵墙:1G 内存的 VPS 装 MySQL 编译到一半突然卡死,SSH 都敲不动,重启一看日志——OOM Killer 把进程杀了。内存不够用,除了升配还有一条免费的路:Swap 交换分区,拿磁盘空间当内存的溢出缓冲。宝塔建站教程里我让你们装环境前先加 swap,今天把原理、完整命令和调优一次讲清。

Swap 是什么:保险,不是加速器

先把预期立对:swap 是用磁盘模拟内存的应急区。磁盘比内存慢一到两个数量级,进程真用上 swap 时性能是下降的——所以它解决的是「内存爆了进程被杀」的生存问题,不是性能问题。正确的定位:小内存机的防崩保险 + 冷数据换出(长期不活跃的页挪去磁盘,把物理内存让给热数据)。指望加 swap 让机器变快是不存在的,吃满 swap 的正确解读是——该升配了。

四步创建 swapfile

以创建 2G swap 为例(root 执行,Debian/Ubuntu 通用):

fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

验证:free -h 看到 Swap 行有 2.0Gi 就是生效了。四条命令各自的作用:分配文件 → 收紧权限(600 是安全底线,世界可读的 swap 文件是安全隐患)→ 格式化为 swap → 启用。老系统没有 fallocate 就用 dd if=/dev/zero of=/swapfile bs=1M count=2048 代替(慢一点而已)。

持久化:重启后别丢

swapon 是临时的,重启失效。写进 fstab 让它开机自动挂载:

echo '/swapfile none swap sw 0 0' >> /etc/fstab

改完 fstab 建议用 mount -a 验证一下没有语法错误——fstab 写错导致开机失败是经典翻车现场,谨慎点总没错。

swappiness 调优:一个参数定性格

内核参数 vm.swappiness 决定「多积极地使用 swap」,取值 0-100:值越高越倾向把 inactive 页换出去腾物理内存,越低越尽量赖在物理内存里。sysctl vm.swappiness 看当前值(多数发行版默认 60)。两种典型调法:

# 数据库/追求延迟稳定的机器:尽量少碰 swap
sysctl -w vm.swappiness=10
echo 'vm.swappiness=10' >> /etc/sysctl.conf

# 小内存多功能机:让 swap 多干活防 OOM
sysctl -w vm.swappiness=60

没有标准答案:数据库机常用 10,1G 小机跑杂项保持默认 60 反而更安全。改完观察几天 free -h 的 swap 占用再定。

大小怎么定与常见坑

场景 建议大小
1-2G 内存小机 等于内存或 2G 封顶
4G+ 内存 2G 足够(纯保险)
要休眠的桌面系统 大于内存(服务器场景用不上)

坑位清单:一,swap 不是越大越好——占磁盘且给了内核偷懒的借口,2G 封顶对 VPS 足矣;二,OpenVZ 架构不支持自建 swap(又一个无脑选 KVM 的理由,选购文讲过架构底线);三,磁盘是机械盘或高 IO 负载的机器,swap 频繁换页会拖累整机,这种环境 swappiness 调低到 10 缓解;四,内存泄漏的程序靠 swap 续命只会拖慢死亡时间,journalctl -k | grep -i oom 查到频繁 OOM 就去查进程,别怪 swap。

什么时候该删 swap 升配置

监控(uptime 命令的 load 或 Uptime Kuma 这类面板)显示 swap 长期占用超过一半、系统响应明显变肉——这说明工作集真的超过物理内存了,swap 已经从保险变成了拐杖。此时正确动作:找出吃内存大户(ps aux --sort=-%mem | head)、优化配置(比如 MySQL 的 buffer pool 砍一刀),或者直接升配——$2-3/月的差价买个安心,比看着机器苟延残喘强。

swap 相关的系统优化讲完,配合BBR 网络优化食用,小内存机的体验上限就基本拉满了。命令均为 Linux 标准用法,Debian/Ubuntu 验证通过,CentOS 系同理。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发
头像-主机测评网
欢迎您留下宝贵的见解!
提交
头像-主机测评网

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容