gpt4 book ai didi

performance - Node.js - pipe() 到 http 响应导致 ubuntu 上的响应时间变慢

转载 作者:搜寻专家 更新时间:2023-11-01 00:25:34 25 4
gpt4 key购买 nike

当通过服务器 A 将服务 B 的响应传输到客户端时,我注意到严重的性能问题。我在调查我们主要执行代理的 Node 服务器之一的性能时发现了这个问题。我们正在使用 http-proxy 进行代理,起初我认为是 http-proxy 很慢,但我将问题缩小到那个简单的代码片段,它只是使用 http.get 向另一台服务器发出请求并返回对客户端的响应。

服务器 A(代理):

/*jslint node:true nomen:true vars:true*/
var http = require('http');

function outputMs() {
'use strict';
var d = new Date();
var n = d.getUTCMilliseconds();
return n;
}

http.createServer(function (req, res) {
'use strict';
var startTime = outputMs();

var options = {
hostname: '10.0.1.114',
port: 3001,
path: '/test'
};

if (req.url.indexOf('/pipe') > -1) {
http.get(options, function (proxyRes) {
// This is slow!!!
proxyRes.pipe(res);
proxyRes.on('data', function (chunk) {
console.log('data:' + (outputMs() - startTime));
console.log('received:' + chunk);
});
proxyRes.on('end', function () {
console.log('end:' + (outputMs() - startTime));
});
});
} else {
var data;
http.get(options, function (proxyRes) {
// This is fast!!!
proxyRes.on('data', function (chunk) {
console.log('data:' + (outputMs() - startTime));
data += chunk;
});
proxyRes.on('end', function () {
console.log('end:' + (outputMs() - startTime));
res.end(data);
});
});
}
}).listen(3000);

服务器 B:

/*jslint node:true nomen:true vars:true*/
var http = require('http');

http.createServer(function (req, res) {
'use strict';
res.end('Hello World');
}).listen(3001);

请求事件似乎在两种情况下花费相同的时间,但客户端接收响应的速度要慢得多。使用 curl 进行测试:

使用管道:

C:\github\mecs> curl -s -w "%{time_total}\n" -o /dev/null http://54.209.35.253:3000/pipe
0.265
C:\github\mecs> curl -s -w "%{time_total}\n" -o /dev/null http://54.209.35.253:3000/pipe
0.265

不使用管道:

C:\github\mecs> curl -s -w "%{time_total}\n" -o /dev/null http://54.209.35.253:3000
0.047
C:\github\mecs> curl -s -w "%{time_total}\n" -o /dev/null http://54.209.35.253:3000
0.063

两台服务器都在 AWS 上的微实例上运行,运行 Ubuntu Server 12.04.1 LTS 和 node.js 0.10.21。我在 Node 0.10.20 和 0.8.24 以及 Ubuntu Server 12.04.2 和 13.10 上重现了这个问题。在 Windows 上未观察到该问题。

有没有人遇到同样的问题?有解决办法吗?

非常感谢您的帮助...

最佳答案

您可能需要执行类似 socket.setNoDelay([noDelay]) 的操作。虽然不确定如何使用 http 模块来做到这一点。我的猜测是一端正在等待套接字关闭,因为这是一条小消息,当它超时时,您会看到响应。

setNoDelay() 必须在客户端请求时调用,我第一次尝试它是在我的代理请求上。

server.on('connection', function (socket) {     'use strict';     console.log('server.on.connection - setNoDelay');     socket.setNoDelay(true); });

关于performance - Node.js - pipe() 到 http 响应导致 ubuntu 上的响应时间变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19844594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com