我的VPS跑浏览器自动化踩坑记:如何把内存占用从2GB降到200MB
上周接了个爬虫项目,需要在VPS上跑无头浏览器做自动化操作。结果刚启动5个Chrome实例,我的2GB内存小服务器就直接OOM了。经过一周的折腾和优化,终于把单实例内存从2GB降到了200MB左右,今天就把这些实战经验分享给大家。
1. 为什么浏览器这么吃内存?
刚开始我也很纳闷,不就是跑个无头浏览器吗?怎么比我本地开10个网页标签还吃内存。后来用htop
监控才发现,默认的Chrome会加载一堆我们用不到的功能:
- GPU加速(无头模式根本用不上)
- 多媒体解码器(我们又不播放视频)
- 扩展程序(干净的profile很重要)
2. 换浏览器内核:从Chrome到Playwright
最开始我用的是Puppeteer,后来发现微软的Playwright对资源控制更友好。这是我最终采用的启动配置:
const { chromium } = require('playwright');
const browser = await chromium.launch({
headless: true,
args: [
'--single-process', // 单进程模式
'--no-zygote', // 禁用zygote进程
'--disable-gpu', // 禁用GPU
'--disable-dev-shm-usage', // 禁用共享内存
'--no-sandbox' // 注意安全风险!
],
ignoreDefaultArgs: [
'--mute-audio' // 不需要音频
]
});
⚠️ 注意:--no-sandbox
会降低安全性,仅建议在可信环境使用
3. 内存优化三板斧
经过反复测试,这三个参数对内存影响最大:
- –single-process:省了进程间通信的开销,内存直降40%
- –disable-dev-shm-usage:强迫使用内存而不是共享内存,避免swap
- 限制JS堆内存:通过
--js-flags="--max-old-space-size=64"
限制V8内存
4. 其他骚操作
有次半夜调试时偶然发现,设置window.navigator.webdriver = false
居然也能省内存!推测是绕过了一些检测逻辑。另外这些技巧也有效:
- 定期重启浏览器实例(我写了个cron每6小时重启)
- 禁用不必要的字体渲染(
--disable-font-subpixel-positioning
) - 使用更轻量的字体(这个省了大概15MB)
5. 监控与调优
推荐用pm2
配合--max-memory-restart
参数,我的配置:
pm2 start bot.js --name "crawler"
--max-memory-restart 150M
--cron-restart "0 */6 * * *"
现在我的2GB VPS能稳定跑8个实例,再也不用半夜收到服务器宕机的报警短信了。如果你有更好的优化方案,欢迎在评论区交流~
感谢分享!正好遇到同样的问题,明天就试试这几个参数 🚀
–no-sandbox参数有点危险啊,建议还是把安全性放在第一位