4

测试node_redis基准,它显示 incr 有超过 100000 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命令测试,只有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)

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

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

如何分析和找出http中的redis失去一些性能的原因?

4

1 回答 1

12

我认为您误解了 multi_bench 基准测试的结果。

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

然后,虽然 Redis 服务器能够维持 100K op/s(假设您打开多个连接,和/或使用流水线),但 node.js 和 node_redis 无法达到这个水平。multi_bench 的运行结果表明,当不使用流水线时,只能实现 16K op/s。

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  

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

您的第二个基准测试的结果并不令人惊讶:您添加了一个 http 层(解析比 Redis 协议本身更昂贵),仅使用 1 个到 Redis 的连接,而 ab 尝试打开到 node.js 的 100 个并发连接,最后获得 6K op/s,与“Hello world”HTTP 服务器相比,产生 1.2K op/s 的吞吐量开销。你期待什么?

您可以尝试通过利用 node.js 集群功能来提高性能,如本答案中所述

于 2013-07-31T08:39:23.397 回答