2013-05-09 61 views
10

所以,我試圖優化我的節點應用程序,並且我的應用程序發出HTTP和HTTPS請求。Nodejs最大套接字池設置

從這篇文章從LinkedIn製作節點之快,建議禁用套接字池,除去5個插座的極限:

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

現在從GitHub上Mikeal(請求的開發者),他建議:

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

公平地說,他並不是建議無窮大,但是你可以在那裏提出任何合理的價值。現在

,我的應用程序使用HTTP和HTTPS,所以我用這個代碼:

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

當我這樣做,我得到這個錯誤:

TypeError: Cannot set property 'maxSockets' of undefined

最後,在查看HTTP記錄它不顯示「globalAgent」,而只顯示agent.maxSockets

所以,我想知道第一,重寫此參數的最佳語法是什麼?

二,什麼是最優值?它是基於我的服務器的內存量嗎?它的帶寬?

+2

當我升級到Node.js v0.10.24時,我不再看到以下錯誤:TypeError:無法設置未定義的屬性'maxSockets' – 2014-03-17 18:01:21

+1

請注意,Node 0.12將默認的'maxSockets'值更改爲'Infinity':http://stackoverflow.com/a/12061013/504930 – devius 2015-10-06 14:59:25

回答

14

關於TypeError的問題,我在設置http.globalAgent.maxSocketshttps.globalAgent.maxSockets時沒有遇到任何錯誤。您的應用中還有其他內容正在發生。

關於您的問題的第一部分,請認識到您不僅限於使用全局代理。你可以創建自己的Agent實例,並用它來發出請求:

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

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

請使用自定義代理與全球代理根本不作出互動。如果您沒有明確指定一個或全部使用代理(通過在請求選項中傳遞false作爲agent值),則全局代理只是默認的代理。

所以當文檔說​​,他們真的指的是通用Agent類;每個實例都具有該屬性,其中包括您要通過http.globalAgent訪問必須的全局(默認)代理–。

您的問題的第二部分(最佳maxSockets)是一個難以回答的問題。請記住,許多服務器將限制來自給定IP的併發連接數量,並且要確保不會讓大量併發請求壓倒服務器。 (如果有足夠的請求立即啓動,您實際上正在對服務器執行DOS操作。)

+0

因此,我檢查了一倍。它在我的本地機器(節點v0.10.3和v0.8.7)上正常工作,但它在我的Joyent SmartOS機器上崩潰(也運行節點v0.8。7)的消息「TypeError:不能設置未定義的屬性'maxSockets'」爲什麼它會不同? – 2013-05-10 18:38:37

+0

它可能是Joyent PaaS的體系結構限制。解決他們的支持。 – matanster 2013-12-18 21:48:37

+0

您是否檢查過maxSockets是否適用於https? – 2016-09-13 16:09:49