Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   утечка памяти? (https://javascript.ru/forum/node-js-io-js/63785-utechka-pamyati.html)

cyber 29.06.2016 14:35

утечка памяти?
 
Есть простой когд для статики (нода 5.11)
И он потихоньку отжирает память, и я не пойму почему, через час доходит до 100 метров, это локальный сервер, он просто отдает файлы, что я делаю не так?

"use strict";
var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs"),
    mime = require("mime");

var staticPath = path.resolve("scripts-dist");

function getFile(filename) {
    if(fs.existsSync(filename)) {
       return fs.readFileSync(filename, "binary");
    }

    return null;
}

http.createServer(function(request, response) {

    var uri = url.parse(request.url).pathname,
        filename = path.join(staticPath, uri);

    let file = getFile(filename);

    if(file) {
        response.writeHead(200, {"Content-Type": mime.lookup(filename)});
        response.write(file, "binary");
        response.end();
    }
    else {
        response.writeHead(404, {"Content-Type": "text/plain"});
        response.write("404 Not Found\n");
        response.end();
    }

}).listen(3001);

destus 29.06.2016 19:31

cyber,
Не получается ли такой ситуации, что я сделал запрос на сервер, файл начинает считываться, я закрываю соединение, не дождавшись окончания загрузки и весь наполовину считанный файл зависает в оперативной памяти сервера?

Или происходит считывание большого файла в оперативную память и затем он начинает отдаваться клиенту. А если клиент медленный или таких клиентов много?

Erolast 30.06.2016 08:43

Нода использует ленивый сборщик мусора, который не освобождает память до последнего - https://blog.heroku.com/node-habits-...-avoid-garbage.

+ проблемы destus'а. На локалхосте-то еще ладно, но в продакшене они угробят твой сервер.
Мало того, твой код попросту небезопасен. Что, если клиент запросит, скажем, ссылку "http://server.com/../.git"?

В таких случаях надо использовать потоки, но и там есть свои ньюансы. У Ильи в скринкасте по ноде есть видео по этой теме, глянь:
https://www.youtube.com/watch?v=KlvJOz9GUjU
https://www.youtube.com/watch?v=_j0LoOXnOF4

cyber 30.06.2016 09:27

Цитата:

Сообщение от Erolast
Мало того, твой код попросту небезопасен.

Это мини дев сервер, так что это не проблема)
Цитата:

Сообщение от Erolast
Нода использует ленивый сборщик мусора, который не освобождает память до последнего

Знаю, поэтому зазал global.gc(); и флаг --expose-gc. (обновленый код)

"use strict";
var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs"),
    mime = require("mime");

var staticPath = path.resolve("scripts-dist");

function getFile(filename) {
    if(fs.existsSync(filename)) {
       return fs.readFileSync(filename, "binary");
    }

    return null;
}

http.createServer(function(request, response) {

    var uri = url.parse(request.url).pathname,
        filename = path.join(staticPath, uri);

    var file = getFile(filename);

    if(file) {
        response.writeHead(200, {"Content-Type": mime.lookup(filename)});
        response.write(file, "binary");
        response.end();
        file = null;
        global.gc();
    }
    else {
        response.writeHead(404, {"Content-Type": "text/plain"});
        response.write("404 Not Found\n");
        response.end();
    }

}).listen(3001);


Цитата:

Сообщение от destus
Не получается ли такой ситуации, что я сделал запрос на сервер, файл начинает считываться, я закрываю соединение, не дождавшись окончания загрузки и весь наполовину считанный файл зависает в оперативной памяти сервера

Спасибо, не подумал об этом.
Цитата:

Сообщение от destus
Или происходит считывание большого файла в оперативную память и затем он начинает отдаваться клиенту. А если клиент медленный или таких клиентов много?

Это все для локального пользования.

cyber 30.06.2016 12:44

Цитата:

Сообщение от Erolast
https://www.youtube.com/watch?v=KlvJOz9GUjU
https://www.youtube.com/watch?v=_j0LoOXnOF4

все стало понятно, спасибо


Часовой пояс GMT +3, время: 20:01.