前言
最近随着复杂的自动化任务的增加,robot 项目出现了很多问题,经常要人工智能,在上次清远漂流的时候,就是经常报警,而且基本都是我人工智能解决的,厉害吧 ????。
这些问题包括:经常卡住,运行慢、卡,浏览器关不掉,CPU 和 内存 经常是满载运行的,特别是 CPU ,经常是 99% 的使用率。
Chromium 消耗最多的资源是 CPU,一是渲染需要大量计算,二是 Dom 的解析与渲染在不同的进程,进程间切换会给 CPU 造成压力(进程多了之后特别明显)。
其次消耗最多的是内存,Chromium 是以多进程的方式运行,一个页面会生成一个进程,一个进程占用 30M 左右的内存,大致估算 1000 个请求占用 30G 内存,在并发高的时候内存瓶颈最先显现。
优化最终会落在内存和 CPU 上(所有软件的优化最终都要落到这里),通常来说因为并发造成的瓶颈需要优化内存,计算速度慢的问题要优化 CPU。
所以这篇文章,我们谈谈如何优化Puppeteer的性能优化与执行速度。
Headless Chrome
,无头模式,浏览器的无界面形态,可以在不打开浏览器的前提下,在命令行中运行测试脚本,能够完全像真实浏览器一样完成用户所有操作,不用担心运行测试脚本时浏览器受到外界的干扰,也不需要借助任何显示设备,使自动化测试更稳定。
优化点
优化 Chromium 启动项
如果将Dom解析和渲染放到同一进程,肯定能提升时间(进程上下文切换的时间)。对应的配置是
single-process
部分功能 disable 掉,比如 GPU、Sandbox、插件等,减少内存的使用和相关计算。
代码如下:
const browser = await puppeteer.launch(
{
headless:true,
args: [
‘–disable-gpu’, // GPU硬件加速
‘–disable-dev-shm-usage’, // 创建临时文件共享内存
‘–disable-setuid-sandbox’, // uid沙盒
‘–no-first-run’, // 没有设置首页。在启动的时候,就会打开一个空白页面。
‘–no-sandbox’, // 沙盒模式
‘–no-zygote’,
‘–single-process’ // 单进程运行
]
});
优化Chromium执行流程
接下来我们再单独优化 Chromium 对应的页面。
每次请求都启动 Chromium,再打开 tab 页,请求结束后再关闭 tab 页与浏览器。
流程大致如下:
请求到达 -> 启动