2015-02-08 57 views
3

我有一個包含數千個URL的列表。我想通過http請求獲得健康檢查(healt.php)。節點中有數千個併發http請求

這是我的問題:

我寫了一個節點中的應用程序。它以合併的方式提出請求。我使用一個變量來控制打開的併發連接數量。 300,即。 一個接一個,每個請求都很快,不超過500ms。

但是當我運行應用程序,結果是:

$ node agent.js 

200ms url1.tld 
250ms url4.tld 
400ms url2.tld 
530ms url8.tld 
800ms url3.tld 
... 
2300ms urlN.tld 
... 
30120ms urlM.tld 

似乎有併發的限制。當我執行

$ ps axo nlwp,cmd | grep node 

結果是:

6 node agent.js 

有6個線程來管理所有的併發連接。我發現了一個EVN變量節點來控制併發:UV_THREADPOOL_SIZE

$ UV_THREADPOOL_SIZE=300 node agent.js 

200ms url1.tld 
210ms url4.tld 
220ms url2.tld 
240ms url8.tld 
400ms url3.tld 
... 
800ms urlN.tld 
... 
1010ms urlM.tld 

的問題依然存在,但效果要好得多。使用ps命令:

$ ps axo nlwp,cmd | grep node 

132 node agent.js 

下一步:尋找在節點的源代碼,我發現恆定在DEPS/UV/SRC/UNIX/threadpool.c:

#define MAX_THREADPOOL_SIZE 128 

確定。我已經將該值更改爲2048,編譯並安裝節點並運行一次命令

$ UV_THREADPOOL_SIZE=300 node agent.js 

一切似乎都沒問題。響應時間不會逐漸增加。但是,當我嘗試使用更大的併發數時,問題出現。但是這一次它與線程的數量無關,因爲使用ps命令我看到了足夠多的線程。

我試圖在golang中編寫相同的應用程序,但結果是一樣的。時間在逐漸增加。

所以,我的問題是:併發限制在哪裏?內存和CPU的負載和帶寬不是越界。我調整了sysctl.conf和limits.conf以避免一些限制(文件,端口,內存......)。

+0

雖然不是答案,但您可以考慮使用'cluster'模塊來利用所有可用的CPU,以便工作更好地分佈在您的硬件上。上下文切換也可能在這裏發揮作用,但我不認爲這會導致如此嚴重的延遲。 – 2015-02-08 22:55:40

回答

2

您可能會被http.globalAgent的maxSockets扼殺。根據您是否使用HTTP或HTTPS,看是否能解決您的問題:如果你使用requestrequest-promise可以設置池的大小

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