📖 背景 我的云服务器是可怜的 2核2G 配置。上面挤着 MariaDB、2 个 Flask 后端、Adminer 和 Uptime Kuma。平时跑着还行,但我只要一跑备份脚本,或者有大并发访问大屏,SSH 终端突然就卡死,随后所有容器全部挂掉。
🔍 原因 小学生版解释:你的物理内存是 2 平米的仓库。现在住了 5 个租客(容器),每人占一点,仓库刚好塞满。这时候备份脚本(另一个租客)也想进来,仓库塞不下了,房东(Linux 系统)一看急眼了,直接把一个正在干活的租客扔出去(OOM Killer,Out of Memory),导致服务崩溃。
查系统日志:dmesg | grep -i oom,果然看到了 Killed process (mysqld)。
🛠 解决 物理内存不够,只能找"外援"------配置 Swap(虚拟内存)。相当于在硬盘上划出一块地,当仓库溢出时,把不常用的东西临时扔到硬盘上。
bash
# 1. 创建 2G 大小的 Swap 文件
sudo fallocate -l 2G /swapfile
# 2. 设置只有 root 能读写
sudo chmod 600 /swapfile
# 3. 格式化为 Swap 类型
sudo mkswap /swapfile
# 4. 启用它
sudo swapon /swapfile
# 5. 写入 fstab 保证重启后自动挂载
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 6. 调优 swappiness (默认60,调低到10,尽量用物理内存,实在不够再用 Swap)
sudo sysctl vm.swappiness=10
✅ 验证效果 执行 free -h,能看到 Swap 那一行有了 2.0Gi。再次跑备份脚本,系统不卡了,用 vmstat 1 看,si 和 so(Swap 换入换出率)保持在 0 或者个位数,说明物理内存稳住了。
💣 三个坑 把 swappiness 设成 0:很多人以为设成 0 就是不使用 Swap,其实在 Linux 里设为 0 往往会导致系统在极端情况下直接 OOM,保留 10 左右最好。
忘记 chmod 600:如果不设权限,系统会出于安全考虑拒绝启用。
把 Swap 放在机械硬盘上:虽然我们云服务器大概率是云盘,但如果是本地机械盘,Swap 过于频繁会导致系统巨卡,Swap 只是救命药,不是健胃消食片。