È la scelta corretta di Node.js per l'analisi JSON e guidata dall'IO

5

Il mio programma dovrebbe eseguire il seguente compito: Ascolta sulla porta http dopo aver ricevuto la richiesta che segue le seguenti cose.

  1. Connetti a gearman
  2. Pare il payload dell'ingranaggio su JSON (fino a 100 byte)
  3. Connetti a Redis
  4. Analizza il payload redis su JSON (da 256 byte a 10 KB. 80% casi vale ~ 256 byte)
  5. Inserisci alcuni dati in MySQL
  6. Inserisci dati nel server Redis

Dato che il mio programma sembra essere orientato all'IO. Ho scelto nodesjs per lo sviluppo. Ma dopo lo sviluppo mi trovo ad affrontare un problema relativo all'aumento della CPU con nodejs.

Il mio programma prende il 70% -100% della CPU con 20 client paralleli. Innanzitutto pensavo che l'analisi di JSON potesse essere il problema. Stavo prendendo di mira circa la richiesta di 1K-3K. Poiché il mio server redis è in grado di elaborare ciò può richiedere in un secondo.

Ma per il profiling ho iniziato con un server http di esempio nel nodo

Codice di esempio:

var http = require('http');
var url = require("url");
http.createServer(function (req, res) {
    var uri = url.parse(req.url).pathname;


    var body = "";

    req.on('data', function (chunk) {
        body += chunk;
    });

    req.on('end', function () {     
        res.writeHead(200, {'Content-Type': 'text/plain'});            
                res.end('hi vivek');
    });


}).listen(9097, "127.0.0.1");

Ora la mia preoccupazione è con questo server http ciao mondo. L'utilizzo della CPU del nodo è in aumento in bianco e nero tra il 17% e il 20%.

My node version is v0.10.0
My OS is ubuntu 12.04

Le informazioni sulla mia cpu sono

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 23
model name  : Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz
stepping    : 10
microcode   : 0xa07
cpu MHz     : 2992.491
cache size  : 6144 KB
physical id : 0
siblings    : 2
core id     : 0
cpu cores   : 2
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm tpr_shadow vnmi flexpriority
bogomips    : 5984.98
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 23
model name  : Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz
stepping    : 10
microcode   : 0xa07
cpu MHz     : 2992.491
cache size  : 6144 KB
physical id : 0
siblings    : 2
core id     : 1
cpu cores   : 2
apicid      : 1
initial apicid  : 1
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm tpr_shadow vnmi flexpriority
bogomips    : 5984.96
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

Le mie domande sono:

  1. La scelta del nodo è corretta per la descrizione del mio problema?
  2. Se nodejs non è la scelta corretta per la mia descrizione del problema. Quale sarà l'alternativa migliore? Poiché l'approccio basato su thread non viene ridimensionato per l'applicazione guidata dall'IO.

  3. Come scoprire che cosa sta causando così tanto aumento della CPU in un'applicazione integrata completa e un semplice programma http?

  4. Secondo alcuni blog del nodo, posso supportare fino a 10k richieste parallele con nodejs. Ma con se con solo il semplice nodo del server http sta aumentando il 20% in cpu. Come potrò supportare l'utente 10K?
posta Vivek Goel 02.06.2013 - 19:03
fonte

1 risposta

6

La scelta del nodo è corretta per la descrizione del mio problema?

Nodejs sembra una buona idea di quello che stai facendo. Nodo è stato costruito esattamente per questo tipo di scenario. Questo non vuol dire che anche altre tecnologie non funzionerebbero.

Il nodo è una tecnologia giovane e spesso ti ritrovi a sacrificare il comfort per le prestazioni. Spesso è molto più lavoro, ma una volta che hai imparato come lavorarci, inizia ad essere gratificante.

Detto questo, altre tecnologie potrebbero essere in grado di soddisfare le tue esigenze.

Vantaggi per il nodo

  • veloce
  • Ottimizzato per questo tipo di attività guidata dall'IO
  • Ha una comunità entusiasta che è molto interessata ad aiutare i principianti.
  • Divertente con cui lavorare (È totalmente soggettivo ed è la mia opinione personale).

Contro per nodo

  • Spesso ha driver meno stabili e maturi. Se stai scrivendo un progetto di produzione, questa è una grossa delusione a mio parere.
  • Nuovo, a volte ha spigoli vivi, a volte le API cambiano.
  • Spesso è necessario modificare e leggere il codice sorgente per lavorare in modo soddisfacente.

Il tuo compito:

Connect to gearman

Questo nodo funziona bene. node-gearman funziona bene, è piuttosto stabile.

Parse gearman payload to JSON (Upto 100 bytes)

I motori JS sono stati e saranno estremamente veloci nell'analisi di JSON. Questo perché JSON è un sottoinsieme della notazione letterale dell'oggetto JavaScript (da cui il nome!). V8, su cui viene eseguito il nodo motore, esegue l'elaborazione JSON in modo affidabile velocemente.

Connect to Redis

node-redis ti consente di farlo, funziona anche bene.

Parse redis payload to JSON (256 bytes to 10KB. 80% cases it will ~256 bytes)

Ancora una volta, JSON non è un problema per V8.

Put some data in MySQL

node-mysql sta migliorando, manca ancora il supporto per le istruzioni preparate, ma esegue transazioni ed emula preparato dichiarazioni con escape interno.

Put data in Redis server

Ancora, node-redis

    
risposta data 02.06.2013 - 19:43
fonte

Leggi altre domande sui tag