【发布时间】:2014-05-29 20:52:35
【问题描述】:
我对 Node.js 比较陌生(玩了一段时间,但刚开始将它用于严肃的事情)。我在本地测试时遇到了一些非常奇怪的基准测试行为,因此决定构建最基本的 HTTP 服务器并使用 Apache Benchmark (ab) 对其进行基准测试。
这是我的代码:
var http = require('http');
http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello, world!');
res.end();
}).listen(8888);
当我像这样运行 ab 时:
ab -n 1000000 -c 100 'http://127.0.0.1:8888/'
我得到以下结果:
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 127.0.0.1 (be patient)
apr_socket_recv: Operation timed out (60)
Total of 16413 requests completed
我使用的是 nodejs 版本 0.10.25。在运行服务器和 ab 之前,我还将 ulimit 设置为 8192(最大值)——因此无法达到文件描述符限制。
以下是我不明白的地方:
- 为什么 AB 不能发出所有 100 万个请求?为什么仅在 ~16000 之后就失败了?
- 这是正常行为吗?我期待看到大量的吞吐量,并能够快速完成测试。
谢谢!
奖励:我录制了一个小截屏视频,您可以在此处查看:http://recordit.co/9i0ja6GZqR 这说明了我在说什么。
更新:
看到这个帖子后:Why does a simple Thin server stop responding at 16500 requests when benchmarking? 并运行:
sudo sysctl -w net.inet.tcp.msl=1000
我能够成功完成我的 ab 命令,结果如下:
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 127.0.0.1 (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Completed 1000000 requests
Finished 1000000 requests
Server Software:
Server Hostname: 127.0.0.1
Server Port: 8888
Document Path: /
Document Length: 13 bytes
Concurrency Level: 100
Time taken for tests: 338.545 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 114000000 bytes
HTML transferred: 13000000 bytes
Requests per second: 2953.82 [#/sec] (mean)
Time per request: 33.854 [ms] (mean)
Time per request: 0.339 [ms] (mean, across all concurrent requests)
Transfer rate: 328.84 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 14 212.3 0 8363
Processing: 0 20 114.8 11 4205
Waiting: 0 20 114.2 11 4205
Total: 0 34 240.8 11 8368
Percentage of the requests served within a certain time (ms)
50% 11
66% 13
75% 14
80% 14
90% 17
95% 21
98% 32
99% 605
100% 8368 (longest request)
不幸的是,我无法超过 100 个并发请求 - 例如,如果我达到 200 个,我会得到以下结果:
rdegges at Randalls-MacBook-Pro in ~
○ ab -n 1000000 -c 200 'http://127.0.0.1:8888/'
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 127.0.0.1 (be patient)
apr_socket_recv: Connection reset by peer (54)
似乎我基本上被限制在 100 个并发请求。
我关心的另一件事是第一个 ab 命令的响应时间。看起来平均响应时间约为 33.854 毫秒,考虑到服务器正在做什么,这似乎非常高。
所以我想我的问题是:我可以做些什么来改善并发请求并减少每个请求的处理时间?我确定我在这里做错了什么。
谢谢!
【问题讨论】:
-
您的计算机可以一次向 apache 发出这么多请求吗?从一百个盒子中尝试 10,000 个并发,以更好地了解节点的能力。我看不出一个盒子如何请求和响应所有这些,即使可以,结果也毫无意义。
-
你有和 nginx/apache/... 的比较吗?要使用所有内核,您可以使用 cluster 模块。
-
您应该首先对您的服务器进行基准测试以了解响应需要多长时间。并发 100 时,您基本上只有 10 毫秒的时间来响应请求,否则事件循环将被饿死,事情开始堆积。现在,10ms 实际上很多,但如果底层网络堆栈被请求淹没,你可能会到达那里。一旦事情开始堆积,就没有回头路了。一切基本上都停止了。您可以尝试的一件事是从另一台机器上运行 AB。 AB 会产生大量 CPU 使用率,这可能会导致该问题。
-
通过一些编辑更新了我的问题,谢谢!
-
我发现 OS X 上的
ab几乎坏掉了。 Here 是在我的 Mac 上针对您的脚本运行httperf的输出。
标签: javascript node.js macos performance apachebench