【发布时间】:2016-08-25 05:45:31
【问题描述】:
我正在尝试将数据从 node.js 服务器流式传输到许多客户端 (> 3000)。 node.js 服务器从一个客户端接收数据并将其广播给所有客户端。数据每秒发送一次,每个数据大约 2KB。我使用ws模块通过websocket发送数据。
节点服务器位于仅运行服务器的 AWS EC2 m3.medium 实例上。
客户端在 15 个不同的 EC2 t2.micro 实例上模拟,每个实例启动 300 个客户端。
一开始一切正常,但过了一段时间(大约 3 分钟),服务器就死机了。我无法终止进程或在服务器上执行任何操作。但是,如果我杀死所有客户端(通过重新启动所有客户端实例),服务器会再次响应。
服务器上,CPU在40%到60%之间,内存
在服务器冻结之前,内存从 300MB 增加到 1000MB。我不知道为什么以及是否相关。我使用了 heapdump,但无法理解泄漏的位置。
这是服务器上的代码:
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({ port: 8080 });
var users = Array();
wss.binaryType = 'arraybuffer';
wss.on('connection', function(ws) {
console.log('new user connected');
users.push(ws);
console.log(users.length);
ws.on('error', function(e) {
console.log('onerror called');
ws.close()
});
ws.on('close', function () {
console.log('closed');
users.splice(users.indexOf(ws), 1);
ws.close()
});
ws.on('message', function(data) {
if (data.length < 10)
return ;
var len = users.length;
for (var i = 0; i < len; i++) {
users[i].send(data, { binary : true });
}
});
});
这是发送数据的代码(在 python 中):
#!/usr/bin/env python
from time import sleep
from websocket import create_connection
#connection to server
ws = create_connection(server_url)
string = "Mea unum iusto virtute et, et meis munere vix. Meliore sensibus omittantur eum ne, sea quis epicuri sapientem at, fabulas consequat interesset in usu. Vix epicurei platonem ea, in vis agam accu\
sata. Quando maluisset forensibus ut nec, debitis percipitur ad vim, ne vix impetus volutpat. Quo magna viderer ne, nemore doctus copiosae cu mel, id vix dolorem omittam laboramus. Ne populo reprehendunt\
est, recteque dissentiet delicatissimi vis an. Dolores euripidis complectitur no nam, amet nominavi voluptua ut pri. Vix ex timeam iisque gubergren, ne vim error imperdiet deterruisset. An duo autem vir\
is vituperatoribus. Adversarium instructior te eam. Enim moderatius no eam, ut sit viris populo, ex fugit adolescens inciderint ius. Eum idque dolore voluptatum ex, ex pri solet commune mediocrem. In nib\
h affert pro, mei convenire salutandi argumentum at. Nec in vidisse tamquam. Eos an epicurei suavitate. Ex erat scribentur signiferumque quo. Pro ex sapientem deseruisse. Lorem essent omittam sed ad, pop\
ulo reprehendunt ut sit. Pri maiorum fierent te. Vim aeterno aperiam id. Mea ferri integre eu. Cu per nihil affert, fierent percipit accommodare nam te. Eu qui maiestatis concludaturque, at detracto coti\
dieque vel, no prima essent delicata sea. Nam at appareat reprehendunt. Ubique iudicabit consetetur eu sit. Ius et vivendo propriae prodesset, id his primis platonem, qui nostro quodsi cu. Mea ne wisi mu\
tat facete. Dolorem urbanitas theophrastus ut eam, mei no animal aliquid. Te est movet dicam, id labore latine rationibus his, nullam omnium tincidunt nec ut. Eu mundi ancillae erroribus vis, no vim popu\
lo intellegam. Sonet decore volutpat in has, vidisse appetere reprehendunt vel an, at sea ipsum munere corrumpit. Eos noluisse incorrupte reprehendunt cu, qui quidam intellegebat id, vel audire voluptua \
complectitur ne. Posse iuvaret prodesset vix ea. Urbanitas scriptorem ne eos, te soluta probatus est. Mei ex brute congue, in option saperet mel, veniam ocurreret no quo. Malorum mnesarchum ex quo. Meis \
quaeque pericula duo ei. Ei everti doctus vel."
try:
for i in range(100000):
sleep(1)
ws.send(string)
print('emit', i)
except:
ws.close()
ws.close()
由于处理器不是 100% 并且带宽小于最大带宽,您知道会发生什么吗?
【问题讨论】:
-
那么您有 15 * 300 = 4500 个客户端,每个客户端每秒向服务器发送一个 2 KB 的数据包?那是 75 Mbits/s。但是你的服务器正在向所有 4500 个客户端广播每个接收到的数据包?那是 337.5 Gbits/s。我错过了什么吗?
-
只有一个客户端向服务器发送 2KB。其他客户端只接收数据而不发送任何内容。所以你在 75Mbits/s 上是对的
-
接收客户端是否真的在消费数据? IE。它不会在某处保持缓冲和未确认?
-
客户端没有使用数据。它似乎是内存问题和冻结问题的原因!非常感谢!如果您发布答案,我将对其进行验证。但是你知道为什么服务器会受到影响吗?以及如何防止用户不消费数据?
标签: javascript node.js amazon-web-services websocket