Socket.Performances du serveur IO et utilisation de la bande passante

<!-Je suis sur le point d'héberger un petit serveur socket sur un ordinateur local et j'aimerais savoir quel type de bande passante il va utiliser. La plupart du temps, il n'y aura pas plus de 50 clients connectés en même temps, mais une ou deux fois par semaine, il pourrait y avoir plus de 5 000 clients à la fois. Cependant, les seuls messages envoyés seront un message unique occasionnel à tous les clients connectés à la fois sans données supplémentaires ou quoi que ce soit.

le serveur provoquer une baisse significative des performances sur le ordinateur il est hébergé sur ou ralentir mes vitesses internet du tout?

le Serveur.js:

var app = require('http').createServer(handler)
   , io = require('socket.io').listen(app)
   , fs = require('fs')

 app.listen(8001);

function handler (req, res) {
fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.sockets.on('connection', function (socket) {
  socket.on('SendDefault', function(data) {
    socket.broadcast.emit('GetDefault');
  });
});

Client.js:

setTimeout( function( ){ 
  socket = io.connect('[IP Address]:8001');
  socket.on('GetDefault', function(data) {
    DoStuff( );
  );
} ); }, 10000 );
20
demandé sur hexacyanide 2013-09-20 05:33:55

2 réponses

La quantité de bande passante dépendra fortement de la quantité de données que vous allez envoyer à partir du serveur, et la quantité de données que le client va envoyer. L'utilisation de la bande passante dépendra également de la Socket.Transport IO que vous utilisez, et l'intervalle de battement de coeur de votre application.

l'impact sur les performances de l'application varie également selon le type d'application que vous utilisez et la capacité de performance de votre machine et/ou de votre réseau. Toutefois, plus de 5 000 clients impact considérable sur la performance, quelles que soient les capacités de votre ordinateur, à moins que vous ne mettiez l'application à l'échelle de plusieurs cœurs.

j'ai pris quelques mesures en utilisant un proxy. Voici les résultats:

Emission à partir d'un client:socket.emit(event, args)

  • Si event et args ne sont pas fournis, 12 octets sont envoyés au serveur.
  • Si args est omis, mais event est fourni, la taille totale est de 22 octets et la longueur de event.
  • Si args et event sont fournis, les mêmes règles sont suivies, mais les résultats peuvent varier selon le type de données args.

Émettant à partir du serveur: même format que celui du client

  • Si event et args ne sont pas fournis, 8 octets sont envoyés au client.
  • Si args est omis, mais event est fourni, la taille totale est de 17 octets, et la longueur de event.
  • Si args et event sont fournis, les mêmes règles sont suivies, mais les résultats peuvent varier selon le type de données args.

Heartbeat du serveur au client: toutes les 25 secondes par client

  • 5 octets à partir du serveur
  • 9 octets client response

Handshaking: une fois par client

  • 216 octets à partir du serveur
  • 431 réponse des octets du client
  • 129 octets suivi de serveur

donc avec une charge de plus de 5000 clients, attendez-vous à au moins 3,7 MO pour le handshaking, 3KB / s pour les battements de cœur, et au moins 107KB de bande passante pour un socket.emit(). Il ne s'agit pas de chiffres exacts, car les clients peuvent perdre des données, perdre des connexions, avoir besoin de se reconnecter, etc.

de façon concluante, votre réseau tiendra probablement, mais la principale préoccupation devrait être le nombre de connexions simultanées de votre réseau aura à gérer. Beaucoup de connexions simultanées peuvent également être intensives en CPU, donc vous devriez penser à regrouper à travers les noyaux. Gardez également à l'esprit la quantité de battements de cœur de la Socket.Le serveur IO devra gérer. Avec 50 utilisateurs simultanés, c'est une moyenne de 2 battements par seconde. Avec plus de 5000 utilisateurs concurrents, c'est plus de 200 battements de cœur par seconde, ce qui est plus intensif en CPU qu'en réseau (2,8 KB/s).

53
répondu hexacyanide 2013-09-20 02:50:27

les WebSockets peuvent rester ouverts pendant très longtemps, donc gérer un grand nombre de connexions simultanées signifie généralement que vous aurez besoin d'étendre ce service pour accommoder la charge accrue. C'est la même chose pour presque toutes les technologies, mais il y a généralement une limite au nombre maximum de connexions ouvertes qu'un serveur peut gérer avant que les choses ne dégénèrent rapidement. Si vous êtes susceptible d'avoir de tels pics dans le trafic, je considérerais regarder dans un service tiers comme poussoir ou kaazing (disclaimer: je n'ai pas essayé encore.)

vous avez posté une question assez vague (nous ne savons rien de votre application, architecture, etc. - trafic prévu), mais espérons que cela vous aide à vous diriger dans la bonne direction. Cela étant dit... basé sur votre cas d'utilisation (diffusion d'un ou deux petits messages, de temps en temps), mon instinct me dit que les WebSockets ne sont pas la bonne technologie pour vous.

(notez que la bande passante ne devrait probablement pas être une préoccupation - en général, si vous deviez envoyer de nombreux messages sur WebSockets par rapport au repos, vous serez envoyer moins de données en raison des en-têtes, cookies, etc)

1
répondu Jesse Fulton 2013-09-20 01:59:29