我在nodejs中有一个带有puppeteer的抓取算法,它可以同时抓取5个页面,当它完成一个页面时,它会从队列中提取下一个url并在同一页面中打开它。 CPU 始终处于 100%。如何让 puppeteer 使用更少的 cpu?
此进程在具有 4GB RAM 和 2 个 vCPU 的 digitaloceans Droplet 上运行。
我已经启动了带有一些参数的 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();
});
我的默认参数,请测试它并告诉我这是否运行顺利。 请注意,导航到易受攻击的网站时,
--no-sandbox
并不安全,但如果您正在测试自己的网站或应用程序,则没问题。所以请确保您知道自己在做什么。
const options = {
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-accelerated-2d-canvas',
'--no-first-run',
'--no-zygote',
'--single-process',
'--disable-gpu'
],
headless: true
}
return await puppeteer.launch(options)
有几个因素可能会造成这种情况。首先,检查您正在访问的网站是否使用大量 CPU。像画布和其他脚本这样的东西很容易耗尽你的CPU,特别是在使用画布时。
如果您使用 docker 进行部署,请确保使用
dumb-init
。 这里有一个很好的存储库,其中介绍了为什么你会使用这样的东西,但本质上,在处理终止时,在 docker 映像中分配的进程 ID 会出现一些问题:
EXPOSE 8080
ENTRYPOINT ["dumb-init", "--"]
CMD ["yarn", "start"]
这是我在使用 docker 处理部署时亲眼目睹并在 browserless.io 上修复的问题,CPU 使用率就是其中之一。
为了避免并行执行导致高 CPU 使用率,我必须使用
顺序执行作业p-iteration NPM 包。就我而言,这不是问题,因为我的工作不需要太多时间。
您可以根据您的场景使用 forEachSeries 或 mapSeries 函数。