express / puppeteer 节点应用程序中的内存泄漏?
Memory leak in express / puppeeter node app?
我是 express/node 的新手,正在尝试构建一个 api 端点以从网站检索 html :
// load express
const express = require('express');
// get app & port
const app = express();
const port = process.env.PORT || 3000 ;
// get current url parameter and process
app.get('/', function(req, res) {
const url = req.query.url;
const puppeteer = require('puppeteer') ;
(async () => {
try {
var browser = await puppeteer.launch({
headless: true,
devtools: false,
ignoreHTTPSErrors: true,
userDataDir: 'tmp' ,
args: [
'--no-sandbox',
'--single-process',
'--no-zygote',
'--disable-setuid-sandbox',
'--disable-gpu'
]
});
// build a new page
const page = await browser.newPage()
// set options
await page.setViewport({width: 800, height: 600})
await page.setDefaultNavigationTimeout( 30000 ) ;
// start time
var start = Date.now();
// explore url
try {
// goto page
const response = await page.goto(url, { waitUntil: 'load'} );
// get http response code
const response_status = response == null ? 0 : response.status() ;
// get html
const data = await page.evaluate(() => document.querySelector('*').outerHTML);
// send result
res.send({
'success' : true,
'url': url,
'http_code' : response_status ,
'time' : Date.now() - start,
'data' : data
});
}
// catch errors
catch( err ) {
// get page error
const page_error = err.toString()
// send error
res.send({
'success' : false,
'url': url,
'error' : page_error,
'time' : Date.now() - start
});
}
} catch (err) {
// send error
res.send({
'success' : false,
'url': url,
'error' : err.toString(),
'time' : Date.now() - start
});
} finally {
await browser.close();
}
})();
})
// start app
app.listen(port);
当以每秒约 1 个请求的速率使用端点时,pm2 监控显示 http 延迟增加。
第一分钟:
~10 分钟后:
使用的内存似乎也从 140M 增加到更多(几分钟后增加到 500M):
不确定内存泄漏的来源。
正如 Matthias 所建议的那样,“require puppeeter”应该在路由功能之外。它解决了这个问题。愚蠢的错误。
我是 express/node 的新手,正在尝试构建一个 api 端点以从网站检索 html :
// load express
const express = require('express');
// get app & port
const app = express();
const port = process.env.PORT || 3000 ;
// get current url parameter and process
app.get('/', function(req, res) {
const url = req.query.url;
const puppeteer = require('puppeteer') ;
(async () => {
try {
var browser = await puppeteer.launch({
headless: true,
devtools: false,
ignoreHTTPSErrors: true,
userDataDir: 'tmp' ,
args: [
'--no-sandbox',
'--single-process',
'--no-zygote',
'--disable-setuid-sandbox',
'--disable-gpu'
]
});
// build a new page
const page = await browser.newPage()
// set options
await page.setViewport({width: 800, height: 600})
await page.setDefaultNavigationTimeout( 30000 ) ;
// start time
var start = Date.now();
// explore url
try {
// goto page
const response = await page.goto(url, { waitUntil: 'load'} );
// get http response code
const response_status = response == null ? 0 : response.status() ;
// get html
const data = await page.evaluate(() => document.querySelector('*').outerHTML);
// send result
res.send({
'success' : true,
'url': url,
'http_code' : response_status ,
'time' : Date.now() - start,
'data' : data
});
}
// catch errors
catch( err ) {
// get page error
const page_error = err.toString()
// send error
res.send({
'success' : false,
'url': url,
'error' : page_error,
'time' : Date.now() - start
});
}
} catch (err) {
// send error
res.send({
'success' : false,
'url': url,
'error' : err.toString(),
'time' : Date.now() - start
});
} finally {
await browser.close();
}
})();
})
// start app
app.listen(port);
当以每秒约 1 个请求的速率使用端点时,pm2 监控显示 http 延迟增加。
第一分钟:
~10 分钟后:
使用的内存似乎也从 140M 增加到更多(几分钟后增加到 500M):
不确定内存泄漏的来源。
正如 Matthias 所建议的那样,“require puppeeter”应该在路由功能之外。它解决了这个问题。愚蠢的错误。