performance - nodejs http with redis,只有 6000req/s

原文 标签 performance node.js http redis benchmarking

测试 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失去一些性能的原因?

最佳答案

我认为您误解了 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 ops(multi_bench 的默认值)不是很准确。您应该增加 num_requests 以获得更好的准确性。

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

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

关于performance - nodejs http with redis,只有 6000req/s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17961061/

相关文章:

sql - 有没有办法使此SQL更有效?

javascript - 如何使用JavaScript对SQLite执行批量插入?我正在使用phonegap + sencha框架

javascript - Typescript/Electron/Webpack 模块如何/为什么有绝对路径?

java - 如何在AsyncTask中捕获内存不足异常

python - 在发送实际响应之前发送请求的间歇状态

mysql - MySQL GROUP BY函数需要很多时间

mysql - 正确嵌套SQL查询

javascript - Node/Javascript-组合PDF并创建书签样式/目录像Acrobat一样

node.js - Node 异步调用返回数据作为响应

java - 如何获取确切的请求(路径/参数)以能够重定向回同一位置