Ankündigung

Einklappen
Keine Ankündigung bisher.

nodejs mit vielen Verbindungen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • nodejs mit vielen Verbindungen

    Hallo zusammen,

    Ich versuche momentan, ein Skript auf Nodejs umzubauen. Momentan ist es so, dass ein Javascript-Code alle x Sekunden eine .php Datei aufruft um den aktuellen Status zu übertragen.
    Da es jedoch tausende Aktive User gibt, ist der Server damit ein wenig überlastet. Und ich kann nicht prüfen ob es ein fake-Aufruf ist oder nicht. Da bin ich bei Nodejs besser.

    Beim versuch auf Node umzustellen, stoße ich jedoch vor Probleme wie "transport close", "ping timeout" u.ä.

    Hier einmal das Skript:
    Code:
    var https = require('https');
    var mysql = require('mysql');
    var fs = require('fs');
    
    var hostname = 'hostname';
    var port = 3000;
    
    //assign certificate
    var options = {
      key: fs.readFileSync('./zert.key'),
      cert: fs.readFileSync('./zert.cert'),
    };
    
    //create https-server
    server = https.createServer(options);
    
    //start server and listen to givven port
    server.listen(port, hostname, 34, function() {
        console.log("Server listening on https://%s:%s", hostname, port);
    });
    
    // use socket.io
    var io = require('socket.io').listen(server);
    
    // define interactions with client
    io.sockets.on('connection', function(socket) {
        console.log("Open-Connections: %s", io.engine.clientsCount);
    
        socket.on('disconnect', function(data) {
            console.log("user  disconnected reason: %s", data);
        });
    });
    Jetzt sieht es so aus, dass ich in der Konsole sehe wie die User sich verbinden.

    Code:
    Open-Connections: 1
    Open-Connections: 12
    ...
    Open-Connections: 2100
    Open-Connections: 2400
    ...
    Dann passiert es so bei circa 2500, dass im log ganz schnell hintereinander "disconnected" kommt. Alle mit ping-timeout.
    Das sind so 300-400 disconnects.

    Kurz danach sehe ich, wie diese alle wieder rein kommen und sich Verbinden.

    Wie gehe ich da am besten vor, um rauszufinden wieso das so ist?

    Kann es sein dass der Server überfordert ist mit der Webseite?

    Serverdaten:
    Intel(R) Xeon(R) CPU E5-1650 v2 @ 3.50GHz (12 core(s))
    Debian 8.9
    220GB SSD
    128GB RAM

    Das ganze dediziert, sprich der Server ist "real" und hat nur diese eine Webseite.

    Ich selber Programmiere seit über 10 Jahren. Habe Erfahrung mit php, mysql, html, javascript, c++ u.v.m

    Bin aber ehrlich gesagt mit meinem Server-Wissen so langsam am ende.

    Mir fehlt die "Idee" was es sein kann und wie ich das Thema anpacke.


    Wäre super wenn mir da jemand hilft!

    Danke !!!

    Edit: Es ist auch bei mir momentan so, dass ich die Datei
    https://hostname:3000/socket.io/socket.io.js

    Nicht aufrufen kann. Es kommt dort zu einem 522-Fehler. Ich komme an die Datei erst dran, wenn sich alles langsam beruhigt.

  • #2
    Wieviel da aus dem einen thread noch rauszuholen ist, kann ich nicht sagen. Hast du mehr als eine Netzwerkkarte im Server/mehr IP-Adressen zur Verfügung?

    Um mehr Clients handlen zu können, würde ich langfristig auf mehr threads umstellen (bspw. per "pm") und zur Synchro Redis verwenden. Die verschiedenen threads kannst du dann gebündelt unter einer Adresse ansprechbar machen (bspw. nginx oder haproxy). Falls du nur nodejs nehmen willst, kannst du dir auch mal die cluster api ansehen.

    Damit du das besser eingrenzen kannst, hier ein wenig Lesestoff:

    Zum stress testen: https://stackoverflow.com/questions/...de-js-instance
    http://drewww.github.io/socket.io-benchmarking/
    http://blog.mixu.net/2011/11/22/perf...es-native-tcp/

    Zum debuggen gibts mittlerweile gute IDE-Unterstützung (bspw. intellij) oder du benutzt chrome:
    "node --harmony-async-await --inspect --debug-brk index.js"
    o.a. https://mattdesl.svbtle.com/debuggin...hrome-devtools

    mit console.time('timername') und console.timeEnd('timername') (oder auch profile/profileEnd) kannst du nach Engpässen suchen, "debugger" stoppt die ausführung. Fürs loggen ist "debug" sehr nett, die logs lassen sich per ENV-Variable eingrenzen (namespaced)


    Kommentar

    Lädt...
    X