使用redis的nodejs http只有6000req / s

testingnode_redis基准,它显示incr有超过10万ops / s

$ 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 

然后,我用http服务器在nodejs中添加redis

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

使用ab命令来testing,它只有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) 

最后,我testing了“hello world”,达到了7k req / s

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

如何configuration和找出为什么redis在http中失去一些性能的原因?

我想你误解了multi_bench基准的结果。

首先,这个基准将负载分散到5个连接上,而在node.js程序中只有一个连接。 更多的连接意味着更多的通信缓冲区(按每个插槽分配)和更好的性能。

然后,当一个Redis服务器能够维持100K运算/秒(假设你打开了几个连接,或者使用stream水线),node.js和node_redis不能达到这个水平。 运行multi_bench的结果表明,当不使用stream水线时,只能达到16K运算/秒。

 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 

这个结果意味着在没有stream水线的情况下,并且有5个并发连接,node_redis能够全局处理16K的操作系统。 请注意,测量16K op / s的吞吐量,而仅发送20K ops(multi_bench的默认值)不是很准确。 您应该增加num_requests以获得更好的准确性。

你的第二个基准testing的结果并不奇怪:你添加一个http层(比Redis协议本身更昂贵的分析),只使用1个连接到Redis,而ab尝试打开100个到node.js的并发连接,最后得到6K op / s,与“Hello world”HTTP服务器相比,导致1.2K操作/秒的吞吐量开销。 你期待什么?

正如本答案所述,您可以尝试利用node.js集群function来提高性能。