Il mio programma dovrebbe eseguire il seguente compito: Ascolta sulla porta http dopo aver ricevuto la richiesta che segue le seguenti cose.
- Connetti a gearman
- Pare il payload dell'ingranaggio su JSON (fino a 100 byte)
- Connetti a Redis
- Analizza il payload redis su JSON (da 256 byte a 10 KB. 80% casi vale ~ 256 byte)
- Inserisci alcuni dati in MySQL
- 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:
- La scelta del nodo è corretta per la descrizione del mio problema?
-
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.
-
Come scoprire che cosa sta causando così tanto aumento della CPU in un'applicazione integrata completa e un semplice programma http?
- 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?