我有一個包含數千個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以避免一些限制(文件,端口,內存......)。
雖然不是答案,但您可以考慮使用'cluster'模塊來利用所有可用的CPU,以便工作更好地分佈在您的硬件上。上下文切換也可能在這裏發揮作用,但我不認爲這會導致如此嚴重的延遲。 – 2015-02-08 22:55:40