【问题标题】:Nodejs Max Socket Pooling SettingsNodejs 最大套接字池设置
【发布时间】:2013-05-09 22:55:10
【问题描述】:

所以,我正在尝试优化我的节点应用程序,我的应用程序发出 HTTP 和 HTTPS 请求。

LinkedIn 的这篇文章中,为了使节点更快,它建议禁用套接字池以消除 5 个套接字的限制:

// Disable socket pooling
var http = require('http');
var options = {.....};
options.agent = false;
var req = http.request(options)

现在来自 GitHub 上的 Mikeal(Request 的开发者),他建议:

require('http').globalAgent.maxSockets = Infinity

公平地说,他并没有建议无限,但你可以在那里设置任何合理的值。

现在,我的应用使用 http 和 https,所以我使用了以下代码:

var http = require('http');
http.globalAgent.maxSockets = 30;
var https = require('https');
https.globalAgent.maxSockets = 30;

当我这样做时,我得到这个错误:

TypeError:无法设置未定义的属性“maxSockets”

最后,在查看 HTTP 文档时,它没有显示“globalAgent”,而是只显示了agent.maxSockets

所以,我首先想知道,覆盖此参数的最佳语法是什么?

第二,什么是最优值?它是基于我的服务器拥有的内存量吗?它的带宽?

【问题讨论】:

  • 当我升级到 Node.js v0.10.24 时,我不再看到错误:TypeError: Cannot set property 'maxSockets' of undefined
  • 请注意,Node 0.12 将默认的maxSockets 值更改为Infinitystackoverflow.com/a/12061013/504930

标签: node.js sockets


【解决方案1】:

关于你得到的TypeError,我在设置http.globalAgent.maxSocketshttps.globalAgent.maxSockets 时没有收到任何错误。您的应用中还发生了其他事情。

关于您问题的第一部分,请意识到您不仅限于使用全局代理。您可以创建自己的 Agent 实例并使用它来发出请求:

var http = require('http');
var myAgent = new http.Agent();

http.request({ ... , agent: myAgent }, ...);

使用自定义代理发出的请求根本不与全局代理交互。如果您没有明确指定一个或选择不一起使用代理(通过在请求选项中将false 作为agent 值传递),则全局代理只是默认使用的。

所以当文档说agent.maxSockets 时,他们实际上指的是通用的Agent 类;每个实例都具有该属性,包括全局(默认)代理 - 您必须通过 http.globalAgent 访问它。

您问题的第二部分(最佳maxSockets)很难回答。请记住,许多服务器会限制来自给定 IP 的并发连接数,并且您要确保不会因大量并发请求而使服务器不堪重负。 (一次触发了足够多的请求,您实际上是在对服务器进行 DOS 操作。)

【讨论】:

  • 所以,我加倍检查。它在我的本地机器(节点 v0.10.3 和 v0.8.7)上运行良好,但它在我的 Joyent SmartOS 机器(也运行节点 v0.8.7)上崩溃并显示消息“TypeError:无法设置未定义的属性'maxSockets'”为什么会不一样吗?
  • 这可能是 Joyent PaaS 的架构限制。表达他们的支持。
猜你喜欢
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 2018-09-21
相关资源
最近更新 更多