node.js (v0.10.22) と Express モジュールを使用して、ユーザーにファイルのダウンロード機能を提供しています。リクエストごとに平均 50 個のファイルをダウンロードしており、平均サイズは約 700 MB です。実行時にこれらのファイルを書き込む独自の C プログラムと、これらのファイルをユーザーに同期的に送信する子プロセスがあります。
FFIモジュールを使用してC関数を呼び出しています。私が直面している問題は、node.js が仮想メモリを増加させ、大量のメモリが解放されず、ダウンロード後にENOMEM
エラーが発生してクラッシュすることです。ここでの質問は、各リクエストの後に V8 がメモリを解放しない理由、またはノード / V8 に必要な特別な種類のコンパイルがあるかどうかです。Valgrind を使用して C プログラムをテストしましたが、メモリ リークは見られませんでした。
async.series([
function DecryptFile(cb) {
logger.debug("call decrypting Function for========="+param);
var childProc = cp.fork(__dirname + '/child.js');
childProc.on('message', function(m) {
logger.debug('PARENT got message:', m.timestamp);
decFile=m.timestamp;
if(decFile){
if(bluetoothReq){
res.send(conf.get('contentTempFile')+decFile+"/"+ fName);
return;
}else{
logger.debug("downloading for device : "+param);
var folderPath=conf.get('contentTempFile')+decFile;
var downloadPath = path.join(folderPath, fName);
stats = fs.lstatSync(downloadPath);
if(stats.isFile()) {
res.download(downloadPath,fName, function(err){
if (err) {
// handle error, keep in mind the response may be partially-sent
// so check res.headerSent
logger.debug("res Error :");
console.log("res Error :");
} else {
// decrement a download credit etc
logger.debug("res Successfull :");
console.log("res Successfull :");
}
logger.debug("res on End :");
rmdir(folderPath, function(error){
logger.debug("content download Succefully :"+downloadPath);
console.log("delete Folder Successfull :"+downloadPath);
if(error){
logger.debug('rm -rf '+folderPath);
exec('rm -rf '+folderPath);
}
});
});
}
}
}else{
statsLogger.addStats(req,statsCode.TYPE_ERROR_DOWNLOAD,contentId,content.title+"-"+fileName);
res.send("1,Problem while Downloading ");
}
childProc.kill();
});
childProc.send({ filePath : folderName+ fileName,
temp : conf.get('contentTempFile'),
timestamp : timestamp,
fName : fName });