近在云服务器上部署了几个个人项目,但发现这台入门级的 2核2G(2h2g)服务器经常会出现运行一段时间后莫名其妙卡死、SSH连接断开,甚至后台提示磁盘 I/O 读写异常的情况 😫。
经过一番排查,终于找到了问题的根源,并用一个非常简单的方法彻底解决了。今天就把这次的排坑经验分享出来,希望能帮到同样在用小内存服务器跑服务的朋友们 🤝。
🔍 问题排查:为什么服务器会频繁卡死?
很多入门级云服务器的配置是 2核2G,实际可用物理内存往往只有 1.6G 左右。当我们运行 Docker 容器、数据库(如 MySQL)或者 Java 应用时,2G 内存很快就捉襟见肘了 📉。
通过在终端输入 free -h 命令查看内存使用情况,你会发现物理内存(Mem)几乎被吃满,而 Swap(虚拟内存)一栏显示的全是 0B。
结论非常清晰 🎯: 当物理内存耗尽时,Linux 系统为了保护自身,会触发 OOM(内存溢出)机制强制杀死占用内存最高的进程,或者因为频繁读写硬盘导致 I/O 飙升,最终导致服务器直接“假死” 💀。
🛠️ 解决方案:给服务器加个“安全气囊”(Swap分区)
既然物理内存不够用,我们就给服务器划出一部分硬盘空间当作“备用内存”来用,这就是 Swap(交换分区) 💾。它就像一个“安全气囊” 🛡️,平时你可能感觉不到它的存在,但在内存告急的关键时刻,它能保证你的服务器不直接宕机。
以下是具体的操作步骤(适用于 Ubuntu / Debian / CentOS 等主流 Linux 系统 🐧):
1️⃣ 检查磁盘剩余空间
首先,我们需要确认硬盘里有足够的空间来创建 Swap 文件。执行命令:
bash
编辑
1df -h查看挂载点为 /(根目录)的那一行,确保 Avail(可用空间)大于你想要设置的 Swap 大小(建议设置为 2G)。
2️⃣ 清理可能存在的旧 Swap 文件
如果你之前尝试过创建,可以先执行以下命令清理一下(如果提示文件不存在,直接忽略即可):
bash
编辑
1sudo swapoff /swapfile
2sudo rm -f /swapfile3️⃣ 创建并启用 2G 的 Swap 文件
依次执行以下 4 条命令,完成 Swap 文件的创建、权限设置、格式化和启用:
bash
编辑
1# 创建一个 2G 大小的 swap 文件
2sudo fallocate -l 2G /swapfile
3
4# 设置文件权限,保证安全
5sudo chmod 600 /swapfile
6
7# 将该文件格式化为 swap 格式
8sudo mkswap /swapfile
9
10# 立即启用 swap 文件
11sudo swapon /swapfile4️⃣ 设置开机自动挂载
为了防止服务器重启后 Swap 失效,我们需要把它写入系统配置文件:
bash
编辑
1echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab5️⃣ 优化 Swap 使用倾向(Swappiness)
Linux 默认的 Swap 使用倾向较高,为了避免系统过早地频繁使用硬盘 Swap 导致卡顿,建议将这个值设为 10(即内存真的快不够用时才动用 Swap):
bash
编辑
1# 临时生效
2sudo sysctl vm.swappiness=10
3# 永久生效(写入配置文件)
4echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf6️⃣ 验证是否成功
最后,再次执行 free -h 命令。只要看到输出结果中 Swap 这一行的 total 变成了 2.0Gi 左右,就说明你的“安全气囊”已经完美安装好了!✅
🚀 进阶优化:Docker 容器的内存限制
解决了 Swap 问题后,服务器基本不会再出现直接卡死的情况。但为了让 2G 小内存服务器跑得更丝滑,我还建议对 Docker 容器做一些限制 🐳:
限制容器的内存上限:在启动 Docker 时加上
-m 1024m --memory-swap=1024m参数,防止单个应用无节制地吃光所有内存。限制 Docker 日志大小:加上
--log-opt max-size=10m --log-opt max-file=3参数,避免日志文件无限增长打满磁盘 I/O。
📌 总结
对于入门级的 2核2G 服务器来说,启用 Swap 是保障服务稳定运行的“必修课” 📝。虽然硬盘 Swap 的速度不如物理内存,但它能有效避免因内存溢出导致的服务器崩溃。希望这篇记录能帮你解决 Linux 服务器卡顿的烦恼!✨