Amazon EC2上Node.js的CPU利用率

时间:2011-09-21 15:08:45

标签: node.js amazon-ec2

看看节点是如何单线程的,如果我在具有4个EC2计算单元的亚马逊EC2实例上运行节点服务器,它将比我有2个EC2计算单元运行更快/处理更多负载?

亚马逊的CPU利用率是否需要多线程程序才能完全使用所有资源?

5 个答案:

答案 0 :(得分:18)

要充分利用N核的计算资源,您至少需要N个线程才能完成有用的工作。这与EC2无关;它只是计算机的工作方式。我假设您在m1.mediumm1.large实例类型之间进行选择,它们分别具有1个和2个专用核心(m1.small是共享核心的一半,并且m1.xlarge是完整的专用4核盒子。因此,您需要至少2个进程执行有用的工作才能使用更大的框(除非您只是想访问更多的内存/ io)。

每个Node.js进程都是单线程设计。这使它可以提供一个没有锁定语义的干净编程范例。这非常符合设计。

对于Node.js应用程序使用多个核心,它必须产生多个进程。这些进程将使用某种形式的消息传递(管道,套接字等)进行通信 - 而不是&# 34;共享内存"代码可以直接改变多个进程可见的内存位​​置,这需要锁定语义。

在实践中,这很容易设置。回到Node.JS v0.6.X" cluster"模块已集成到标准分发中,可以轻松设置可以在单个端口上侦听的多个节点工作程序。注意这个"集群"模块与learnboost" cluster"不同。模块具有不同的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);
}

答案 1 :(得分:12)

对于您的问题的简短回答是,如果您所做的只是编写“标准”单线程javascript(您将受到单个CPU的约束),则添加更多内核以提高节点性能是行不通的。

原因是node.js使用事件循环进行处理,所以如果您正在做的只是启动单个node.js进程而没有其他任何东西,它将不是多线程的,因此不会使用多个CPU(核心)。

但是,您可以使用node.js群集API来分叉节点进程,以便您可以利用多个CPU(核心):https://nodejs.org/docs/latest/api/cluster.html。如果您以这种方式编写代码,那么拥有更多计算单元将对您有所帮助。

有一点需要注意,EC2计算单元详细per instance。对于某些情况,您可以为每个虚拟核心获得更多“计算单位”。因此,如果您选择每个虚拟核心 2个计算单元的实例与每个核心一个的实例>,则可以在具有更多计算量的CPU上执行节点单位。但是,看起来在2个计算单元之后,计算能力被分割为每个核心,这意味着您将无法从多个核心中获得任何好处。

答案 2 :(得分:5)

亚马逊的实例类型的“EC2计算单元”总数概念不直接映射到CPU或核心。它是核心数量乘以EC2计算单位中每个核心的速度(它们自己的相对测量值)。

亚马逊确实列出了每个实例类型有多少个虚拟核心:

  

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

您最好的选择是使用所有核心,因为其他人指出。但是,如果您最终使用单线程解决方案,那么您将需要关注单个核心的速度,而不是所有核心的EC2计算单元总数。

答案 3 :(得分:2)

  

如果我在具有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以这种方式打破了传统思维。除非您编码不正确,否则事件循环不会阻止连接。 This post有助于解释事件循环以及理解它的重要性。我花了一段时间才真正得到了&#39;影响。

  

亚马逊的CPU利用率是否需要多线程程序才能完全使用所有资源?

是的,正确配置的apache / nginx将利用多CPU配置。 node.js服务器正在developed,它们也将利用这些配置。

答案 4 :(得分:2)

在Node.js中,您的代码是单线程的,但调用例如访问文件系统或数据库服务器不使用主node.js线程。主线程继续执行,而其他线程正在等待4GB从磁盘读取到RAM或DB服务器返回响应。一旦操作完成,提供的回调就被放入队列中以在主线程中执行。或多或少,无论如何。

优点是在服务器情况下,您有一个非常快的线程,可以处理数千个并发请求,而不会完全保留任何一个或为每个客户端请求 - 响应周期生成OS线程。

更重要的是,您应该在EC2上对特定用例进行基准测试 - 如果应用程序执行大量IO,则在运行单个节点实例时,多个处理器可能很有用。