A escolha correta do Node.js para análise JSON e IO driven

5

Meu programa deve executar a seguinte tarefa: Ele escuta na porta http depois de obter o pedido faz as seguintes coisas.

  1. Conecte-se ao gearman
  2. Analise a carga útil do Gearman para JSON (até 100 bytes)
  3. Conectar-se ao Redis
  4. Analise a carga útil do redis para JSON (256 bytes para 10 KB. 80% dos casos será ~ 256 bytes)
  5. Coloque alguns dados no MySQL
  6. Colocar dados no servidor Redis

Como meu programa parece ser orientado por IO. Eu escolhi nós para desenvolver. Mas depois de desenvolver estou enfrentando problema de caminhada da CPU com o nodejs.

Meu programa leva 70% -100% cpu com 20 clientes paralelos. Primeiro, pensei que a análise JSON poderia ser o problema. Eu estava segmentando quase uma solicitação de 1K-3K. Como meu servidor de redis é capaz de processar isso pode solicitar em um segundo.

Mas, para criação de perfil, iniciei com um servidor http de amostra no nó

Exemplo de código:

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");

Agora, minha preocupação é com esse servidor http hello world. O uso da CPU do nó está aumentando entre 17% e 20%.

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

Minha informação de cpu é

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:

Minhas perguntas são:

  1. A escolha correta do nó para a descrição do meu problema?
  2. Se o nodejs não for a escolha correta para a descrição do meu problema. Qual será a melhor alternativa? Como a abordagem baseada em encadeamentos não será dimensionada para aplicativos acionados por E / S.

  3. Como descobrir o que está causando esse aumento de CPU no aplicativo integrado completo e no programa HTTP simples?

  4. De acordo com algum blog de nó, posso suportar até 10K de solicitação paralela com nodejs. Mas com se com apenas o nó do servidor http simples é spiking b / w 20% cpu. Como poderei suportar o usuário de 10K?
por Vivek Goel 02.06.2013 / 19:03
fonte

1 resposta

6

A escolha correta do nó para a descrição do meu problema?

Nodejs parece um bom ajuste para o que você está fazendo. O nó foi construído exatamente para esse tipo de cenário. Isso não quer dizer que outras tecnologias não funcionariam tão bem.

O Node é uma tecnologia jovem e muitas vezes você se encontra sacrificando o conforto pelo desempenho. Muitas vezes é muito mais trabalho, mas uma vez que você aprende a trabalhar com isso, ele começa a ser recompensador.

Dito isto, outras tecnologias podem ser capazes de acomodar suas necessidades.

Pros para o nó

  • Rápido
  • Otimizado para esse tipo de tarefa orientada por E / S
  • Tem uma comunidade entusiasmada que está muito interessada em ajudar iniciantes.
  • Diversão para trabalhar (Isso é totalmente subjetivo e é minha opinião pessoal).

Contras para o nó

  • Geralmente tem drivers menos estáveis e maduros. Se você está escrevendo um projeto de produção, isso é um grande problema na minha opinião.
  • Novo, às vezes tem arestas irregulares, às vezes as APIs mudam.
  • Frequentemente requer ajustes e leitura do código-fonte para funcionar de forma satisfatória.

Sua tarefa:

Connect to gearman

Este nó funciona muito bem. node-gearman funciona bem, é bastante estável.

Parse gearman payload to JSON (Upto 100 bytes)

Os mecanismos JS foram e serão extremamente rápidos na análise do JSON. Isso ocorre porque o JSON é um subconjunto da notação literal do objeto JavaScript (daí o nome!). A V8, que é o nó do mecanismo executado, processa o JSON com rapidez confiável.

Connect to Redis

node-redis permite que você faça isso, também funciona bem.

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

Mais uma vez, o JSON não é um problema para o V8.

Put some data in MySQL

node-mysql está melhorando, ainda falta suporte para instruções preparadas, mas faz transações e emula preparadas declarações com escape interno.

Put data in Redis server

Mais uma vez, node-redis

    
por 02.06.2013 / 19:43
fonte