2013-07-31 3 views
4

test node_redis de référence, il montre INCR a plus de 100000 ops/snodejs http avec Redis, seulement avoir 6000req/de

$ node multi_bench.js 
Client count: 5, node version: 0.10.15, server version: 2.6.4, parser: hiredis 
INCR,  1/5 min/max/avg/p95: 0/ 2/ 0.06/ 1.00 1233ms total, 16220.60 ops/sec 
INCR, 50/5 min/max/avg/p95: 0/ 4/ 1.61/ 3.00 648ms total, 30864.20 ops/sec 
INCR, 200/5 min/max/avg/p95: 0/ 14/ 5.28/ 9.00 529ms total, 37807.18 ops/sec  
INCR, 20000/5 min/max/avg/p95: 42/ 508/ 302.22/ 467.00 519ms total, 38535.65 ops/sec 

Puis-je ajouter Redis à nodejs avec le serveur http

var http = require("http"), server,      

redis_client = require("redis").createClient(); 

server = http.createServer(function (request, response) { 
        response.writeHead(200, { 
             "Content-Type": "text/plain" 
         }); 
     
        redis_client.incr("requests", function (err, reply) { 
            response.write(reply+'\n');                       
            response.end(); 
        }); 
}).listen(6666); 

server.on('error', function(err){ 
    console.log(err); 
    process.exit(1); 
}); 

Utilisez la commande ab pour tester, il n'a 6000 req/s

$ ab -n 10000 -c 100 localhost:6666/ 
This is ApacheBench, Version 2.3 <$Revision: 655654 $> 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 
Licensed to The Apache Software Foundation, http://www.apache.org/ 

Benchmarking localhost (be patient) 
Completed 1000 requests 
Completed 2000 requests 
Completed 3000 requests 
Completed 4000 requests 
Completed 5000 requests 
Completed 6000 requests 
Completed 7000 requests 
Completed 8000 requests 
Completed 9000 requests 
Completed 10000 requests 
Finished 10000 requests 


Server Software:   
Server Hostname:  localhost 
Server Port:   6666 

Document Path:  /
Document Length:  7 bytes 

Concurrency Level:  100 
Time taken for tests: 1.667 seconds 
Complete requests:  10000 
Failed requests:  0 
Write errors:   0 
Total transferred:  1080000 bytes 
HTML transferred:  70000 bytes 
Requests per second: 6000.38 [#/sec] (mean) 
Time per request:  16.666 [ms] (mean) 
Time per request:  0.167 [ms] (mean, across all concurrent requests) 
Transfer rate:   632.85 [Kbytes/sec] received 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.3  0  2 
Processing: 12 16 3.2  15  37 
Waiting:  12 16 3.1  15  37 
Total:   13 17 3.2  16  37 

Percentage of the requests served within a certain time (ms) 
    50%  16 
    66%  16 
    75%  16 
    80%  17 
    90%  20 
    95%  23 
    98%  28 
    99%  34 
100%  37 (longest request) 

dernier test I 'bonjour le monde', il a atteint 7k req/s

Requests per second: 7201.18 [#/sec] (mean) 

Comment établir le profil et comprendre la raison pour laquelle Redis à http perdre un peu de performance?

Répondre

11

Je pense que vous avez mal interprété le résultat du benchmark multi_bench. D'abord, ce test de performance répartit la charge sur 5 connexions, tandis que vous n'en avez qu'une dans votre programme node.js. Plus de connexions signifient plus de tampons de communication (alloués sur une base par socket) et de meilleures performances. Puis, alors qu'un serveur Redis est capable de supporter 100K op/s (à condition d'ouvrir plusieurs connexions, et/ou d'utiliser le pipelining), node.js et node_redis ne peuvent pas atteindre ce niveau. Le résultat de votre exécution de multi_bench montre que lorsque le traitement en pipeline n'est pas utilisé, seuls 16K op/s sont atteints.

Client count: 5, node version: 0.10.15, server version: 2.6.4, parser: hiredis 
INCR,  1/5 min/max/avg/p95: 0/ 2/ 0.06/ 1.00 1233ms total, 16220.60 ops/sec 

Ce résultat signifie que sans pipelining, et avec 5 connexions simultanées, node_redis est en mesure de traiter 16K op/s au niveau mondial. Veuillez noter que mesurer un débit de 16K op/s tout en envoyant seulement 20K ops (valeur par défaut de multi_bench) n'est pas très précis. Vous devriez augmenter num_requests pour une meilleure précision. Le résultat de votre deuxième benchmark n'est pas si surprenant: vous ajoutez une couche http (qui est plus coûteuse à analyser que le protocole Redis lui-même), utilisez seulement 1 connexion à Redis tandis que ab essaye d'ouvrir 100 connexions simultanées au nœud. js, et finalement obtenir 6K op/s, ce qui entraîne un overhead de 1.2K op/s par rapport à un serveur HTTP "Hello world". Qu'est-ce que vous attendiez?

Vous pouvez essayer de réduire un peu plus les performances en exploitant les capacités de clustering node.js, as described in this answer.

+3

Une bonne réponse, je ne sais pas pourquoi il n'a pas été accepté. Peut-être que ce n'était pas une réponse que Linbo recherchait? :) – Vexter

Questions connexes