Chrome Headless puppeteer CPU 过多
Posted
技术标签:
【中文标题】Chrome Headless puppeteer CPU 过多【英文标题】:Chrome Headless puppeteer too much CPU 【发布时间】:2018-08-07 01:27:29 【问题描述】:我在 nodejs 中有一个带有 puppeteer 的抓取算法,它同时抓取 5 个页面,当它完成一个页面时,它会从队列中拉下一个 url 并在同一页面中打开它。 CPU 始终处于 100% 状态。如何让 puppeteer 使用更少的 cpu?
此进程在具有 4gb RAM 和 2 个 vCPU 的 digitaloceans 液滴上运行。
我用一些 args 启动了 puppeteer 实例,试图让它更轻,但什么也没发生
puppeteer.launch(
args: ['--no-sandbox', "--disable-accelerated-2d-canvas","--disable-gpu"],
headless: true,
);
我可以提供任何其他参数来减少 CPU 占用率吗?
我也阻止了图片加载
await page.setRequestInterception(true);
page.on('request', request =>
if (request.resourceType().toUpperCase() === 'IMAGE')
request.abort();
else
request.continue();
);
【问题讨论】:
这是我现在遇到的同样问题,也在 DigitalOcean 上。你有没有发现什么技巧来照顾它? 【参考方案1】:我的默认参数,请测试并告诉我这是否运行顺利。
const options =
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-accelerated-2d-canvas',
'--no-first-run',
'--no-zygote',
'--single-process', // <- this one doesn't works in Windows
'--disable-gpu'
],
headless: true
return await puppeteer.launch(options)
【讨论】:
似乎有很大帮助!谢谢! P.S.可用 args 及其含义的列表位于:peter.sh/experiments/chromium-command-line-switches 感谢@drmrbrewer 提供这个广泛的列表 谢谢,但是使用--no-sandbox
会不会很危险?
还有其他人认为会有帮助的标志吗?【参考方案2】:
为了避免导致 CPU 使用率高的并行执行,我不得不使用顺序执行作业
p 迭代 NPM 包。就我而言,这不是问题,因为我的工作不会花费太多时间。
您可以根据具体情况使用 forEachSeries 或 mapSeries 函数。
【讨论】:
【参考方案3】:有几个因素可以影响这一点。首先,检查您访问的站点是否使用大量 CPU。像画布和其他脚本这样的东西很容易消耗你的 CPU,尤其是在使用画布时。
如果您使用 docker 进行部署,请确保使用 dumb-init
。 There's a nice repo here that goes into why you'd use such a thing,但本质上,在您的 docker 映像中分配的进程 ID 在处理终止时会出现一些问题:
EXPOSE 8080
ENTRYPOINT ["dumb-init", "--"]
CMD ["yarn", "start"]
这是我在 browserless.io 上看到并修复的,因为我使用 docker 来处理部署,CPU 使用率就是其中之一。
【讨论】:
我正在使用带有哑初始化的 docker,但它仍然占用了所有 4 个内核的 50%。没有使用画布,只打开了 1 个页面。 @LaurynasMališauskas 你的 dockerfile 有没有公开的?以上是关于Chrome Headless puppeteer CPU 过多的主要内容,如果未能解决你的问题,请参考以下文章