我在nodejs中有一个抓取算法,其中puppeteer同时刮擦5个页面,当它完成一个页面时,它从队列中拉出下一个url并在同一页面中打开它。 CPU始终为100%。如何让puppeteer使用更少的CPU?
此过程在具有4gb RAM和2个vCPU的digitaloceans droplet上运行。
我已经用一些args启动了木偶操作实例,试图让它更轻但没有发生
puppeteer.launch({
args: ['--no-sandbox', "--disable-accelerated-2d-canvas","--disable-gpu"],
headless: true,
});
我可以提供任何其他的args以减少CPU饥饿吗?
我还阻止了图片加载
await page.setRequestInterception(true);
page.on('request', request => {
if (request.resourceType().toUpperCase() === 'IMAGE')
request.abort();
else
request.continue();
});
答案 0 :(得分: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)
答案 1 :(得分:0)
有几个因素可以发挥作用。首先,检查您使用大量CPU访问的站点。诸如canvas和其他脚本之类的东西很容易在你的CPU中咀嚼,特别是在使用canvas时。
如果您使用docker进行部署,请确保使用dumb-init
。 There's a nice repo here that goes into why you'd use such a thing,但基本上在您的泊坞窗映像中分配的进程ID在处理终止时会有一些小问题:
EXPOSE 8080
ENTRYPOINT ["dumb-init", "--"]
CMD ["yarn", "start"]
这是我在browserless.io上目睹和修复的事情,因为我使用docker来处理部署,CPU使用率就是其中之一。
答案 2 :(得分:0)
为避免并行执行导致CPU使用率较高,我不得不使用
顺序执行作业p-迭代 NPM软件包。就我而言,这不是问题,因为我的工作不需要太多时间。
您可以根据自己的情况使用 forEachSeries 或 mapSeries 函数。