在没有集群的情况下,Node.js在ab中好得多,我错过了什么?

更新1 :@BagosGiArtesting与一个相当类似的configuration显示集群总是应该performance更好。 也就是说,我的configuration有一些问题,我要求你帮我找出可能的结果。

更新2 :我想深入讨论这个问题。 我已经在一个LiveCD *(Xubuntu 13.04),相同的节点版本上testing过。 首先,在Linux下,性能比Windows好: -n 100000 -c 1000给我6409.85没有群集的请求/秒,7215.74请求/秒的群集。 Windows构build肯定有很多问题。 不过我想调查为什么这种情况只发生在我身上,因为一些具有类似configuration的人performance更好(集群performance也很好)。

*应该注意的是,LiveCD使用RAM文件系统,而在Windows中我使用的是快速SSD。

这怎么可能? cluster模块应该不会更好吗? 规格:Windows 7 x64,双核P8700 2.53Ghz,4GB内存,Node.js 0.10.5,ab 2.3。 testing命令行是ab -n 10000 -c 1000 http://127.0.0.1:8080/

 var http = require('http'); http.createServer(function (req, res) { res.end('Hello World'); }).listen(8080); 

基准testing结果〜2840.75次/秒

 This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Server Software: Server Hostname: 127.0.0.1 Server Port: 8080 Document Path: / Document Length: 12 bytes Concurrency Level: 1000 Time taken for tests: 3.520 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 870000 bytes HTML transferred: 120000 bytes Requests per second: 2840.75 [#/sec] (mean) Time per request: 352.020 [ms] (mean) Time per request: 0.352 [ms] (mean, across all concurrent requests) Transfer rate: 241.35 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 7.1 0 505 Processing: 61 296 215.9 245 1262 Waiting: 31 217 216.7 174 1224 Total: 61 297 216.1 245 1262 Percentage of the requests served within a certain time (ms) 50% 245 66% 253 75% 257 80% 265 90% 281 95% 772 98% 1245 99% 1252 100% 1262 (longest request) 

使用集群模块:

 var cluster = require('cluster'), http = require('http'), numCPUs = require('os').cpus().length; if (cluster.isMaster) { // Fork workers for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function (worker, code, signal) { console.log('worker ' + worder.process.pid + ' died'); }); } else { http.createServer(function (req, res) { res.end('Hello World'); }).listen(8080); } 

…和相同的基准,结果是最差的: 849.64请求/秒

 This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Server Software: Server Hostname: 127.0.0.1 Server Port: 8080 Document Path: / Document Length: 12 bytes Concurrency Level: 1000 Time taken for tests: 11.770 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 870000 bytes HTML transferred: 120000 bytes Requests per second: 849.64 [#/sec] (mean) Time per request: 1176.967 [ms] (mean) Time per request: 1.177 [ms] (mean, across all concurrent requests) Transfer rate: 72.19 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 21.3 0 509 Processing: 42 1085 362.4 1243 2274 Waiting: 27 685 409.8 673 1734 Total: 42 1086 362.7 1243 2275 Percentage of the requests served within a certain time (ms) 50% 1243 66% 1275 75% 1286 80% 1290 90% 1334 95% 1759 98% 1772 99% 1787 100% 2275 (longest request) 

你没有给你的URL地址端口号8080。

默认情况下,在没有给定端口时使用80(8080是Apache Tomcat的默认端口)。 也许另一台服务器正在您的机器上的端口80上侦听。

更新

机器规格:Intel(R)Xeon(R)CPU X5650 @ 2.67GHz,64GB RAM,CentOS Linux版本6.0(最终版本),node -v 0.8.8,ab -V 2.3

我认为在你的情况下的问题是,无论是Windows没有有效地使用资源或CPU或RAM运行基准时饱和。

没有集群(使用相同的脚本)

 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 10.232.5.169 (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: 10.232.5.169 Server Port: 8000 Document Path: / Document Length: 11 bytes Concurrency Level: 1000 Time taken for tests: 3.196 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 860000 bytes HTML transferred: 110000 bytes Requests per second: 3129.14 [#/sec] (mean) Time per request: 319.577 [ms] (mean) Time per request: 0.320 [ms] (mean, across all concurrent requests) Transfer rate: 262.80 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 3 43.0 0 2999 Processing: 1 81 39.9 81 201 Waiting: 1 81 39.9 81 201 Total: 12 84 57.8 82 3000 Percentage of the requests served within a certain time (ms) 50% 82 66% 103 75% 114 80% 120 90% 140 95% 143 98% 170 99% 183 100% 3000 (longest request) 

使用群集(使用您的群集脚本)

 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 10.232.5.169 (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: 10.232.5.169 Server Port: 8000 Document Path: / Document Length: 11 bytes Concurrency Level: 1000 Time taken for tests: 1.056 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 924672 bytes HTML transferred: 118272 bytes Requests per second: 9467.95 [#/sec] (mean) Time per request: 105.620 [ms] (mean) Time per request: 0.106 [ms] (mean, across all concurrent requests) Transfer rate: 854.96 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 22 47 13.6 46 78 Processing: 23 52 13.8 52 102 Waiting: 5 22 17.6 17 83 Total: 77 99 5.8 100 142 Percentage of the requests served within a certain time (ms) 50% 100 66% 101 75% 102 80% 102 90% 104 95% 105 98% 110 99% 117 100% 142 (longest request) 

我认为这是不使用ApacheBench的并发选项的结果。 作为默认的ab ,当时发出一个请求,所以每个请求(在集群testing中)由一个节点服务,其余的都保持空闲状态。 如果使用-c选项,则将以nodejs的集群模式为基准。 例如
ab -n 10000 -c 4 -t 25 http://127.0.0.1:8083/
我的结果是:
没有集群ab -n 10000 -t 25 http://127.0.0.1:8083/

 Server Software: Server Hostname: 127.0.0.1 Server Port: 8083 Document Path: / Document Length: 11 bytes Concurrency Level: 1 Time taken for tests: 16.503 seconds Complete requests: 50000 Failed requests: 0 Write errors: 0 Total transferred: 4300000 bytes HTML transferred: 550000 bytes Requests per second: 3029.66 [#/sec] (mean) Time per request: 0.330 [ms] (mean) Time per request: 0.330 [ms] (mean, across all concurrent requests) Transfer rate: 254.44 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.3 0 1 Processing: 0 0 0.4 0 13 Waiting: 0 0 0.4 0 11 Total: 0 0 0.5 0 13 Percentage of the requests served within a certain time (ms) 50% 0 66% 0 75% 1 80% 1 90% 1 95% 1 98% 1 99% 1 100% 13 (longest request) 

用cluster ab -n 10000 -c 4 -t 25 http://127.0.0.1:8083/

 Server Software: Server Hostname: 127.0.0.1 Server Port: 8083 Document Path: / Document Length: 11 bytes Concurrency Level: 4 Time taken for tests: 8.935 seconds Complete requests: 50000 Failed requests: 0 Write errors: 0 Total transferred: 4300000 bytes HTML transferred: 550000 bytes Requests per second: 5595.99 [#/sec] (mean) Time per request: 0.715 [ms] (mean) Time per request: 0.179 [ms] (mean, across all concurrent requests) Transfer rate: 469.98 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.3 0 1 Processing: 0 1 0.6 1 17 Waiting: 0 0 0.6 0 17 Total: 0 1 0.6 1 18 Percentage of the requests served within a certain time (ms) 50% 1 66% 1 75% 1 80% 1 90% 1 95% 1 98% 1 99% 1 100% 18 (longest request) 

干杯!

编辑我忘了我的规格; Windows 8×64,英特尔酷睿i5-2430M @ 2.4GHz,6GB内存