簡體   English   中英

Node.js WebSocket服務器中的內存泄漏

[英]Memory leaks in nodejs websocket server

我正在使用websocket傳輸視頻文件,這意味着它們是大文件。 服務器端(以及客戶端)使用nodejs和javascript中的binaryjs實現。

一切正常,直到我開始擁有大量客戶端,才使服務器崩潰(進程被Linux OS殺死)。 正如我所觀察到的,它耗盡了內存,因為對於每個客戶端來說,它占用了大量內存,但是問題是,當客戶端斷開連接時,該內存不會被釋放。 我認為這應該在內部完成,並且我不應該擔心內存,我錯了嗎? 我可以做錯什么嗎?

如我所見,“發送”功能是保留內存以保存其必須發送的內容,但從不釋放它。 (如果您注釋該行,則不會出現內存問題),這是代碼:

var fs = require('fs');
var BinaryServer = require('binaryjs').BinaryServer;
var bs = BinaryServer({port: 8080});

var nchunks=116;

bs.on('connection', function(client){
for(var i=1; i<=nchunks; i++)
{
    var name="/var/www/1.m4s";
    var fd=fs.openSync(name.replace("1.m4s", i+".m4s"), 'r');
    var buf = new Buffer(fs.fstatSync(fd).size, 'binary');
    fs.readSync(fd, buf, 0, buf.length, null)
    client.send(buf);
    fs.closeSync(fd);

    if(i==nchunks){
        client.send("end"); 
    }
}
client.on('close', function(c){
    console.log("closing");
});

});

當客戶端收到所有視頻文件時,請關閉套接字,所以我知道它已關閉,因為我正在服務器上捕獲“關閉”事件。 這時不應該釋放內存嗎?

最糟糕的是,由於我找不到錯誤,我認為這可能是由於binaryjs的實現方式所致,所以我也嘗試使用“ ws”和“ websocket-node”在內存中使用相同的結果。

有人遇到過這個問題嗎? 任何想法?

此時不應該釋放內存

不,JavaScript是一種垃圾收集語言,垃圾收集器會在運行時認為合適的情況下定期運行。 您無法控制或何時運行,也因此無法釋放內存。

另外,您不能在網絡服務器中使用任何同步IO調用,因為在執行每個IO調用時,所有客戶端處理都將阻塞。

我認為您的主要問題是您沒有將文件分流到較小的塊中。 您正在嘗試將整個文件讀入內存並向下發送。

var buf = new Buffer(fs.fstatSync(fd).size, 'binary');

不要那樣做 使用ReadableStream並按一系列小塊向下發送文件,並使用異步調用。 這是使節點正常工作的方法。 流的缺乏和異步調用的缺乏是節點故障的必經之路。 這是一個工作示例程序。

var fs = require("fs");
var http = require("http");
var server = http.createServer();
server.listen(9200)
server.on('request', function (req, res) {
  fs.createReadStream('/tmp/test1').pipe(res);
});

我在OSX上使用節點v0.10.7對此進行了測試,我可以使用curl localhost:9200 >/dev/null重復請求該文件,並查看lsof -p <pid of node>我可以看到/tmp/test文件被打開和關閉正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM