29.06.2016, 14:35
|
|
I am Student
|
|
Регистрация: 17.12.2011
Сообщений: 4,415
|
|
утечка памяти?
Есть простой когд для статики (нода 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);
__________________
Цитата:
|
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
|
|
|
29.06.2016, 19:31
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
cyber,
Не получается ли такой ситуации, что я сделал запрос на сервер, файл начинает считываться, я закрываю соединение, не дождавшись окончания загрузки и весь наполовину считанный файл зависает в оперативной памяти сервера?
Или происходит считывание большого файла в оперативную память и затем он начинает отдаваться клиенту. А если клиент медленный или таких клиентов много?
|
|
30.06.2016, 08:43
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Нода использует ленивый сборщик мусора, который не освобождает память до последнего - 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
Последний раз редактировалось Erolast, 30.06.2016 в 08:45.
|
|
30.06.2016, 09:27
|
|
I am Student
|
|
Регистрация: 17.12.2011
Сообщений: 4,415
|
|
Сообщение от 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
|
Или происходит считывание большого файла в оперативную память и затем он начинает отдаваться клиенту. А если клиент медленный или таких клиентов много?
|
Это все для локального пользования.
__________________
Цитата:
|
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
|
|
|
30.06.2016, 12:44
|
|
I am Student
|
|
Регистрация: 17.12.2011
Сообщений: 4,415
|
|
все стало понятно, спасибо
__________________
Цитата:
|
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
|
|
|
|
|