我正在实现基于NodeJS的脚本,用于与couchbase和其他服务进行通信。这是一个长期运行的脚本,过了一段时间我得到"连接EMFILE"为了服务。我的代码示例如下:
function createContainer(chunkName,recordingID,chunkData)
{
var swiftHTTPPath='http://'+swiftIPAddr+'/swift/v1/'+recordingID;
var path = '/swift/v1/'+recordingID;
var swiftOptions = {
hostname : swiftIPAddr,
port : swiftPort,
path : path,
method : 'PUT',
};
http.get(swiftHTTPPath, function(res) {
if(res.statusCode == '404')
{
var req = http.request(swiftOptions, function(res)
{
res.setEncoding('utf8');
res.on('data', function (chunk)
{
console.log('Container created');
});
res.on('end', function() {
});
});
req.on('error', function(e)
{
console.log(e.message);
});
req.end();
}
else
{
console.log('Container already exists');
}
}).on('error', function(e)
{
console.log('e.message);
});
}
以下命令显示有超过1024个打开的连接
lsof -i -n -P > mylog.log
........
node 14135 ubuntu 1020u IPv4 5249347 0t0 TCP 10.1.1.1:53623->10.1.1.2:8091 (ESTABLISHED)
node 14135 ubuntu 1021u IPv4 5249350 0t0 TCP 10.1.1.1:42021->10.1.1.2:11210 (ESTABLISHED)
node 14135 ubuntu 1022u IPv4 5249351 0t0 TCP 10.1.1.1:53627->10.1.1.2:8091 (ESTABLISHED)
........
我可以增加ulimit值,但我想知道我是否以正确的方式执行HTTP GET,POST请求。有没有办法重用/终止连接?
答案 0 :(得分:0)
由于您的所有(或大多数)请求看起来都是单个主机,因此您可以将每个主机的最大并发套接字数设置为有限的数量,例如100.使用http://my.test.site执行此操作Node的http
模块中的选项。
关于简单地重用连接,这应该自动发生。事实并非让我相信你同时发出了许多请求......所以你也可以通过逐渐发出请求来解决这个问题。