繁体   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