Amazon EC2上的Node.js的CPU利用率

看看节点是如何进行单线程的,如果我有一台运行在具有4个EC2 Compute单元的亚马逊EC2实例上的节点服务器,它的运行速度是否会比使用2个EC2计算单元更快?

亚马逊的CPU利用率是否需要一个程序来multithreading来充分利用所有资源?

你的问题的简短答案是,如果你所做的只是编写“标准的”单线程JavaScript(你将被一个CPU绑定),那么添加更多的核心来提高你的节点性能将不起作用。

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

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

有一个警告,在EC2计算单位详细每个实例 。 对于某些情况,您可以为每个虚拟核心获得更多的“计算单位”。 因此,如果select每个虚拟内核具有2个计算单元的实例,而每个内核具有一个 计算单元的实例,则可以在具有更多计算单元的CPU上执行节点。 但是,看起来像是在2个计算单元之后,计算能力被拆分为每个核心 ,这意味着您不会从多个核心获得任何好处。

要充分利用N个内核的计算资源,至less需要N个线程来做有用的工作。 这与EC2无关; 这只是电脑工作的方式。 我从你的问题中假设你正在m1.mediumm1.large实例types之间进行select,它们分别有1个和2个专用核心( m1.small是共享核心的一半,而m1.xlarge是满的专用4芯盒)。 因此,为了利用更大的盒子(除非你只想访问更多的内存/ io),你至less需要2个进程才能做有用的工作。

每个Node.js进程都是单线程的。 这让它提供了一个没有locking语义的干净的编程范例。 这是非常devise。

对于一个Node.js应用程序来利用多个核心,它必须产生多个进程。 然后,这些进程将使用某种forms的消息传递(pipe道,套接字等)来进行通信 – 与“共享内存”相比,代码可以直接将多个进程可见的内存位​​置变为可能需要locking语义的内存位置。

在实践中,这是简单易行的设置。 回到Node.JS v0.6.X中,“集群”模块被集成到标准发行版中,可以很容易地设置多个节点工作人员,可以监听单个端口。 请注意,这个“集群”模块不同于具有不同API并在NPMjsregistry中拥有“集群”名称的learnboost“集群”模块。

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); } 

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

Amazon列出了每个实例types具有多less个虚拟核心:

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

你最好的select是使用其他人指出的所有内核。 但是,如果最终使用单线程解决scheme,那么您将需要关注单个内核的速度,而不是将所有内核的总计EC2计算单元加在一起。

如果我的节点服务器运行在具有4个EC2 Compute单元的亚马逊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利用率是否需要一个程序来multithreading来充分利用所有资源?

是的,正确configuration的Apache / Nginx将利用多CPUconfiguration。 正在开发的 node.js服务器也将利用这些configuration。

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

好处是在服务器的情况下,你有一个非常快的线程,可以处理成千上万的并发请求,而不会完全搁置或为每个客户端请求 – 响应周期产生一个操作系统线程。

更重要的是,您应该在EC2上testing您的特定用例 – 如果应用程序执行了大量IO,那么运行单个节点实例时,多个处理器可能会非常有用。