Javascript 节点服务器因大量websocket数据传输而冻结

Javascript 节点服务器因大量websocket数据传输而冻结,javascript,node.js,amazon-web-services,websocket,Javascript,Node.js,Amazon Web Services,Websocket,我正在尝试将数据从node.js服务器流式传输到许多客户端(>3000)。 node.js服务器从一个客户端接收数据,并将其广播到所有客户端。数据每秒发送一次,每个数据大约为2KB。我使用ws-module通过websocket发送数据 节点服务器位于仅运行服务器的AWS EC2 m3.medium实例上 在15个不同的EC2 t2.micro实例上模拟客户端,每个实例启动300个客户端 开始时一切正常,但一段时间后(大约3分钟),服务器冻结。我无法在服务器上终止进程或执行任何操作。但是,如果我

我正在尝试将数据从node.js服务器流式传输到许多客户端(>3000)。 node.js服务器从一个客户端接收数据,并将其广播到所有客户端。数据每秒发送一次,每个数据大约为2KB。我使用ws-module通过websocket发送数据

节点服务器位于仅运行服务器的AWS EC2 m3.medium实例上

在15个不同的EC2 t2.micro实例上模拟客户端,每个实例启动300个客户端

开始时一切正常,但一段时间后(大约3分钟),服务器冻结。我无法在服务器上终止进程或执行任何操作。但是,如果我杀死了所有客户机(通过重新启动所有客户机实例),服务器会再次响应

在服务器上,CPU在40%到60%之间,内存<1.5GB(实例有4GB),下载带宽约为1.5 Mbits/sec,上传带宽约为75 Mbits/sec。我做了一个速度测试,下载或上传时的最大带宽约为400 Mbits/秒

在服务器冻结之前,内存从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 });
    }
  });

});

由于处理器不是100%,带宽小于最大带宽,您知道会发生什么吗?

可能是配置问题吗?linux操作系统下可以打开的文件描述符数量有限制。
有一个很好的起点可以找到如何设置ou机器以处理尽可能多的连接

正如在评论中的讨论中所确定的,问题是客户端没有使用发送给它们的数据


最有可能的情况是,这导致未确认的消息留在内存中,等待客户端使用它们(即使它们什么也不做),这反过来又导致进程增长并超过可用内存。然后,它要么开始大量交换,要么超过了可用交换,这通常不是系统能够很好地处理的。

那么您有15*300=4500个客户端,每个客户端每秒向服务器发送一个2 KB的数据包?这是75Mbits/s。但是,您的服务器正在向所有4500个客户端广播每个接收到的数据包?这是337.5 Gbits/s。我错过了什么吗?只有一个客户端向服务器发送了2KB。其他客户端只接收数据,不发送任何内容。你说的对,75Mbits/s是接收客户机实际使用的数据吗?也就是说,它没有在某个地方保持缓冲和未确认?客户端没有使用数据。这似乎是导致记忆问题和冻结问题的原因!非常感谢你!如果你发布你的答案,我会验证它。但是您知道服务器受到影响的原因吗?如何防止不愿意使用数据的用户访问?感谢链接。我已经将fd的数量设置为100000,并试图将其他限制设置为无效。
#!/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()