一、先搞清楚:服务器为什么会“卡死”❄️
99% 的卡死,来自这几类资源被打满:
- 🧠 内存耗尽(最常见)
- OOM → 内核开始杀进程
- SSH 直接连不上
- 🔥 CPU 长时间 100%
- Node / Python 死循环
- SSR 高并发
- 💽 磁盘 I/O 被打满
- 日志狂写
- 数据库慢查询
- 🧵 进程 / FD 数耗尽
- too many open files
- 🌐 网络阻塞
- 大量请求 + 同机数据库
二、第一优先级:防“彻底死掉”(救命级)🧯
1️⃣ 开启 Swap(没有就等死)
free -h
如果 Swap: 0,立刻加:
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
📌 意义:
不求快,只求别直接 OOM 死机
2️⃣ 调低 OOM killer 的“误伤率”
sysctl vm.overcommit_memory=1
sysctl vm.swappiness=10
写入 /etc/sysctl.conf 永久生效。
三、进程级防护(最关键)🛡️
3️⃣ 所有服务必须有「守护 + 限制」
Node / Nuxt / SSR / Python
❌ 裸跑 node app.js
✅ 用 PM2 / systemd
PM2 示例:
pm2 start ecosystem.config.js
pm2 startup
pm2 save
并在配置中加:
max_memory_restart: '512M'
📌 效果:
- 内存异常 → 自动重启
- 不会把整台机器拖死
4️⃣ systemd 限制资源(很重要)
示例(/etc/systemd/system/api.service):
[Service]
MemoryMax=512M
CPUQuota=80%
Restart=always
RestartSec=3
📌 单个服务炸了 ≠ 整台服务器陪葬
四、立刻减少服务器负担(你已经在做,对)🧊
你现在这个思路完全正确:
👉 前端 / 静态资源 / CDN / SSR 拆出去
推荐拆法(从你当前状态出发):
| 内容 | 放哪里 |
|---|---|
| 静态文件 | OSS + CDN |
| Nuxt 前端 | Vercel / Edge / Serverless |
| API | 留在服务器 |
| 数据库 | 留在服务器 |
| 重查询 | 缓存 / 边缘 |
📌 原因:
数据库 ≠ CPU 密集,但 SSR 是
五、数据库层面防“拖死”🐘
5️⃣ PostgreSQL 必做项
SHOW shared_buffers;
SHOW work_mem;
建议(小内存机):
shared_buffers = 128MBwork_mem = 4MB
并且:
SELECT * FROM pg_stat_activity;
定期看有没有卡死的查询。
6️⃣ 禁止“慢查询无限拖”
SET statement_timeout = '5s';
或写入配置。
六、日志 & 磁盘 I/O 杀手 🪵
7️⃣ 日志必须轮转
logrotate -f /etc/logrotate.conf
确认你的:
- nginx
- node
- python
- postgres
都没在疯狂写单个日志文件
七、最低成本监控(不搞花活)📟
8️⃣ 至少装这两个:
apt install htop iotop
卡的时候看:
htop→ 谁吃 CPU / 内存iotop→ 谁在狂写磁盘
9️⃣ 防止你“不知道它死了”
最简单:
- 阿里云 云监控告警
- 内存 > 90%
- CPU > 90%