从云数据库 RDS 回迁单机:我是如何靠 Swap 救回那台快崩掉的 Ubuntu 服务器的

早些年接私活、做企业站,"全家桶"式的云服务(云服务器+云数据库 RDS+对象存储)确实是标配,图的就是个省心。

但这两年形势变了,企业站需求缩减,而且各大云厂商的 RDS 价格越来越硬,对于我们这种追求"极致性价比"的技术人来说,把数据库迁回服务器做单机部署 成了基操。不过,单机部署最大的心病就是:内存不够,数据库直接 OOM(Out of Memory)崩掉。

今天就聊聊这个兜底的"救命稻草"------Swap


什么是 Swap?

简单来说,Swap 就是在你的硬盘上划出一块区域,当系统的物理内存(RAM)不够用时,内核会将一部分暂时不常用的数据挪到这块区域里。

  • 它的作用: 防止系统因为内存耗尽而直接杀死进程(比如 MySQL 进程)。
  • 它的代价: 硬盘的速度(哪怕是 SSD)远慢于内存。所以 Swap 是用来保命的,不是用来当内存扩容用的。

准备工作:检查现状

在操作之前,先看看你的 Ubuntu 22.04/24.04 是否已经开启了 Swap。

bash 复制代码
sudo swapon --show
free -h

或者使用 free -h 查看。如果返回为空,或者 Swap 行显示为 0,说明你还没设置。


实战步骤:五步开启 Swap

假设我们要创建一个 4GB 的 Swap 文件。

1. 创建交换文件

我们直接在根目录下创建一个名为 swapfile 的文件。

bash 复制代码
# 快速分配
sudo fallocate -l 2G /swapfile
# 如果报错直接用下面方式开启:count=4G 也可以,这里用 1024 * 4
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096

2. 设置权限

Swap 文件权限必须极其严格,否则系统会报错。

bash 复制代码
sudo chmod 600 /swapfile

3. 格式化并激活

bash 复制代码
sudo mkswap /swapfile
sudo swapon /swapfile

4. 设置开启自启

bash 复制代码
grep -n "/swapfile" /etc/fstab || echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

进阶:调优(后续重要!)

开启 Swap 只是第一步,在大厂的生产环境里,我们还会关注两个核心参数。

1. Swappiness(积极度)

swappiness 的值在 0 到 100 之间。

  • 值越高,内核越倾向于把数据往 Swap 挪。
  • 值越低,内核越倾向于压榨物理内存。

对于数据库服务器,我们建议设置成 10(即物理内存剩下 10% 时才开始用 Swap),这样既能保命,又不至于让系统太卡。

bash 复制代码
# 临时修改
sudo sysctl vm.swappiness=10
# 永久修改:在 /etc/sysctl.conf 末尾添加 vm.swappiness=10

2. Cache Pressure(缓存压力)

这个值决定了系统回收用于目录和 inode 对象的频率。对于数据库这种频繁操作文件的场景,建议设置为 50

bash 复制代码
# 临时修改
sudo sysctl vm.vfs_cache_pressure=50
# 永久修改:在 /etc/sysctl.conf 末尾添加 vm.vfs_cache_pressure=50

避坑指南

  1. SSD 是前提: 如果你的云服务器还在用古老的机械硬盘(HDD),开启 Swap 会导致严重的 I/O 等待,甚至让系统彻底假死。现在的 SSD 云盘是标配,可以放心开启。
  2. 监控不可少: Swap 只是"延缓死亡"。如果监控发现 Swap 被占满了,说明你的业务确实该升级内存了,而不是继续加 Swap。
  3. MySQL 的配置: 数据库迁回本地后,记得修改 my.cnf 里的 innodb_buffer_pool_size。一般来说,设置为物理内存的 50%~60% 比较稳妥。
相关推荐
小白同学_C11 小时前
Lab4-Lab: traps && MIT6.1810操作系统工程【持续更新】 _
linux·c/c++·操作系统os
今天只学一颗糖11 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构
2601_9491465312 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
儒雅的晴天12 小时前
大模型幻觉问题
运维·服务器
Gofarlic_OMS13 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
通信大师13 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g
dixiuapp13 小时前
智能工单系统如何选,实现自动化与预测性维护
运维·自动化
不做无法实现的梦~13 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
Elastic 中国社区官方博客13 小时前
如何防御你的 RAG 系统免受上下文投毒攻击
大数据·运维·人工智能·elasticsearch·搜索引擎·ai·全文检索
小锋学长生活大爆炸13 小时前
【教程】免Root在Termux上安装Docker
运维·docker·容器