私はPM2を使用してNode.jsベースのマイクロサービスプラットフォームを管理しています。ダッシュボードから、マイクロサービスのステータスがわかる場所が必要でした。いずれかのサービスがあまりにも多くのCPUやメモリを占有している場合は、PM2のAPIを使用して次のコードを書きました。pm2エラー:EMFILE、オープンファイルが多すぎます
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全体のデーモンサービスはオフラインになり、応答を停止しました。たとえばコマンドを発行できませんでした。私は手動でプロセスを終了し、サービスを再開しなければなりませんでした。ログファイルから抽出したエラーは
{"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()を呼び出す必要があります。
お知らせください。
よろしく ハビブは