VPS跑浏览器模拟操作怎么降低内存占用

2025.7.14 杂七杂八 1879
33BLOG智能摘要
VPS跑浏览器模拟操作怎么降低内存占用 在VPS上运行无头浏览器进行自动化操作时,浏览器的高内存占用容易导致服务器OOM。通过优化资源配置和调整参数,可以有效降低内存消耗。Chrome默认会加载许多不必要的功能,如GPU加速、多媒体解码器和扩展程序,显著增加了内存需求。采用Playwright替代Puppeteer,并结合特定启动参数,可实现更好的资源控制。关键优化参数包括:--single-process、--disable-dev-shm-usage、--disable-gpu和--no-sandbox,对降低内存占用效果显著。其中,--single-process可节省约40%内存,--js-flags用于限制V8内存,避免内存过高。其他优化技巧包括定期重启浏览器实例、禁用字体子像素定位、使用轻量字体等。结合pm2工具进行监控和内存控制,设置--max-memory-restart参数限制内存使用,并通过cron定期重启保持稳定性。通过以上方法,2GB内存的VPS可稳定运行8个浏览器实例,避免频繁宕机。
— 此摘要由33BLOG基于AI分析文章内容生成,仅供参考。

我的VPS跑浏览器自动化踩坑记:如何把内存占用从2GB降到200MB

VPS跑浏览器模拟操作怎么降低内存占用

上周接了个爬虫项目,需要在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. 内存优化三板斧

经过反复测试,这三个参数对内存影响最大:

  1. –single-process:省了进程间通信的开销,内存直降40%
  2. –disable-dev-shm-usage:强迫使用内存而不是共享内存,避免swap
  3. 限制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参数有点危险啊,建议还是把安全性放在第一位