在甲骨文云 Ubuntu 实例上,创建交换文件(Swap File)是防止因内存不足导致进程被杀的最直接方案,适合内存较小且无法立即升级配置的临时或轻量场景。
先说结论:增加交换分区能避免系统因内存耗尽直接崩溃,但会牺牲读写速度,不能作为长期性能解决方案。
- 适合:内存小于 2GB 的免费层实例,或运行偶尔峰值负载的非核心业务。
- 先准备:确认 boot 卷剩余磁盘空间充足,避免填满磁盘导致系统无法写入日志。
- 验收:使用 free -h 确认 swap 总量变化,并观察系统负载是否因频繁交换而过高。
命令速用版
如果你需要快速创建一个 2GB 的交换文件并启用,可依次执行以下命令:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab若提示 fallocate 不支持,可改用 dd 命令创建,但速度稍慢。
为什么会这样
甲骨文云免费层实例(尤其是 ARM 架构)通常配备的内存有限,当运行多个服务或编译大型项目时,物理内存容易被耗尽。Linux 内核为了保护系统稳定性,会触发 OOM Killer 机制强制杀死占用内存最高的进程。交换分区的作用是将部分不常用的内存数据临时写入磁盘,腾出物理内存给活跃进程使用。这本质上是用磁盘空间换内存空间,磁盘读写速度远低于内存,因此只能作为防止崩溃的缓冲,而非性能提升手段。
分步处理
1. 检查现有交换空间
执行以下命令查看当前是否已有 swap:
sudo swapon `--show`
free -h如果 Swap 行显示为 0 或空,说明需要创建。
2. 确认磁盘空间
使用 df -h 查看根目录剩余空间,确保至少有计划创建的 swap 文件大小加上预留缓冲(建议至少保留 1GB 余量)。
df -h /3. 创建交换文件
推荐使用 fallocate 快速分配空间。如果文件系统不支持,改用 dd if=/dev/zero of=/swapfile bs=1M count=2048。
4. 设置权限与格式化
出于安全考虑,交换文件权限必须设为 600,否则系统可能拒绝启用。随后初始化为 swap 格式:
sudo chmod 600 /swapfile
sudo mkswap /swapfile5. 启用并持久化
使用 swapon 立即生效,并写入 /etc/fstab 确保重启后依然有效。写入前建议备份 fstab 文件,防止配置错误导致无法启动。
怎么验证是否生效
1. 状态检查
再次运行 free -h 或 swapon `--show`,Swap 总量应显示为你设置的大小(如 2.0G)。
2. 压力测试观察
在业务运行时观察 swap 使用量。如果 Swap 使用率长期接近 100% 且系统响应极慢,说明物理内存严重不足,应考虑升级实例配置而非继续增加 swap。
3. 日志排查
查看 /var/log/syslog 或 dmesg 日志,确认不再频繁出现 Out of memory: Kill process 相关报错。
常见坑
1. 磁盘写满风险:甲骨文云免费实例 boot 卷默认较小,若分配过大 swap 文件,可能导致日志无法写入甚至系统宕机。
2. fstab 配置错误:修改 /etc/fstab 时若语法错误(如空格缺失),重启可能导致系统进入 emergency mode。务必先备份。
3. 性能误解:不要指望 swap 能提升数据库或高并发服务性能。频繁 swap 会导致 I/O 等待升高,反而拖慢系统。
4. 实例重启失效:若忘记写入 /etc/fstab,重启后 swap 会消失,需重新执行启用命令。
参考来源
- Ubuntu Community Help, "SwapFaq", https://help.ubuntu.com/community/SwapFaq
- Oracle Cloud Documentation, "Managing Compute Instances", https://docs.oracle.com/en-us/iaas/Content/Compute/Tasks/managinginstances.htm
- Linux Man Pages, "swapon(8)", https://man7.org/linux/man-pages/man8/swapon.8.html