在高负载下连接nodejs中的EADDRNOTAVAIL - 如何更快地释放或重用TCP端口?

时间:2014-02-18 16:23:13

标签: node.js express coffeescript port limit

我有一个基于快速框架的小型wiki web应用程序,它使用弹性搜索作为后端。对于每个请求,它基本上只进入弹性搜索DB,检索对象并返回由把手模板引擎呈现的对象。弹性搜索的通信是通过HTTP

只要我只运行一个node-js实例,这就很有效。在我更新代码以使用群集后(如nodejs-documentation中所述,我开始遇到以下错误:连接EADDRNOTAVAIL

当我运行3个或更多python脚本时,会出现此错误,该脚本会不断从我的服务器检索一些URL。使用3个脚本我可以检索~45,000个页面,其中4个和更多脚本运行它在30,000到37,000个页面之间只运行2个或1个脚本,我在半小时后停止它们,分别检索310,000页和160,000页。

我发现了这个similar question,并尝试更改http.globalAgent.maxSockets,但这没有任何效果。

这是代码的一部分,用于侦听URL并从弹性搜索中检索数据。

app.get('/wiki/:contentId', (req, res) ->
    http.get(elasticSearchUrl(req.params.contentId), (innerRes) ->
        if (innerRes.statusCode != 200)
            res.send(innerRes.statusCode)
            innerRes.resume()
        else
            body = ''
            innerRes.on('data', (bodyChunk) ->
                body += bodyChunk
            )
            innerRes.on('end', () ->
                res.render('page', {'title': req.params.contentId, 'content': JSON.parse(body)._source.html})
            )
    ).on('error', (e) ->
        console.log('Got error: ' + e.message)  # the error is reported here
    )
)

更新

在深入研究之后,我现在明白了问题的根源。我在测试运行期间多次运行命令netstat -an | grep -e tcp -e udp | wc -l,以查看使用了多少端口,如帖子Linux: EADDRNOTAVAIL (Address not available) error中所述。我可以观察到,当我收到EADDRNOTAVAIL错误时,使用了56677个端口(而不是通常的180个)

同样,当仅使用2个同步脚本时,使用的端口数量已达到约40,000(+/- 2,000),这意味着每个脚本使用~20,000个端口(这是node-js清理旧端口的时间)在创建新的脚本之前,运行它的3个脚本超过了56677端口(~60,000)。这解释了为什么它失败了3个脚本请求数据,而不是2。

所以现在我的问题改为 - 如何强制node-js更快地释放端口或一直重用相同的端口(这将是更好的解决方案)

由于

1 个答案:

答案 0 :(得分:2)

目前,根据documentation

,我的解决方案是将agent我的请求选项设置为false
  

选择退出与代理的连接池,默认请求连接:关闭。

因此我使用的端口数量不超过26,000 - 这仍然不是一个很好的解决方案,甚至更多,因为我不明白为什么重用端口不起作用,但它现在解决了这个问题。