在 Ubuntu 上运行的 Node.js 应用出现卡顿,通常不是 Node.js 本身“慢”,而是环境、代码或系统资源的问题。下面按常见原因 → 排查方法 → 解决建议来说明。
一、CPU 占用过高(最常见)
原因
- 同步代码阻塞事件循环(如大循环、JSON.parse 大文件)
- 正则灾难性回溯
- 加密 / 压缩 / 图像处理等 CPU 密集任务
排查
top
htop
看是否 node 进程 CPU 接近 100%
解决
- 避免同步阻塞
- 拆分 CPU 密集任务到
worker_threads
- 使用流式处理大文件
二、内存不足 / 频繁 GC
原因
- 内存泄漏
- 大对象常驻内存
- 容器内存限制太小(Docker)
排查
free -h
node --max-old-space-size=4096 app.js
或加监控:
node --inspect app.js
解决
- 修复闭包 / 全局变量泄漏
- 限制缓存大小
- 增加内存或拆分服务
三、磁盘 I/O 瓶颈
原因
- 大量日志写入
- 同步文件读写
- 机械硬盘 / 云盘 IOPS 低
排查
iostat -x 1
iotop
解决
四、网络问题
原因
- 外部 API 慢
- 数据库连接池不够
- DNS 解析慢
排查
curl -w "%{time_total}\n" https://api.xxx.com
netstat -antp
解决
五、Ubuntu 系统层面问题
1️⃣ swap 未开启
swapon --show
没输出说明没开 swap,容易卡死
解决:
sudo fallocate -l 2G /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
2️⃣ 文件描述符限制
ulimit -n
太低会卡在连接上
解决:
ulimit -n 65535
3️⃣ 内核参数不合理(高并发)
sysctl net.core.somaxconn
六、Node.js 版本问题
- 老版本 bug
- 不兼容 OpenSSL(Ubuntu 22+ 常见)
查看:
node -v
建议:
七、Docker / 云服务器限制
- CPU 配额太低
- 内存 limit 太小
- IO 被限速
快速自检清单 ✅
- [ ] top 看 CPU
- [ ] free 看内存
- [ ] iostat 看磁盘
- [ ] node --inspect 看火焰图
- [ ] 是否有同步代码
- [ ] 是否外部依赖慢
如果你愿意,可以告诉我:
- 是 Web 服务 / 脚本 / 爬虫 / 构建工具
- 是否 Docker
- CPU / 内存表现
- Node 版本
我可以帮你精准定位卡顿点。