[英]Node.js performance optimization involving HTTP calls
我有一個Node.js應用程序,該應用程序打開一個文件,掃描每一行,並進行涉及Couchbase的REST調用。 文件中的平均行數約為12至1300萬。 目前,沒有任何特殊設置,我的應用程序可以在約24分鍾內完全處理約100萬條記錄。 我經歷了很多問題,文章和Node文檔,但找不到有關以下內容的任何信息:
背景:我們有一個現有的Java應用程序,該應用程序通過產生100個線程來完全相同,並且與當前的節點應用程序相比,能夠實現稍微更好的吞吐量。 但是我要嘗試使用節點,因為有問題的兩個操作(讀取文件並為每行進行REST調用)對於節點應用程序來說似乎是完美的情況,因為它們在節點中都可以是異步的,而Java應用程序會阻止這些操作。 ..
任何幫助將不勝感激...
通常,您應該將有關堆棧溢出的問題分解為多個部分。 由於您的問題都在同一件事上,我將回答它們。 首先,讓我從底部開始:
我們有一個現有的Java應用程序,它通過產生100個線程來實現完全相同的工作...但是我想嘗試節點,因為有問題的兩個操作...對於節點應用程序來說似乎是完美的情況,因為它們都可以在節點中像Java一樣異步應用阻止了這些呼叫。
異步調用和阻塞調用只是幫助您控制流量和工作量的工具。 您的Java應用程序正在使用100個線程,因此一次可能具有100個線程。 您的Node.js應用程序可能有可能一次執行1000項操作,但是某些操作將在JavaScript中的單個線程上完成,而其他IO工作將從線程池中提取。 無論如何,如果您要調用的后端系統一次只能處理20件事情,那么這都不重要。 如果您的系統被100%使用,那么改變工作方式當然不會加快速度。
簡而言之,使某些事物異步並不是提高速度的工具,而是管理工作量的工具。
節點可以同時打開X個http連接/套接字的設置在哪里? 我可以更改它嗎?
Node.js的HTTP客戶端自動具有一個代理,允許您利用保持活動連接。 這也意味着除非編寫代碼,否則不會泛洪單個主機。 如文檔中所述,您需要的是http.globalAgent.maxSocket=1000
: http : //nodejs.org/api/http.html#http_agent_maxsockets
我必須規范文件處理,因為文件讀取比REST調用快得多,因此過一會兒有太多打開的REST請求,並且阻塞了系統,並且內存不足。所以現在我讀了1000行為REST調用完成這些操作,然后恢復它(我正在使用流上的暫停和恢復方法進行此操作)是否有更好的替代方法?
不要在流中使用.on('data')
,而應使用.on('readable')
。 准備好后,才從流中讀取。 我還建議使用轉換流按行讀取 。
我可以執行所有可能的優化,以使其比此更快。 我知道與gc相關的配置,可以防止應用程序頻繁停頓。
如果不仔細分析代碼,這是不可能回答的。 閱讀有關Node.js及其內部原理的更多信息。 如果您花一些時間在此上,那么適合您的優化將變得清晰。
是否建議使用“集群”模塊? 它可以無縫工作嗎?
僅當您無法充分利用硬件時才需要這樣做。 不清楚“無縫”是什么意思,但是就OS而言,每個進程都是其自己的進程,因此我不稱其為“無縫”。
默認情況下,節點對所有http請求都使用一個套接字池,默認的全局限制是每台主機5個並發連接(但是這些連接被重新用於保持連接)。 有幾種方法可以解決此限制:
創建您自己的http.Agent並在您的http請求中指定它:
var agent = new http.Agent({maxSockets: 1000}); http.request({ // ... agent: agent }, function(res) { });
更改全局/默認http.Agent限制:
http.globalAgent.maxSockets = 1000;
完全禁用請求的池/連接重用:
http.request({ // ... agent: false }, function(res) { });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.