Socket.Performances du serveur IO et utilisation de la bande passante
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 );
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
etargs
ne sont pas fournis, 12 octets sont envoyés au serveur. - Si
args
est omis, maisevent
est fourni, la taille totale est de 22 octets et la longueur deevent
. - Si
args
etevent
sont fournis, les mêmes règles sont suivies, mais les résultats peuvent varier selon le type de donnéesargs
.
Émettant à partir du serveur: même format que celui du client
- Si
event
etargs
ne sont pas fournis, 8 octets sont envoyés au client. - Si
args
est omis, maisevent
est fourni, la taille totale est de 17 octets, et la longueur deevent
. - Si
args
etevent
sont fournis, les mêmes règles sont suivies, mais les résultats peuvent varier selon le type de donnéesargs
.
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).
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)