pm2 Error: EMFILE, too many open files
pm2 Error: EMFILE, too many open files
我正在使用 PM2 来管理我们基于 Node.js 的微服务平台。我们想要一个仪表板,从中我们可以看到微服务状态,例如如果任何服务占用了太多 CPU 或内存,为此我使用了 PM2 的 api 并编写了以下代码。
function getMicroService(){
pm2.connect(function(err) {
if(!err){
// Get all processes running
logger.info('core_module','Connecting to PM2 Daemon for Micro Services List');
var dataArr = {};
var microServices = [];
var counter = 0;
var curDateTime = helperLib.getDateTimeISO();
pm2.list(function(err, process_list) {
if(process_list.length > 0){
process_list.forEach(function(process){
delete process.pm2_env;
process.lastChecked = curDateTime;
microServices.push(process);
counter++;
})
}
if(counter == process_list.length){
dataArr.event = 'microServices';
dataArr.data = microServices;
publishStats(dataArr);
}
});
}else{
logger.error('core_module','on Line 245: '+err)
}
})
}
上述函数每 15 秒调用一次,并在仪表板上显示数据。但我注意到此服务开始占用超过 100% 的 CPU 过多,并且 PM2 整个守护进程服务脱机并停止响应。无法发出任何命令,例如pm2 全部停止等。我不得不手动终止进程,然后再次启动服务。我从日志文件中提取的错误是
{"message":"core_module Threw Exception: ","stack":"Error: EMFILE: too many open files, open '/root/.pm2/pm2.log'\n at Object.fs.openSync (fs.js:584:18)\n at module.exports.Client.launchDaemon (/etc/node/node_modules/pm2/lib/Client.js:207:14)\n at /etc/node/node_modules/pm2/lib/Client.js:102:10\n at /etc/node/node_modules/pm2/lib/Client.js:294:14\n at _combinedTickCallback (internal/process/next_tick.js:73:7)\n at process._tickDomainCallback (internal/process/next_tick.js:128:9)","errno":-24,"code":"EMFILE","syscall":"open","path":"/root/.pm2/pm2.log","__error_callsites":[{},{},{},{},{},{}],"level":"error","timestamp":"2017-10-20T00:49:26.826Z"}
如果上面的代码正确,请哪位大神帮忙看看。每 15 秒调用一次是一个好方法,或者我该如何优化它。我应该在函数末尾调用 pm2.disconnect() 吗?
请指教
问候
哈比
您需要在最后调用 pm.disconnect()
,否则您最终将打开所有已创建的连接。它在 pm2 api documentation:
中说
If your script does not exit by itself, make sure you called pm2.disconnect() at the end.
我正在使用 PM2 来管理我们基于 Node.js 的微服务平台。我们想要一个仪表板,从中我们可以看到微服务状态,例如如果任何服务占用了太多 CPU 或内存,为此我使用了 PM2 的 api 并编写了以下代码。
function getMicroService(){
pm2.connect(function(err) {
if(!err){
// Get all processes running
logger.info('core_module','Connecting to PM2 Daemon for Micro Services List');
var dataArr = {};
var microServices = [];
var counter = 0;
var curDateTime = helperLib.getDateTimeISO();
pm2.list(function(err, process_list) {
if(process_list.length > 0){
process_list.forEach(function(process){
delete process.pm2_env;
process.lastChecked = curDateTime;
microServices.push(process);
counter++;
})
}
if(counter == process_list.length){
dataArr.event = 'microServices';
dataArr.data = microServices;
publishStats(dataArr);
}
});
}else{
logger.error('core_module','on Line 245: '+err)
}
})
}
上述函数每 15 秒调用一次,并在仪表板上显示数据。但我注意到此服务开始占用超过 100% 的 CPU 过多,并且 PM2 整个守护进程服务脱机并停止响应。无法发出任何命令,例如pm2 全部停止等。我不得不手动终止进程,然后再次启动服务。我从日志文件中提取的错误是
{"message":"core_module Threw Exception: ","stack":"Error: EMFILE: too many open files, open '/root/.pm2/pm2.log'\n at Object.fs.openSync (fs.js:584:18)\n at module.exports.Client.launchDaemon (/etc/node/node_modules/pm2/lib/Client.js:207:14)\n at /etc/node/node_modules/pm2/lib/Client.js:102:10\n at /etc/node/node_modules/pm2/lib/Client.js:294:14\n at _combinedTickCallback (internal/process/next_tick.js:73:7)\n at process._tickDomainCallback (internal/process/next_tick.js:128:9)","errno":-24,"code":"EMFILE","syscall":"open","path":"/root/.pm2/pm2.log","__error_callsites":[{},{},{},{},{},{}],"level":"error","timestamp":"2017-10-20T00:49:26.826Z"}
如果上面的代码正确,请哪位大神帮忙看看。每 15 秒调用一次是一个好方法,或者我该如何优化它。我应该在函数末尾调用 pm2.disconnect() 吗?
请指教
问候 哈比
您需要在最后调用 pm.disconnect()
,否则您最终将打开所有已创建的连接。它在 pm2 api documentation:
If your script does not exit by itself, make sure you called pm2.disconnect() at the end.