4

node_redisベンチマークをテストすると、incr の ops/s が 100000 を超えていることがわかります

$ 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 コマンドを使用してテストします。req/s は 6000 しかありません

$ 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 ベンチマークの結果を誤解していると思います。

まず、このベンチマークでは、node.js プログラムに接続が 1 つしかないのに、負荷が 5 つの接続に分散されます。接続数が増えると、(ソケットごとに割り当てられる) 通信バッファーが増え、パフォーマンスが向上します。

次に、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 を増やす必要があります。

2 番目のベンチマークの結果はそれほど驚くべきものではありません: http レイヤー (Redis プロトコル自体よりも解析にコストがかかります) を追加し、Redis への接続を 1 つだけ使用し、ab が node.js への 100 の同時接続を開こうとし、最後に6K オペレーション/秒を取得すると、「Hello world」HTTP サーバーと比較して 1.2K オペレーション/秒のスループット オーバーヘッドが発生します。何を期待していましたか?

この回答 で説明されているように、node.js クラスタリング機能を活用することで、パフォーマンスをもう少し絞り出すことができます。

于 2013-07-31T08:39:23.397 に答える