簡體   English   中英

Amazon EC2上Node.js的CPU利用率

[英]CPU utilization of Node.js on Amazon EC2

看看節點是如何單線程的,如果我在具有4個EC2計算單元的亞馬遜EC2實例上運行節點服務器,它將比我有2個EC2計算單元運行更快/處理更多負載嗎?

亞馬遜的CPU利用率是否需要多線程程序才能完全使用所有資源?

要充分利用N個核心的計算資源,您至少需要N個線程才能完成有用的工作。 這與EC2無關; 這就是計算機的工作方式。 我假設您在m1.mediumm1.large實例類型之間進行選擇,它們分別具有1個和2個專用內核( m1.small是共享內核的一半, m1.xlarge是完整的專用4芯盒)。 因此,您需要至少2個進程執行有用的工作才能使用更大的框(除非您只是想訪問更多的內存/ io)。

每個Node.js進程都是單線程設計。 這使它提供了一個沒有鎖定語義的干凈編程范例。 這非常符合設計。

要使Node.js應用程序使用多個核心,它必須生成多個進程。 然后,這些進程將使用某種形式的消息傳遞(管道,套接字等)進行通信 - 而不是“共享內存”,其中代碼可以直接改變多個進程可見的內存位​​置,這需要鎖定語義。

在實踐中,這很容易設置。 回到Node.JS v0.6.X中,“集群”模塊已集成到標准發行版中,從而可以輕松設置可以在單個端口上偵聽的多個節點工作程序。 請注意,此“群集”模塊與learnboost“群集”模塊不同,后者具有不同的API並且在NPMjs注冊表中擁有“群集”名稱。

http://nodejs.org/docs/latest/api/cluster.html

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  http.Server(function(req, res) { ... }).listen(8000);
}

對你的問題的簡短回答是,如果你所做的只是編寫“標准”單線程javascript(你將受到單個CPU的約束),添加更多內核以提高你的節點性能是行不通的。

原因是node.js使用事件循環進行處理,所以如果你所做的只是啟動一個沒有任何其他東西的node.js進程,它就不會是多線程的,因此不會使用多個CPU(核心) )。

但是 ,您可以使用node.js群集API來分叉節點進程,以便您可以利用多個CPU(核心): https//nodejs.org/docs/latest/api/cluster.html 如果您以這種方式編寫代碼,那么擁有更多計算單元將對您有所幫助。

有一點需要注意,EC2計算單元是按實例詳細說明的。 對於某些情況,您可以為每個虛擬核心獲得更多“計算單位”。 因此,如果您選擇每個虛擬核心具有2個計算單元的實例而不是每個核心具有一個 計算單元的實例,則您將能夠在具有更多計算單元的CPU上執行節點。 但是,看起來在2個計算單元之后, 每個核心的計算能力被分割這意味着您將無法從多個核心中獲得任何好處。

亞馬遜對實例類型的總“EC2計算單元”的概念不直接映射到CPU或核心。 它是核心數量乘以EC2計算單位中每個核心的速度(它們自己的相對測量值)。

亞馬遜確實列出了每種實例類型具有的虛擬核心數:

http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html?instance-types.html

您最好的選擇是使用所有核心,正如其他人指出的那樣。 但是,如果您最終使用單線程解決方案,那么您將需要關注單個核心的速度,而不是所有核心的EC2計算單元總數。

如果我在具有4個EC2計算單元的亞馬遜EC2實例上運行節點服務器,它將比我有2個EC2計算單元運行更快/處理更多負載嗎?

不,如果您在服務器容量中使用node.js,則只能訪問單個核心。

var http = require('http');
    http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');

產生一個單一的監聽器,但這並不意味着只有一個連接。 Node.js以這種方式打破了傳統思維。 除非您編碼不正確,否則事件循環不會阻止連接。 這篇文章有助於解釋事件循環以及理解它的重要性。 花了一些時間來真正“理解”這些含義。

亞馬遜的CPU利用率是否需要多線程程序才能完全使用所有資源?

是的,正確配置的apache / nginx將利用多CPU配置。 正在開發 node.js服務器,它們也將利用這些配置。

在Node.js中, 您的代碼是單線程的,但是例如訪問文件系統或數據庫服務器的調用不使用主node.js線程。 主線程繼續執行,而其他線程正在等待4GB從磁盤讀取到RAM或DB服務器返回響應。 一旦操作完成,提供的回調就被放入隊列中以在主線程中執行。 或多或少,無論如何。

優點是在服務器情況下,您有一個非常快的線程,可以處理數千個並發請求,而不會完全保留任何一個請求或為每個客戶端請求 - 響應周期生成OS線程。

更重要的是,您應該在EC2上對特定用例進行基准測試 - 如果應用程序執行大量IO,則在運行單個節點實例時,多個處理器可能很有用。

暫無
暫無

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

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