当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 使用redis的nodejs http,只有6000req / s

来源:互联网 收集:自由互联 发布时间:2021-06-22
测试 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/se
测试 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服务器的nod​​ejs中添加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)

如何剖析并找出redis在http中失去一些性能的原因?

我认为你误解了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.请注意,测量吞吐量为16K op / s而仅发送20K操作(默认值为multi_bench)并不十分准确.您应该增加num_requests以获得更好的准确性.

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

您可以尝试通过利用node.js群集功能(as described in this answer)来提高性能.

网友评论