node.js的内存使用率是随着同时请求数量的增加而增加,还是泄漏
Does node.js memory usage increase as the number of simultaneous requests increase, or is this a leak?
我运行了以下node.js代码:
var http = require('http');
http.createServer(function(req,res){
res.writeHead(200,{'Content-Type': 'text/plain'});
res.write("Hello");
res.end();
}).listen(8888);
当我启动服务器时(通过键入node myFile.js
),节点进程正在使用9MB的内存。
然后我创建了以下网页,我在网络浏览器的几个选项卡中打开,所以我同时向节点发出请求:
<html>
<head>
<script>
var ajax = {};
var questions = [];
var questionsResponses = [];
ajax.x = function() {
if (typeof XMLHttpRequest !== 'undefined') {
return new XMLHttpRequest();
}
var versions = [
"MSXML2.XmlHttp.5.0",
"MSXML2.XmlHttp.4.0",
"MSXML2.XmlHttp.3.0",
"MSXML2.XmlHttp.2.0",
"Microsoft.XmlHttp"
];
var xhr;
for (var i = 0; i < versions.length; i++) {
try {
xhr = new ActiveXObject(versions[i]);
break;
} catch (e) {}
}
return xhr;
};
ajax.send = function(url, callback, method, data, async) {
var x = ajax.x();
x.open(method, url, async);
x.onreadystatechange = function() {
if (x.readyState == 4) {
if (x.status == 200) {
callback(x.responseText)
} else {
//TODO
}
}
};
if (method == 'POST') {
x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
}
x.send(data)
};
ajax.get = function(url, data, callback, async) {
var query = [];
for (var key in data) {
query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
}
ajax.send(url + '?' + query.join('&'), callback, 'GET', null, async)
};
ajax.post = function(url, data, callback, async) {
var query = [];
for (var key in data) {
query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
}
ajax.send(url, callback, 'POST', query.join('&'), async)
};
var count = 0;
function sayHello(){
ajax.get("http://localhost:8888", {}, sayHello, true);
var heading = document.getElementById("c");
while (heading.firstChild) {
heading.removeChild(heading.firstChild);
}
var countText = document.createTextNode(""+count++);
heading.appendChild(countText);
}
</script>
</head>
<body>
<h1 id="c"></h1>
<script> sayHello();</script>
</body>
</html>
该节点现在使用的内存为46.2 MB。它慢慢增加。每隔一段时间就会有一次跳跃,然后它继续缓慢增加。这是节点在获得许多同时请求时的正常行为,还是泄漏?
编辑:似乎稳定在46.4MB。但我不知道它是否稳定,因为我的请求数量有限(因为我在网络浏览器中打开了多个选项卡),所以这可能只是我笔记本电脑的限制。XD-
编辑:即使我一次只提出一个请求(即只在网络浏览器中打开一个选项卡),内存似乎也会增加。此外,即使在关闭所有窗口后,使用的内存也不会减少(仍保持在46.4MB)。
当然,请求数量和内存使用量之间是成比例的:每个请求都需要处理一些对象(例如:req、res…),每个对象都占用内存。在我的nodejs应用程序中,我注意到随着请求的增加,内存也会增加,但有时它会在谷歌V8引擎垃圾回收器的作用下下降,这是非常有效的。不管怎么说,内存泄漏是幕后黑手,但可以肯定的是,对于大约50MB的内存使用量,我们不可能像你所说的那样谈论内存泄漏。
这是显而易见的。您得到的请求越多,应用程序将使用更多的内存来管理接受请求和响应的流程。
我认为您是在问可伸缩性问题。您应该在设计代码时不将数据存储在内存中,而是使用单个逻辑数据库,这样同一应用程序的许多实例就可以在不同的机器上运行。如果达到了一台服务器的内存限制,您只需在一台新机器上启动应用程序,并将超出的流量重定向到那里。因为数据库是一个数据库,并且在各种实例之间共享。一些托管nodejs应用程序的云提供商(openshift、heroku)会自动执行此操作:您的代码在单个"盒式磁带"上运行,如果流量过多,他们会在补充盒式磁带上启动您的应用程序,并平衡各种盒式磁带之间的流量。因此,它永远不会因为内存或CPU使用过多而停止。
- JQuery使计数器每次更改时都会增加
- 如何增加同时按键总数
- 如何使用css动画从中心增加边界线
- JavaScript:单击时相对于父级增加变量值
- PaperJS-增加矢量幅度
- 如何每10.6秒从时间戳增加+1
- 如何通过ajax增加/减少PHP变量值并重新加载函数
- 重复应用 d3 转换导致的内存泄漏
- 使用Jquery增加选项卡
- 通过JSON中的值增加
- IE7中的blockUI插件内存泄漏25kb
- Javascript闭包-如何防止内存泄漏
- 根据元素高度和宽度的百分比变化增加或减少字体大小
- jQuery Draggable:内存泄漏
- 如何制作侧边栏以增加其完整长度
- 在SoundCloud中,使用JavaScript SDK流式传输曲目是否会增加该曲目的playback_count
- 找不到容器:goog.Disposable.instances _在为javascript工具使用泄漏查找器时出错
- "检测到可能的EventEmitter内存泄漏”;使用Gulp+Watchify+Factor捆绑包
- 如何增加引导程序进度条
- node.js的内存使用率是随着同时请求数量的增加而增加,还是泄漏