簡體   English   中英

涉及HTTP調用的Node.js性能優化

[英]Node.js performance optimization involving HTTP calls

我有一個Node.js應用程序,該應用程序打開一個文件,掃描每一行,並進行涉及Couchbase的REST調用。 文件中的平均行數約為12至1300萬。 目前,沒有任何特殊設置,我的應用程序可以在約24分鍾內完全處理約100萬條記錄。 我經歷了很多問題,文章和Node文檔,但找不到有關以下內容的任何信息:

  1. 節點可以同時打開X個http連接/套接字的設置在哪里? 我可以更改它嗎?
  2. 我必須規范文件處理,因為文件讀取比REST調用快得多,因此過一會兒有太多打開的REST請求,並且阻塞了系統,並且內存不足。所以現在我讀了1000行為REST調用完成這些操作,然后恢復它(我正在使用流上的暫停和恢復方法進行此操作)是否有更好的替代方法?
  3. 我可以執行所有可能的優化,以使其比此更快。 我知道與gc相關的配置,可以防止應用程序頻繁停頓。
  4. 是否建議使用“集群”模塊? 它可以無縫工作嗎?

背景:我們有一個現有的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=1000http : //nodejs.org/api/http.html#http_agent_maxsockets

我必須規范文件處理,因為文件讀取比REST調用快得多,因此過一會兒有太多打開的REST請求,並且阻塞了系統,並且內存不足。所以現在我讀了1000行為REST調用完成這些操作,然后恢復它(我正在使用流上的暫停和恢復方法進行此操作)是否有更好的替代方法?

不要在流中使用.on('data') ,而應使用.on('readable') 准備好后,才從流中讀取。 我還建議使用轉換流按行讀取

我可以執行所有可能的優化,以使其比此更快。 我知道與gc相關的配置,可以防止應用程序頻繁停頓。

如果不仔細分析代碼,這是不可能回答的。 閱讀有關Node.js及其內部原理的更多信息。 如果您花一些時間在此上,那么適合您的優化將變得清晰。

是否建議使用“集群”模塊? 它可以無縫工作嗎?

僅當您無法充分利用硬件時才需要這樣做。 不清楚“無縫”是什么意思,但是就OS而言,每個進程都是其自己的進程,因此我不稱其為“無縫”。

默認情況下,節點對所有http請求都使用一個套接字池,默認的全局限制是每台主機5個並發連接(但是這些連接被重新用於保持連接)。 有幾種方法可以解決此限制:

  1. 創建您自己的http.Agent並在您的http請求中指定它:

     var agent = new http.Agent({maxSockets: 1000}); http.request({ // ... agent: agent }, function(res) { }); 
  2. 更改全局/默認http.Agent限制:

     http.globalAgent.maxSockets = 1000; 
  3. 完全禁用請求的池/連接重用:

     http.request({ // ... agent: false }, function(res) { }); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM