Performance 带有redis的nodejs http,只有6000req/s

Performance 带有redis的nodejs http,只有6000req/s,performance,node.js,http,redis,benchmarking,Performance,Node.js,Http,Redis,Benchmarking,测试基准,它显示incr有超过100000次操作/秒 $node multi_bench.js 客户端计数:5,节点版本:0.10.15,服务器版本:2.6.4,解析器:hiredis 增量,1/5 min/max/avg/p95:0/2/0.06/1.00 1233ms总计,16220.60 ops/sec 增量,50/5 min/max/avg/p95:0/4/1.61/3.00 648ms总计,30864.20 ops/sec 增量,200/5 min/max/avg/p95:0/14/5

测试基准,它显示incr有超过100000次操作/秒

$node multi_bench.js
客户端计数:5,节点版本:0.10.15,服务器版本:2.6.4,解析器:hiredis
增量,1/5 min/max/avg/p95:0/2/0.06/1.00 1233ms总计,16220.60 ops/sec
增量,50/5 min/max/avg/p95:0/4/1.61/3.00 648ms总计,30864.20 ops/sec
增量,200/5 min/max/avg/p95:0/14/5.28/9.00 529ms总计,37807.18 ops/sec
增量,20000/5分钟/最大值/平均值/p95:42/508/302.22/467.00 519毫秒总计,38535.65次/秒
然后,我在带有http服务器的nodejs中添加redis

使用ab命令进行测试,它只有6000个请求/秒

$ab-n 10000-c 100本地主机:6666/
这是ApacheBench,版本2.3
版权1996亚当·特维斯,宙斯科技有限公司,http://www.zeustech.net/
授权给Apache软件基金会,http://www.apache.org/
对本地主机进行基准测试(耐心等待)
完成了1000个请求
已完成2000项请求
已完成3000个请求
已完成4000个请求
已完成5000个请求
已完成6000个请求
已完成7000个请求
已完成8000个请求
已完成9000个请求
已完成10000个请求
完成了10000个请求
服务器软件:
服务器主机名:localhost
服务器端口:6666
文档路径:/
文件长度:7字节
并发级别:100
测试时间:1.667秒
完成申请:10000
失败的请求:0
写入错误:0
传输总量:1080000字节
传输的HTML:70000字节
每秒请求数:6000.38[#秒](平均值)
每次请求的时间:16.666[ms](平均值)
每个请求的时间:0.167[ms](所有并发请求的平均时间)
传输速率:接收到632.85[千字节/秒]
连接时间(毫秒)
最小平均值[+/-sd]最大中值
连接:0.3 0 2
处理:12163.21537
轮候时间:12163.11537
总数:13 17 3.2 16 37
在特定时间内服务的请求百分比(毫秒)
50%     16
66%     16
75%     16
80%     17
90%     20
95%     23
98%     28
99%     34
100%37(最长请求)
上次我测试“hello world”,它达到了7k请求/秒


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

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

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

然后,尽管Redis服务器能够支持100K op/s(前提是您打开多个连接和/或使用管道),node.js和node_Redis却无法达到这一水平。运行multi_工作台的结果表明,当不使用流水线时,仅实现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操作(multi_bench的默认值)时测量16K操作/秒的吞吐量不是很准确。您应该增加num_请求以提高准确性

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


您可以尝试通过利用node.js群集功能来挤出更多的性能,。

这是一个很好的回答,不知道为什么它不被接受。也许这不是林波想要的答案
Requests per second:    7201.18 [#/sec] (mean)
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