阿里云99元ECS 2C 1.6GB 远程开发频繁死机排查与优化实战
入手了阿里云99元/年的性价比 ECS(2 vCPU / 1.6GB 内存),使用 VS Code Remote SSH 远程开发时频繁死机。本文记录了使用 qoder CLI 排查问题、定位到内存耗尽+无 Swap 的根本原因,以及添加 Swap 文件、调整 swappiness 参数等优化方案的全过程。
问题背景
最近入手了阿里云一款99元/年的性价比ECS:
- 规格:2 vCPU / 2 GB 内存
- 系统:Rocky Linux 9.8 (Blue Onyx)
- 内核:Linux 5.14.0-687.15.1.el9_8.x86_64
- 磁盘:40GB
- 用途:远程开发 + 小服务运行
本来想着这个配置做轻量开发应该够用,可没想到实际用起来频繁死机。
问题现象
使用 VS Code Remote SSH 远程开发过程中:
- 服务器突然卡死,SSH 无法连接
- 需要去阿里云控制台强制重启才能恢复
- 重启后短时间内再次卡死,陷入死循环
- 控制台监控显示 CPU 使用率约 59.3%,并未满负荷
一开始以为是 CPU 性能不够,后来发现不对 —— CPU 没满为什么会卡死呢?
AI 辅助排查尝试
既然遇到问题了,那就请 AI 帮忙看看。
第一次尝试:火山方舟 ark-cli
最近看到火山方舟推出 9.9 元 Coding Plan,想着试试:
npm i @volcengine/ark-cli@latest -g
安装完成登录后,发现 ark-cli 并不是类似 Claude Code 这种直接在终端里分析代码和系统的 AI 编程助手,交互方式不符合预期,于是放弃。
第二次尝试:阿里云 qoder-cli
既然是阿里云的机器,那就试试阿里自家的 qoder cli:
curl -fsSL https://qoder.com.cn/install | bash
安装非常顺利,一键完成,登录后就是熟悉的终端 AI 交互界面。
我直接提问:
当我使用 vscode 远程开发时,这台服务器会死机,我已经重启很多次,帮我查找原因。
qoder 反应非常快(毕竟阿里内网访问,延迟低),开始自动分析系统信息:
- 检查重启历史
- 分析内存使用
- 查看 Swap 配置
- 列出进程占用
几分钟就给出了完整的排查报告,原因定位非常准确。
根本原因:内存耗尽 + 无 Swap
qoder 定位的问题和我后续验证一致:
内存使用情况
总内存: 1.6 GB
已用: 1.2 GB (76%)
可用: 409 MB
Swap: 0 (未配置)
内存消耗分析
| 进程 | 内存占用 | 占比 |
|---|---|---|
| VS Code 远程开发环境 | ~823 MB | 50% |
| qoderclicn | 435 MB | 26% |
| learn-backend-1 (Docker) | 340 MB | 21% |
| 4x Python uvicorn workers | 330 MB | 20% |
| dockerd + containerd | 160 MB | 10% |
关键点:VS Code Remote 自己就占了一半内存!
崩溃机制
- 内存耗尽 —— 物理内存用完了
- 无 Swap 缓冲 —— 内核 kswapd 疯狂回收内存
- 内存抖动(thrashing) —— 几乎所有进程都在等待 IO
- SSH 无法响应 —— 表现为”卡死”
- 只能强制重启 —— 重启后内存很快再次耗尽,死循环
为什么 CPU 使用率不高?因为大部分时间 CPU 在等待内存换页 IO,其实系统已经卡住了。
优化方案
根据 qoder 的建议,实施了以下优化:
1. 添加 2GB Swap 文件(必须)
目的:提供内存缓冲,防止内存耗尽时系统直接卡死。
# 创建 2GB swap 文件
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 设置开机自动挂载
echo '/swapfile none swap sw 0 0' >> /etc/fstab
2. 调整 Swappiness 参数
目的:优先使用物理内存,Swap 仅作为应急缓冲。
# 临时设置
sysctl vm.swappiness=10
# 永久设置
echo 'vm.swappiness=10' >> /etc/sysctl.conf
默认值是 30,设置为 10 表示仅在物理内存不足时使用 Swap。
3. 应用层优化建议
方案 A:升级 ECS 实例规格(长期解决)
- 当前:2 CPU / 1.6GB 内存
- 建议:2 CPU / 4GB 内存(ecs.c6.large)
- 优势:根本解决问题
方案 B:优化应用配置
- 减少 uvicorn workers:从 4 个减少到 2 个,节省约 160MB
- 限制 Docker 内存:在 docker-compose.yml 中配置内存限制
- 检查内存泄漏:关注长期占用大内存的进程
方案 C:VS Code 远程开发优化(重要)
VS Code Remote 在 1.6GB 小内存机器上默认占用约 800MB+,占了一半!
VS Code 各进程内存占用(实测):
| 进程 | 内存占用 |
|---|---|
| VS Code 扩展主机 | ~472 MB |
| VS Code Server | ~95 MB |
| Markdown 语言服务 | ~74 MB |
| PTY 主机 | ~67 MB |
| JSON 语言服务 | ~62 MB |
| 文件监视器 | ~53 MB |
| 合计 | ~823 MB |
优化建议:
- ✅ 不用时关闭 VS Code —— 断开连接后约 5 分钟自动释放全部内存,可立即释放 ~800 MB
- ✅ 禁用不必要的扩展 —— 在远程环境中只保留必需扩展
- ✅ 避免同时开多个窗口 —— 每个窗口都有独立的扩展主机
- ✅ 调整自动关闭超时 —— 缩短断连后的等待时间,更快释放内存
断开 VS Code 后,内存使用从 1.1 GB 降至约 300 MB,非常可观。
验证结果
优化后的系统状态(7月12日实测):
$ free -h
total used free shared buff/cache available
Mem: 1.6Gi 1.3Gi 72Mi 0.0Ki 401Mi 325Mi
Swap: 2.0Gi 415Mi 1.6Gi
$ swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 2G 415.4M -2
$ sysctl vm.swappiness
vm.swappiness = 10
结果:
- ✅ Swap 缓冲正常工作,已使用 415 MB
- ✅ 系统保持稳定运行,没有再出现卡死
- ✅ SSH 随时可以连接,不再需要强制重启
经验总结
给小内存 ECS 用户的建议
- 一定要开 Swap —— 1GB-2GB 内存的机器,Swap 是生命线
- VS Code Remote 很耗内存 —— 不用就关,及时释放
- CPU 不高不代表系统正常 —— 内存耗尽导致的内存抖动,CPU 使用率也上不去,但系统已经卡死
- AI 辅助排查真高效 —— qoder 这种终端 AI 能快速定位问题,节省大量时间
性价比王 99 元 ECS 还能战吗?
当然能战!只要做好优化:
- 添加 Swap 作为缓冲
- 养成关闭 VS Code 的习惯
- 控制应用进程数量
1.6GB 内存足够轻量开发 + 小服务运行,99 元/年还要什么自行车 🚲