刚开始测试nodejs,并希望在理解以下行为方面获得一些帮助:
var http = require('http');
http.createServer(function(req, res){
res.writeHeader(200, {'Content-Type': 'text/plain'});
res.end('foo');
}).listen(1001, '0.0.0.0');
var http = require('http');
http.createServer(function(req, res){
res.writeHeader(200, {'Content-Type': 'text/plain'});
res.write('foo');
res.end('bar');
}).listen(1001, '0.0.0.0');
在Chrome中测试响应时间时:
例如#1 - 6-10ms
例子#2 - 200-220ms
但是,如果通过nginx proxy_pass测试这两个例子
server{
listen 1011;
location / {
proxy_pass http://127.0.0.1:1001;
}
}
我明白了:
例如#1 - 4-8ms
例子#2 - 4-8ms
我不是nodejs或nginx的专家,并询问是否有人可以解释这个?
nodejs - v.0.8.1
nginx - v.1.2.2
感谢Hippo,我使用和不使用nginx在我的服务器上进行了测试, 结果相反。
还添加到nginx config proxy_cache off
server{
listen 1011;
location / {
proxy_pass http://127.0.0.1:1001;
proxy_cache off;
}
}
ab -n 1000 -c 50 http:// 127.0.0.1:1001 /
Server Software: Server Hostname: 127.0.0.1 Server Port: 1001 Document Path: / Document Length: 65 bytes Concurrency Level: 50 Time taken for tests: 1.018 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 166000 bytes HTML transferred: 65000 bytes Requests per second: 981.96 [#/sec] (mean) Time per request: 50.919 [ms] (mean) Time per request: 1.018 [ms] (mean, across all concurrent requests) Transfer rate: 159.18 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.6 0 3 Processing: 0 50 44.9 19 183 Waiting: 0 49 44.8 17 183 Total: 1 50 44.7 19 183
ab -n 1000 -c 50 http:// 127.0.0.1:1011 /
Server Software: nginx/1.2.2 Server Hostname: 127.0.0.1 Server Port: 1011 Document Path: / Document Length: 65 bytes Concurrency Level: 50 Time taken for tests: 1.609 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 187000 bytes HTML transferred: 65000 bytes Requests per second: 621.40 [#/sec] (mean) Time per request: 80.463 [ms] (mean) Time per request: 1.609 [ms] (mean, across all concurrent requests) Transfer rate: 113.48 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.6 0 3 Processing: 2 77 44.9 96 288 Waiting: 2 77 44.8 96 288 Total: 3 78 44.7 96 288
ab -n 1000 -c 50 http:// 127.0.0.1:1001 /
Server Software: Server Hostname: 127.0.0.1 Server Port: 1001 Document Path: / Document Length: 76 bytes Concurrency Level: 50 Time taken for tests: 1.257 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 177000 bytes HTML transferred: 76000 bytes Requests per second: 795.47 [#/sec] (mean) Time per request: 62.856 [ms] (mean) Time per request: 1.257 [ms] (mean, across all concurrent requests) Transfer rate: 137.50 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.3 0 2 Processing: 0 60 47.8 88 193 Waiting: 0 60 47.8 87 193 Total: 0 61 47.7 88 193
ab -n 1000 -c 50 http:// 127.0.0.1:1011 /
Server Software: nginx/1.2.2 Server Hostname: 127.0.0.1 Server Port: 1011 Document Path: / Document Length: 76 bytes Concurrency Level: 50 Time taken for tests: 1.754 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 198000 bytes HTML transferred: 76000 bytes Requests per second: 570.03 [#/sec] (mean) Time per request: 87.715 [ms] (mean) Time per request: 1.754 [ms] (mean, across all concurrent requests) Transfer rate: 110.22 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.4 0 2 Processing: 1 87 42.1 98 222 Waiting: 1 86 42.3 98 222 Total: 1 87 42.0 98 222
现在结果看起来更合乎逻辑,但在调用res.write()
我猜这是(确实看起来像)一个愚蠢的问题,但我仍然在浏览器中使用此服务器配置(Centos 6)和此具体服务器(vps)的响应时间有很大差异。
在我的家用电脑(Ubuntu 12)上,但是从localhost测试的旧版本一切正常。
答案 0 :(得分:5)
窥视http.js表明案例#1在nodejs本身有特殊处理,我猜是某种快捷方式优化。
var hot = this._headerSent === false &&
typeof(data) === 'string' &&
data.length > 0 &&
this.output.length === 0 &&
this.connection &&
this.connection.writable &&
this.connection._httpMessage === this;
if (hot) {
// Hot path. They're doing
// res.writeHead();
// res.end(blah);
// HACKY.
if (this.chunkedEncoding) {
var l = Buffer.byteLength(data, encoding).toString(16);
ret = this.connection.write(this._header + l + CRLF +
data + '\r\n0\r\n' +
this._trailer + '\r\n', encoding);
} else {
ret = this.connection.write(this._header + data, encoding);
}
this._headerSent = true;
} else if (data) {
// Normal body write.
ret = this.write(data, encoding);
}
if (!hot) {
if (this.chunkedEncoding) {
ret = this._send('0\r\n' + this._trailer + '\r\n'); // Last chunk.
} else {
// Force a flush, HACK.
ret = this._send('');
}
}
this.finished = true;
答案 1 :(得分:4)
我已经为您提供了示例文件并使用ab
(Apache Benchmark)作为正确的工具来对HTTP服务器性能进行基准测试:
示例1:
Concurrency Level: 50
Time taken for tests: 0.221 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 104000 bytes
HTML transferred: 3000 bytes
Requests per second: 4525.50 [#/sec] (mean)
Time per request: 11.049 [ms] (mean)
Time per request: 0.221 [ms] (mean, across all concurrent requests)
Transfer rate: 459.62 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.7 0 4
Processing: 1 11 6.4 10 32
Waiting: 1 11 6.4 10 32
Total: 1 11 6.7 10 33
示例2:
Concurrency Level: 50
Time taken for tests: 0.256 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 107000 bytes
HTML transferred: 6000 bytes
Requests per second: 3905.27 [#/sec] (mean)
Time per request: 12.803 [ms] (mean)
Time per request: 0.256 [ms] (mean, across all concurrent requests)
Transfer rate: 408.07 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.6 0 4
Processing: 1 12 7.0 12 34
Waiting: 1 12 6.9 12 34
Total: 1 12 7.1 12 34
注意:强>
第二个例子和第一个例子一样快。差异可能是由于代码中的附加函数调用以及文档大小比第一个大的原因造成的。