Кукловод на Героку, ошибки памяти - PullRequest
0 голосов
/ 15 марта 2019

Попытка заставить Heroku выполнить несколько Puppeteer заданий. Локально это работает. Это медленно, но работает. Мониторинг памяти в OS X Activity Monitor, она не превышает 50 МБ. Но когда я развертываю этот сценарий в Heroku, я каждый раз получаю Memory quota exceeded, и объем памяти значительно увеличивается.

Глядя на логи, я получаю сообщение:

Process running mem=561M(106.5%).
Error R14 (Memory quota exceeded).
Restarting.
State changed from up to starting

Либо Activity Monitor не сообщает правильно память, либо что-то идет не так только при запуске сценария на Heroku. Я не могу себе представить, почему страница 25 страниц будет 561M.

Кроме того, поскольку сценарии Puppeteer должны содержаться в try/catch - ошибка памяти вызывает сбой Dyno и перезапуск. Ко времени перезапуска Dyno браузер зависает. Так что restarting мало что дает. Есть ли способ отлавливать «большинство» ошибок на Heroku, но выбрасывать при ошибке памяти R14?

1 Ответ

0 голосов
/ 17 июля 2019

У меня была похожая проблема.Я обнаружил, что если вы не закрываете браузер, вы сразу же получите ошибку R14.Что я рекомендую:

  1. Убедитесь, что вы используете один экземпляр браузера и несколько контекстов вместо нескольких браузеров.

  2. Убедитесь, что контексты закрытыпосле того, как вы позвоните в pdf

  3. Если вы обрабатываете большие страницы, вам нужно масштабировать свой экземпляр heroku, у вас нет выбора.К сожалению, вам нужно заплатить 50 $ за 1 ГБ памяти на heroku ...

    Какой-то уродливый код, но он указывает на то, что ваш контекст закрывается после вызова функции pdf.

browser.createIncognitoBrowserContext().then((context)=>{
    context.newPage().then((page)=>{
        page.setContent(html).then(()=>{
            page.pdf(options).then((pdf)=>{
                let inputStream = bufferToStream(pdf);
                let outputStream = fs.createWriteStream(path);
                inputStream.pipe(outputStream).on("finish", () => {
                    context.close().then(()=>{
                        resolve();
                    }).catch(reject);
                });
                
            });
        }).catch(reject)
    }).catch(reject)
}).catch(reject);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...